2010-12-13 18 views
6

Używam VB.NET z bazą danych Access, wstawiam wartości, ale muszę pobrać ostatnio wstawiony identyfikator (numer auto) i wstawić go do powiązanej tabeli.vb.net sql ostatnio wstawiony ID

Próbowałem @@ IDENTITY i MAX (kolumna), ale @@ TOŻSAMOŚĆ zwraca zero, a MAX nie jest bardzo niezawodny (czasami wolno wstawić dane, więc idź identyfikator przed wstawionym).

Dim insertSql = datalayer.getDataTable((String.Format("INSERT INTO users (username) VALUES ({0})", username))) 

Dim newID = datalayer.getDataTable((String.Format("SELECT @@IDENTITY FROM users"))) 


Dim con As OleDbConnection = getConnection() 
con.Open() 
Dim sqlCommand As OleDbCommand = New OleDbCommand(String.Format(insertSql), con) 
sqlCommand.ExecuteNonQuery() 

Odbywa się to w dwóch funkcjach, więc powyższy kod może wyglądać na zagmatwany, ale pochodzi z dwóch funkcji. Dwie instrukcje są wykonywane, ale właśnie pokazałem, że jeden jest wykonywany jako przykład.

Czy istnieje alternatywa dla @@ IDENTITY i MAX, ponieważ wydaje mi się, że nie widzę, jak źle postępuję z @@ IDENTITY?

Dzięki za radę :).

+0

Zobacz moją ostatnią zmianę, o dostęp nie wsparcie wielu instrukcji w jednym poleceniu. Czy możesz potwierdzić, że faktycznie działa lub czy zastosowałeś inne podejście? –

Odpowiedz

6

Ma to absolutnie kluczowe znaczenie niż SELECT @@ TOŻSAMOŚĆ jest wykonywana na tym samym połączeniu (i transakcji) niż wstawka. Jeśli twoja metoda getDataTable() tworzy nowe połączenie dla każdego połączenia, to właśnie dlatego nie działa.

Aktualizacja

Innym podejściem, które jest korzystniejsze jest wykonanie dwóch sprawozdań w jednym

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

Update

Wydaje się, że nie można wykonać wiele funkcji, takich jak to przeciwko bazie danych MS Access, Running multiple SQL statements in the one operation.

+0

Cześć, tak, nie tworzy nowego połączenia. Gdybym właśnie dokonał jednego połączenia przy ładowaniu formularza do bazy danych, czy działałoby to również przy wstawianiu, aktualizacji itp.? Dzięki – Elliott

+0

+1 Za zapewnienie metody metodą "ExecuteScalar", zawijanie dwóch instrukcji SQL. To, nigdy bym tego nie pomyślał. =) –

+0

Dzięki temu posortowałem. – Elliott

0

Możesz po prostu użyć następującego kodu. Przypuszczam, że użyłeś SqlDataSource a zdarzenie jest:

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 
Powiązane problemy