Bonjour,
En regardant l'exemple 'drug' il est indiqué que les id devraient être mis à jour. Ce n'est pas le cas pour moi avec PostgreSQL. Je passe en debug et les id ne sont pas modifiés.
Quelqu'un a déjà eu ce souci ?
Merci beaucoup,
Ludovic
Bonjour,
En regardant l'exemple 'drug' il est indiqué que les id devraient être mis à jour. Ce n'est pas le cas pour moi avec PostgreSQL. Je passe en debug et les id ne sont pas modifiés.
Quelqu'un a déjà eu ce souci ?
Merci beaucoup,
Ludovic
J'ai essayé avec dao::save et j'ai le même comportement. J'ai suivi le site espagnol qui présente des exemples avec postgresql.
Sql de création de la table:
Et le code de main.cpp (rien changé au reste de l'exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 DROP TABLE if exists drug; CREATE SEQUENCE drug_seq; CREATE TABLE drug ( id int DEFAULT NEXTVAL('drug_seq') NOT NULL, "name" character(100), descrip character(100), PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE drug OWNER TO postgres;
l'enregistrement s'ajoute bien à la base mais l'id n'est pas retourné et le cout affiche 'id=0'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 // Init parameters to communicate with a database qx::QxSqlDatabase::getSingleton()->setDriverName("QPSQL"); qx::QxSqlDatabase::getSingleton()->setDatabaseName("ctArmor"); qx::QxSqlDatabase::getSingleton()->setHostName("localhost"); qx::QxSqlDatabase::getSingleton()->setUserName("postgres"); qx::QxSqlDatabase::getSingleton()->setPassword("postgres"); qx::QxSqlDatabase::getSingleton()->setPort(5432); drug_ptr d1; d1.reset(new drug()); d1->name = "name1"; d1->description = "desc1"; QSqlError daoError = qx::dao::save(d1); cout << "d1 id = " << d1->id << "\n";
Merci,
Ludovic
QxOrm utilise le moteur QtSql de Qt pour communiquer avec la base de données. Si tu lis la documentation fournie par Qt concernant la méthode lastInsertId(), tu verras que pour PostgreSQL, c'est un cas bien particulier (cf. la documentation ici : http://qt.developpez.com/doc/latest/.../#lastinsertid).
Donc dans le cas de PostgreSQL, la méthode Qt lastInsertId() renvoie l'OID (identifiant global géré par PostgreSQL), et non l'ID dans la table.
Vu que tu as créé ta table drug avec WITH (OIDS=FALSE);, c'est normal que lastInsertId() renvoie 0.
J'ai corrigé ce comportement avec PostgreSQL pour la prochaine version de QxOrm (QxOrm 1.2.2) en utilisant le mot-clé RETURNING spécifique à PostgreSQL et permettant de récupérer l'ID qui vient d'être inséré en base (et non l'OID).
Tu peux télécharger la dernière version BETA de QxOrm 1.2.2 ici pour profiter de cette évolution :
http://www.qxorm.com/version/QxOrm_1.2.2_BETA_17.zip
Normalement la version ci-dessus sera la version finale de la 1.2.2 (il reste uniquement la documentation à générer), j'attends juste une confirmation du bon fonctionnement sur Mac OS X pour la sortir officiellement.
Tu peux donc la télécharger et l'utiliser sans soucis, et tu profiteras du mot-clé RETURNING pour récupérer l'ID qui vient d'être inséré en base de données
Remarque : pour plus d'infos sur les nouveautés de la 1.2.2, il y a un topic ici : http://www.developpez.net/forums/d11...idator-tester/
Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).
Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
Tutoriel qxBlog : gestion de blogs en C++/Qt.
Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager