vb.net sql последний вставленный ID
Я использую VB.NET с базой данных доступа, я вставляю значения, но затем мне нужно получить последний вставленный идентификатор (автоматический номер) и вставить его в связанную таблицу.
Я пробовал @@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 выполняется на том же соединении (и транзакции), что и вставка. Если ваш метод 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