vb.net последний вставленный идентификатор sql
Я использую VB.NET с базой данных Access я вставляю значения, но затем мне нужно получить последний вставленный идентификатор (автоматический номер) и вставить его в соответствующую таблицу.
Я пробовал @ @ IDENTITY и MAX (столбец), но @@IDENTITY возвращает ноль, а MAX не очень надежен (иногда медленно вставляет данные, поэтому получите идентификатор перед вставленным).
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()
Это делается в двух функциях, поэтому приведенный выше код может выглядеть запутанным, но это просто взято из двух функций. Два утверждения исполняются, но я только что показал, как один из них был исполнен в качестве примера.
Есть ли альтернатива @ @ IDENTITY и MAX, так как я, кажется, не вижу, как я ошибаюсь с @@IDENTITY?
Спасибо за любые советы :).
2 ответов:
Его абсолютно критично, чем SELECT @ @ IDENTITY выполняется на том же соединении (и транзакции), что и insert. Если метод getDataTable () создает новое соединение для каждого вызова, то именно поэтому он не работает.
Обновить
Другой подход, который предпочтительнее, заключается в выполнении двух операторов в одномsql = "INSERT INTO...;SELECT @@IDENTITY..." Dim id = sqlCommand.ExecuteScalar(sql)Обновить снова
Похоже, что вы не можете выполнить несколько таких функций в базе данных MS Access, выполнение нескольких операторов SQL в одной операции .
Вы можете просто использовать следующий код. Я предполагаю, что вы использовали SQLDataSource и событие:
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
Comments