Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Jelix 1.1 - PDO MSSQL Server 2000

Posted by Yann.L on 12/29/2008 17:11

Bonjour,

je fais en ce moment des tests de la nouvelle version de Jelix, et je dois impérativement me servir d'une base de données MSSQL Server 2000. Or avec Jelix 1.1, lorsque je tente de creer une DAO, j'ai droit a:

 Error: le driver "mssql" pour jDb est introuvable

donc j'ai tenter par odbc

 Error: le driver "odbc pour jDb est introuvale

Voici la configuration de mon dbprofil.ini.php pour mssql :

 [mabase]
 ; For pdo :
 driver=pdo
 dsn="mssql:host=192.168.0.xxx;dbname=mabase"
 user="monlogin"
 password="monpass"

et pour odbc:

 [mabase]
 ; For pdo :
 driver=pdo
 dsn="odbc:host=192.168.0.xxx;dbname=mabase"
 user="monlogin"
 password="monpass"

Je tiens a préciser que j'ai bien

 default = mabase

Ma question est y a-t-il un bug ? J'ai oublié qqch ? ou dois-je écrire un driver pour mssql ?

Merci, bon dev.

  [Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000

Reply #1 Posted by Zeffyr on 12/29/2008 17:26

Salut,

Sur la doc: http://fr.php.net/manual/fr/ref.pdo-dblib.connection.php ils parlent de 3 drivers: mssql, sybase, dblib

  [Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000

Reply #2 Posted by Yann.L on 12/29/2008 18:02

Salut Zeffyr,

Effectivement il parle de trois driver, j'ai testé avec sybase et dblib et j'ai droit à la même erreur :x

  [Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000

Reply #3 Posted by Yann.L on 12/29/2008 19:11

Je n'ai aussi aucun problème avec MySQL, c'est seulement avec MSSQL Server 2000 et PDO, sinon en natif avec mssql_connect() ou mssql_pconnect() cela fonctionne.

Demain matin je linkerai mon php.ini

++ et merci

  [Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000

Reply #4 Posted by Yann.L on 12/30/2008 09:49

Voila mon php.ini

PHP.INI

  [Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000

Reply #5 Posted by Yann.L on 12/30/2008 17:49

Vu que je ne trouve pas la solution j'ai entrepris d'écrire un drivers mssql pour jDb. Mais quand je tente de créer une DAO avec le script jelix, j'ai un droit a un :

 Error: The table has no primary keys. A dao needs a primary key on the table to be defined.

Or dans ma base de donnée ma table a bien une clé primaire. Je pense que mon problème vient de la méthode _getFieldList() de la classe mssqlDbTools. Voilà comment j'ai implémenté la méthode _getFieldList() :

   /**
    * récupére la liste des champs d'une table pour une base donnée.
    * @return   array    $tab[NomDuChamp] = obj avec prop (type, length, lengthVar, notnull)
    */
    function _getFieldList ($tableName){
        $results = array ();
        
        $pkeys = array();
        // get primary keys informations
        $rs = $this->_connector->query('EXEC sp_pkeys ' . $tableName);
        while ($line = $rs->fetch()){
            $pkeys[] = $line->COLUMN_NAME;
        }
        
        // get table informations
        unset($line);
        $rs = $this->_connector->query ('EXEC sp_columns ' . $tableName);
        while ($line = $rs->fetch ()){
            $field = new jDbFieldProperties();
            
            $field->type = $line->DATA_TYPE;
            if ($field->type == 'varchar'){
                $field->length = $line->CHARACTER_OCTET_LENGTH;
            }
            if ($field->type == 'int identity'){
                $field->type = 'int';
                $field->autoIncrement = 'auto_increment';
            }
            
            $field->name = $line->COLUMN_NAME;
            $field->notNull = ($line->IS_NULLABLE == 'No');
            
            if(in_array($field->name, $pkeys)){
                $field->primary = true;
            }
             
            $field->hasDefault = '';
            $field->default = '';
            
            $results[$line->COLUMN_NAME] = $field;
        }
        return $results;
    }

sp_columns et sp_pkeys sont des procédures stockées système de MS SQL Server 2000.

Je ne vois pas quelle valeur je dois donner a $field->primary pour que Jelix sache que ma table a bien une clé primaire.

vous pouvez télécharger les sources ici => mssql.tar.gz

  [Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000

Reply #6 Posted by Yann.L on 12/30/2008 19:14

Après avoir lu entièrement la doc pour faire un driver pour jDb j'ai lu ça :

 Classe génératrice de requêtes SQL ¶
 
 Cette classe est utilisée par jDao. En effet, jDao génère des classes PHP  avec des requêtes “en dur” dans leurs méthodes. Ces requêtes pouvant être  différentes d'une base à une autre (au niveau de la syntaxe), il est possible  de les définir dans le driver.
 
 La classe doit hériter de jDaoGenerator et redéfinir une ou plusieurs de ces  méthodes :
 
     *
       genSelectPattern()
     *
       _encloseName()
     *
       genUpdateAutoIncrementPK()
     *
       $propertiesListForInsert
     *
       $trueValue, $falseValue
     *
       _getAutoIncrementPKField()
 
 Voir la référence de jDaoGenerator pour plus de détails.

Je pense que mon problème vient plutôt de là :D

  [Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000

Reply #7 Posted by laurentj on 12/30/2008 21:23

Salut,

Je confirme, il faut faire un driver. Pas forcément un driver "complet", mais au moins les classes qu'il faut pour le générateur de code de jDao.

Je serais heureux d'inclure ta contribution dans Jelix :-) ouvre un ticket sur developer.jelix.org et propose ton patch.

  [Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000

Reply #8 Posted by Yann.L on 12/31/2008 12:01

Salut Laurent et merci pour l'info, je serais très heureux que mon travail soit intégrer à Jelix :D

EDIT : oublier ce que je viens d'écrire mon probléme vient bien de ma méthode _getFieldList().

  function _getFieldList ($tableName){
        $results = array ();
        
        $pkeys = array();
        // get primary keys informations
        $rs = $this->_connector->query('EXEC sp_pkeys ' . $tableName);
        while ($line = $rs->fetch()){
            $pkeys[] = $line->COLUMN_NAME;
        }
        print_r($pkeys);
        // get table informations
        unset($line);
        $rs = $this->_connector->query ('EXEC sp_columns ' . $tableName);
        while ($line = $rs->fetch ()){
            $field = new jDbFieldProperties();
            $field->name = $line->COLUMN_NAME;
            $field->type = $line->DATA_TYPE;
            if ($field->type == 'varchar'){
                $field->length = $line->CHARACTER_OCTET_LENGTH;
            }
            if ($field->type == 'int identity'){
                $field->type = 'int';
                $field->autoIncrement = true;
            }
            if ($line->IS_NULLABLE == 'No'){
                $field->notNull = false;
            }
            $field->hasDefault = false;
            $field->default = '';
            if(in_array($field->name, $pkeys)){
                $field->primary = true;
            }
            $results[$line->COLUMN_NAME] = $field;
        }
        print_r($results);
        return $results;
    }

Le problème c'est que le print_r() de $results m'indique bien une primary key de ma table (valeur à 1 (true)), or Jelix-script me dit qu'il n'y a pas de clef primaire, je comprend pas trop la :x

Merci.

EDIT2 : J'ai trouvé mon problème vient de la ligne :

  $field->type = $line->DATA_TYPE;

Il faut la remplacer par :

  $field->type = $line->TYPE_NAME;

En effet DATA_TYPE, retourne l'ID du TYPE et nom le NOM.

 
Page
  1. Jelix 1.1 - PDO MSSQL Server 2000