Frage zu Sql...

Alles rund um die Programmierung mit Qt
Antworten
RobRoy1304
Beiträge: 47
Registriert: 9. Juli 2009 10:56

Frage zu Sql...

Beitrag von RobRoy1304 »

Hallo Leute,

ich habe eine Tabelle in einer Sqlite-Datenbank die die Spalte 'id' autoinkrementiert.
Wenn ich nun einen neuen Datensatz einfüge, brauche ich diese
'id'.
Meine Frage daher, wie greife ich auf den als letztes hinzugefügten Datensatz zu, um die id auszulesen???

Code: Alles auswählen

int CDbInterface::add_waregroup(CWaregroup & wg)
{
    if(!m_bIsConnect)//db open?
        return -1;
    int id=-1;
    QString s=QString("INSERT INTO waregroup (name,comment,parent_id) VALUES ('%1','%2',").arg(wg.get_name(),wg.get_comment());
    QString s2=QString("%1)").arg(wg.get_parent_id());
    s+=s2;
    QSqlQuery query;
    if(query.exec(s))//ok?
    {
        QSqlRecord record=query.record();
        id=query.value( record.indexOf("id")).toInt();//kommt nur 0 !?!
    }
    return id;
}
thx
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Beitrag von DarkWotan »

Dein INSERT liefert keine Datensätze zurück, deswegen steht da NULL.
Wie wäre es mit einem anschließenden SELECT MAX(id) FROM waregroup?

Nebenbei finde ich auto_increment sowieso nicht besonders toll...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Oder einfach mal die Doku lesen -> http://doc.trolltech.com/4.4/qsqlquery. ... stInsertId und hoffen das SQLite das unterstützt...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RobRoy1304
Beiträge: 47
Registriert: 9. Juli 2009 10:56

Beitrag von RobRoy1304 »

danke Leute, hab die Methode in der Doku übersehen. :oops:
Al_
Beiträge: 17
Registriert: 10. Januar 2009 15:27
Wohnort: Schweiz

Beitrag von Al_ »

Christian81 hat geschrieben:Oder einfach mal die Doku lesen -> http://doc.trolltech.com/4.4/qsqlquery. ... stInsertId und hoffen das SQLite das unterstützt...
Und bei anderen Datenbanken / Treiber, welche lastinsertId nicht unterstützen (wie beispielsweise bei ODBC der Fall)? Wie bekommt man dann die ID zurück? Einen Null-Variant als QSql:InOut oder als QSql:Out Parameter zu übergeben habe ich auch schon versucht (in der Hoffnung, die Datenbank fülle dann den richtigen, neuen ID Wert ein), leider erfolglos. Und einfach max(ID)+1 geht auch nicht, da die ID nicht zwingend aufsteigend sortiert vergeben werden.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

begin;
insert into blabla...;
select max(id) from blabla;
commit;
Al_
Beiträge: 17
Registriert: 10. Januar 2009 15:27
Wohnort: Schweiz

Beitrag von Al_ »

upsala hat geschrieben:

Code: Alles auswählen

begin;
insert into blabla...;
select max(id) from blabla;
commit;
max(id) funktioniert nicht zuverlässig. Beispiele: in SQLite kann eine Tabelle so aufgesetzt sein, dass auch eine ID zwischendrin verwendet wird ('Löcher' in der ID Reihe, entstanden durch zwischenzeitlich gelöschte Records); bei SQLite könnte stattdessen lastInsertId verwendet werden, was eine SqlDriver abhängige, nicht portable Lösung darstellt. Zweites Beispiel: in MS Access kann ein Feld statt autoincrement als random gesetzt werden; dies ist zwingend notwendig, um Synchonisierung verwenden zu können; und lastInsertId wird von ODBC nicht unterstützt.

Kennt jemand eine zuverlässigere Lösung?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Es gibt dafür keine portable Lösung. Im Zweifelsfalle ist für jeden verwendeten Datenbank-Treiber eine angepasste Funktion zu schreiben.
Al_
Beiträge: 17
Registriert: 10. Januar 2009 15:27
Wohnort: Schweiz

Beitrag von Al_ »

upsala hat geschrieben:Es gibt dafür keine portable Lösung. Im Zweifelsfalle ist für jeden verwendeten Datenbank-Treiber eine angepasste Funktion zu schreiben.
Dann werde ich nicht um Treiber-abhängige Optionen herum kommen. Im englischen Qt Forum wurde mir übrigens für ODBC / Jet Datenbanken (also Access) das SQL Statement SELECT @@identity empfohlen; funktioniert gut (siehe http://www.qtcentre.org/forum/f-qt-prog ... post127382).
Antworten