vb.net sql最后插入ID

时间:2010-12-13 01:22:19

标签: sql vb.net ms-access lastinsertid

我正在使用带有Access数据库的VB.NET,我插入值但是我需要获取最后插入的ID(自动编号)并将其插入到相关的表中。

我已经尝试了@@ IDENTITY和MAX(列)但是@@ IDENTITY返回零并且MAX不是很可靠(插入数据有时很慢,所以在插入数据之前获取ID)。

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 个答案:

答案 0 :(得分:7)

它绝对比SELECT @@ IDENTITY在与插入相同的连接(和事务)上执行是至关重要的。如果你的getDataTable()方法为每个调用创建一个新连接,那就是它无法工作的原因。

<强>更新

另一种更好的方法是在一个

中执行两个语句
sql = "INSERT INTO...;SELECT @@IDENTITY..." 
Dim id = sqlCommand.ExecuteScalar(sql)

再次更新

对于MS Access数据库Running multiple SQL statements in the one operation,您似乎无法执行此类多个功能。

答案 1 :(得分: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