- 1
[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
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
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
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
[Opened] Re: Jelix 1.1 - PDO MSSQL Server 2000
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
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
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
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.
- 1