Bonjour!

J'ai hésité quant au forum où poster, mais je pense que j'ai besoin des lumières des afficionados de Firebird.
Je rencontre un petit... enfin non, un gros problème dans le développement d'une application utilisant Firebird (2.1).

Mon souci : insérer des données en chaine dans la base de données. La "requête suivante" doit utiliser l'identifiant inséré par la requête précédente, etc.

Voici un code très simplifié de ce que je cherche à faire (je développe en C++ avec Qt mais c'est compréhensible pour la plupart des développeurs).
Le souci, à l'issue de l'exécution de ce code, c'est que les données n'ont été insérées que dans la première table, les deux suivantes ne sont pas touchées :
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
16
17
18
19
20
21
 
QSqlQuery query;
        query.exec("INSERT INTO parking (idparking) VALUES (null) 
                         RETURNING idparking;");
        query.next();
        QString idParking = query.value(0).toString();
        // affiche : "2" (par exemple)
        qDebug() << "idParking " << idParking;
 
        query.exec("INSERT INTO voiture (idvoiture, fk_idparking) 
                         VALUES (null, "+ idParking +") RETURNING idvoiture;");
        query.next();
        QString idVoiture = query.value(0).toString();
        // affiche : "16" (par exemple)
        qDebug() << "idVoiture " << idVoiture; 
 
        query.exec("INSERT INTO option(idoption, fk_idvoiture) 
                         VALUES (null, "+idVoiture+") RETURNING idoption;");
        query.next();
        // affiche : ""
        qDebug() << "idOption " << query.value(0).toString();
Et j'obtiens comme message d'erreur :
QSqlQuery::value: not positioned on a valid record

Si je place un point d'arrêt juste avant la troisième requête, je peux constater que ma table "parking" a été modifiée, mais ma table "voiture", elle, n'a pas été modifiée. Donc la seconde requête est effectuée et me renvoie un résultat... mais il n'est pas inscrit dans la base de données!

Je suppose que mon souci vient du fonctionnement interne de Firebird, mais... j'y comprend rien.
Si quelqu'un pouvait m'expliquer ce qui se trame là, et mieux encore m'expliquer la marche à suivre je lui en serait très reconnaissant !
Je voudrais pouvoir placer toutes mes requêtes au sein d'une transaction...

Merci.