2010-12-13 25 views
6

sto usando VB.NET con un database di Access, inserisco i valori ma poi ho bisogno di ottenere l'ultimo ID inserito (numero automatico) e inserirlo in una tabella correlata.vb.net sql ultimo ID inserito

Ho provato @@ IDENTITY e MAX (colonna) ma @@ IDENTITY restituisce zero e MAX non è molto affidabile (a volte è lento inserire dati, quindi ottenere l'ID prima di quello inserito).

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() 

Questo viene fatto in due funzioni in modo che il codice di cui sopra potrebbe essere fonte di confusione, ma questo è solo preso dalle due funzioni. Le due istruzioni vengono eseguite, ma ne ho appena mostrato una eseguita come esempio.

Esiste un'alternativa a @@ IDENTITY e MAX, poiché non vedo come si possa sbagliare con @@ IDENTITY?

Grazie per qualsiasi consiglio :).

+0

Vedere la mia ultima modifica, circa l'accesso non supportano più istruzioni in un unico comando. Puoi confermare che funziona davvero o sei andato per un altro approccio? –

risposta

6

È assolutamente cruciale di SELECT @@ IDENTITY viene eseguito sulla stessa connessione (e transazione) dell'inserto. Se il metodo getDataTable() crea una nuova connessione per ogni chiamata, ecco perché non funziona.

Aggiornamento

Un altro approccio che è preferibile è quello di eseguire le due affermazioni in una

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

Update di nuovo

Sembra che non si può eseguire più funzioni come questo contro un database MS Access, Running multiple SQL statements in the one operation.

+0

Ciao, sì, non crea una nuova connessione. Se avessi appena effettuato una connessione sul caricamento del modulo nel database, funzionerebbe anche per l'inserimento, l'aggiornamento, ecc.? Grazie – Elliott

+0

+1 Per fornire un modo con il metodo 'ExecuteScalar', avvolgendo le due istruzioni SQL. Quello, non ci avrei mai pensato. =) –

+0

Grazie ordinato. – Elliott

0

È possibile utilizzare semplicemente il seguente codice. Suppongo che hai usato SQLDataSource e l'evento è:

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 
Problemi correlati