2009-02-10 9 views
9

Ich habe eine Tabelle in SQLite:, wie der Wert von AUTOINkREMENT Spalt in SQLite zurück mit VB6

CREATE TABLE "EventType" 
(
[EventTypeID] INTEGER PRIMARY KEY, 
[EventTypeName] VARCHAR(50) NOT NULL UNIQUE 
); 

Da EventTypeID eine ganze Zahl ist und ein Primärschlüssel, das macht es automatisch eine automatisch inkrementierende Spalte, und das funktioniert gut.

Ich möchte eine Zeile in die Tabelle einfügen und den neu inkrementierten Wert von VB6 abrufen.

Dim oRs as Recordset 
dim oCmd as new Command 

oCmd.ActiveConnection = GetConnection() 
oCmd.Source = "insert into EventType (EventTypeName) values ('blah')" 
oCmd.Execute 

Gibt es eine automatische Art und Weise die neu erstellte EventTypeID abrufen, ohne eine weitere Abfrage zur Ausgabe mit (wählen Sie max (EventTypeID) von Eventtype))?

Ich erinnere mich an VB6 Tage vor langer Zeit, dass es einen Weg gab, das zu tun.

+0

Mögliche Duplikat [? Ist SQLite Unterstützung SCOPE \ _IDENTITY] (http://stackoverflow.com/questions/304543/does-sqlite-support-scope-identity) –

Antwort

14

Does SQLite support SCOPE_IDENTITY?

Überprüfen Sie die FAQ aus. Die sqlite3_last_insert_rowid() Funktion wird es tun. Vorsicht vor Triggern, obwohl

Nicht getestet, aber Sie sollten beide Anweisungen in einem Anruf senden können. Es ist eine Weile her, seit ich irgendeine VB6 geschrieben habe. Auch dies ist nicht SQL Injection Safe.

Dim oRs as Recordset 
dim sSql as String 
sSql = "INSERT INTO EventType (EventTypeName) VALUES ('blah'); SELECT last_insert_rowid() FROM EventType" 
oRs.Open sSql oConn 
+4

übrigens, mit dem ODBC-Treiber müssen Sie Ihre Abfrage in 2 Aufrufe aufteilen. – AngryHacker

+0

Also was macht Insert() dann zurück? - Ich weiß, dass ich es nachschlagen kann, aber hier könnte es der Vollständigkeit halber nützlich sein, denn so habe ich diesen Beitrag gefunden. –

2

Ich benutze VB nicht, so dass ich weiß nicht, die Schnittstelle, die Sie mit Ihrer Datenbank verwenden, aber, wie bendewey sagte, gibt es eine Funktion in der C-API sqlite3_last_insert_rowid() aufgerufen, die zurückkehren Primärer Integerschlüssel für die zuletzt eingefügte Zeile, sodass Sie in Ihrer Schnittstelle nach einer ähnlichen Funktion suchen können.

Wenn das nicht funktioniert, Sie die SQLite-spezifische Abfrage verwenden können:

SELECT last_insert_rowid() 
2

Sie rufen SELECT last_insert_rowid() nach dem Einsatz kann

0

Wenn Verwendung

SELECT last_insert_rowid() 

gibt den letzten rowid, können Sie verwenden:

SELECT last_insert_rowid() AS rowid FROM table_name LIMIT 1 

für erhalten die letzte rowid für eine einzelne Tabelle

+1

Das ist nicht was die [Dokumentation] (https://www.sqlite.org/lang_corefunc.html#last_insert_rowid) sagt: "Die SQL-Funktion last_insert_rowid() ist ein Wrapper um die sqlite3_last_insert_rowid() C/C++ - Schnittstellenfunktion." Das bedeutet, dass es für eine einzelne Tabelle keine letzte Zeile gibt. –

3

Führen diese Abfrage innerhalb des Codes:

SELECT SEQ from sqlite_sequence WHERE name='tablename'