2010-12-13 27 views
6

Ich benutze VB.NET mit einer Access-Datenbank, ich füge Werte ein, aber dann muss ich die letzte eingefügte ID (Auto-Nummer) bekommen und diese in eine verwandte Tabelle einfügen.vb.net sql zuletzt eingefügt ID

Ich habe versucht @@ IDENTITY und MAX (Spalte) aber @@ IDENTITY gibt Null und MAX ist nicht sehr zuverlässig (manchmal langsam, um Daten einzufügen, also holen Sie sich die ID vor dem eingefügten).

Dies ist in zwei Funktionen getan, so dass der oben genannte Code könnte verwirrend aussehen, aber das ist nur aus den beiden Funktionen entnommen. Die beiden Anweisungen werden ausgeführt, aber ich habe gerade eine ausgeführt, die als Beispiel ausgeführt wird.

Gibt es eine Alternative zu @@ IDENTITY und MAX, da ich nicht schätze, wie es mit @@ IDENTITY läuft?

Danke für jeden Rat :).

+0

meine zuletzt sehen, über den Zugriff nicht mehr Anweisungen in einem einzigen Befehl zu unterstützen. Können Sie bestätigen, dass es tatsächlich funktioniert, oder haben Sie einen anderen Ansatz gewählt? –

Antwort

6

Es ist absolut entscheidend als SELECT @@ IDENTITY wird auf der gleichen Verbindung (und Transaktion) als die Einfügung ausgeführt. Wenn die Methode getDataTable() für jeden Aufruf eine neue Verbindung erstellt, funktioniert sie nicht.

aktualisieren

Ein weiterer Ansatz, die vorzuziehen ist, ist es, die beiden Aussagen in einer

sql = "INSERT INTO...;SELECT @@IDENTITY..." 
Dim id = sqlCommand.ExecuteScalar(sql) 

-Update wieder

Es scheint auszuführen, wie Sie nicht wie mehrere Funktionen ausführen kann, dies gegen eine MS Access-Datenbank, Running multiple SQL statements in the one operation.

+0

Hallo, ja es erstellt keine neue Verbindung. Wenn ich gerade eine Verbindung beim Laden des Formulars in die Datenbank herstellen würde, würde das auch für das Einfügen, Aktualisieren usw. funktionieren? Danke – Elliott

+0

+1 Um einen Weg mit der 'ExecuteScalar' Methode zur Verfügung zu stellen, die zwei SQL-Anweisungen umschließt. Das hätte ich nie gedacht. =) –

+0

Danke, sortiere es. – Elliott

0

Sie können einfach den folgenden Code verwenden. Ich gehe davon aus, dass Sie SQLDataSource verwendet und die Veranstaltung ist:

Protected Sub SqlDataSource1_Inserted(sender As Object, e As SqlDataSourceStatusEventArgs) Handles SqlDataSource1.Inserted 
Dim query As String = "SELECT @@IDENTITY" 
Dim cmd As New OleDbCommand(query, CType(e.Command.Connection, OleDbConnection)) 
Dim newid As Integer = cmd.ExecuteScalar() 
l1.Text = newid 
End Sub 
Verwandte Themen