Seite 1 von 1
Frage zu Sql...
Verfasst: 22. Juli 2009 13:41
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
Verfasst: 22. Juli 2009 13:48
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...
Verfasst: 22. Juli 2009 14:04
von Christian81
Oder einfach mal die Doku lesen ->
http://doc.trolltech.com/4.4/qsqlquery. ... stInsertId und hoffen das SQLite das unterstützt...
Verfasst: 22. Juli 2009 14:15
von RobRoy1304
danke Leute, hab die Methode in der Doku übersehen.

Verfasst: 22. Dezember 2009 21:53
von Al_
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.
Verfasst: 22. Dezember 2009 21:56
von upsala
Code: Alles auswählen
begin;
insert into blabla...;
select max(id) from blabla;
commit;
Verfasst: 23. Dezember 2009 08:03
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?
Verfasst: 23. Dezember 2009 09:10
von upsala
Es gibt dafür keine portable Lösung. Im Zweifelsfalle ist für jeden verwendeten Datenbank-Treiber eine angepasste Funktion zu schreiben.
Verfasst: 23. Dezember 2009 17:51
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).