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???
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.
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.
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).