2010-12-13 4 views
6

Я использую VB.NET с базой данных доступа, я вставляю значения, но затем мне нужно получить последний вставленный идентификатор (автоматический номер) и вставить его в связанную таблицу.vb.net sql последний раз вставленный ID

Я пробовал @@ 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?

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

+0

Смотрите мое последнее изменение, о доступе не поддерживает несколько операторов в одной команде. Можете ли вы подтвердить, что это действительно работает, или вы пошли на другой подход? –

ответ

6

Его абсолютно необходимо, чем SELECT @@ IDENTITY выполняется по тому же соединению (и транзакции), что и вставка. Если ваш метод getDataTable() создает новое соединение для каждого вызова, то поэтому он не работает.

Update

Другой подход, который предпочтителен для выполнения двух заявлений в одном

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

Update снова

Похоже, вы не можете выполнять несколько функций, таких как это в отношении базы данных MS Access, Running multiple SQL statements in the one operation.

+0

Привет, да, это не создает новое соединение. Если бы я только сделал одно соединение с загрузкой формы в базу данных, это тоже работало бы для вставки, обновления и т. Д.? Спасибо – Elliott

+0

+1 Для обеспечения способа с помощью метода ExecuteScalar, обертывания двух операторов SQL. Это я никогда бы не подумал об этом. =) –

+0

Спасибо, что отсортировал его. – Elliott

0

Вы можете просто использовать следующий код. Я предполагаю, что вы использовали 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 
Смежные вопросы