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?

Спасибо за любые советы :).

162   2  

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
    Ничего не найдено.

Добавить ответ:
Отменить.