我正在使用带有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出现问题?
感谢您的任何建议:)。
答案 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