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
Другие вопросы по тегам