IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

QxOrm Discussion :

dao:insert ne modifie pas l'identifiant avec PostgreSQL ?


Sujet :

QxOrm

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut dao:insert ne modifie pas l'identifiant avec PostgreSQL ?
    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

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    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:
    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;
    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
     
       // 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";
    l'enregistrement s'ajoute bien à la base mais l'id n'est pas retourné et le cout affiche 'id=0'.

    Merci,

    Ludovic

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/08/2011, 16h38
  2. [AC-2010] Insert Into erreur "ODBC --Call Failed" avec un champ sql server Identify
    Par jayjazz dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/05/2011, 13h17
  3. Réponses: 1
    Dernier message: 17/04/2011, 16h30
  4. Pb avec un tableau, insert ne fonctionne pas mais requete OK.
    Par franco14 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2010, 11h31
  5. Réponses: 2
    Dernier message: 01/07/2008, 21h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo