9

我将 VB.NET 与 Access 数据库一起使用,我插入了值,但随后我需要获取最后插入的 ID(自动编号)并将其插入到相关表中。

我已经尝试过@@IDENTITY 和 MAX(column) 但@@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 出了什么问题?

感谢您的任何建议:)。

4

2 回答 2

10

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

更新

另一种更可取的方法是同时执行这两个语句

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

再次更新

似乎您无法针对 MS Access 数据库执行多个这样的功能,在一次操作中运行多个 SQL 语句

于 2010-12-13T01:28:07.783 回答
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
于 2016-11-19T19:33:00.607 回答