SELECT @@IDENTITY 不受数据库对象限制?
我在 MS Access 中有以下代码:
Sub IdentityFail()
Dim db1 As DAO.Database, db2 As DAO.Database
Dim id1 As Long, id2 As Long
CurrentDb.Execute "CREATE TABLE LocalDummy (Col1 AUTOINCREMENT, Col2 INT)", dbFailOnError
Set db1 = CurrentDb
Set db2 = CurrentDb
db1.Execute "INSERT INTO LocalDummy(Col2) VALUES(Null)", dbFailOnError
id1 = db1.OpenRecordset("SELECT @@IDENTITY")(0)
db2.Execute "INSERT INTO LocalDummy(Col2) VALUES(Null)", dbFailOnError
id2 = db2.OpenRecordset("SELECT @@IDENTITY")(0)
Debug.Print id1, id2
Debug.Print db1.OpenRecordset("SELECT @@IDENTITY")(0), _
db2.OpenRecordset("SELECT @@IDENTITY")(0), _
CurrentDb.OpenRecordset("SELECT @@IDENTITY")(0)
End Sub
我希望它输出以下内容(即,每个不同的数据库对象都有自己的“最新身份”值):
1 2
1 2 0
相反,我得到(即,它似乎是全局范围的):
1 2
2 2 2
我认为 SELECT @@IDENTITY
是在 Jet 4.0+ 中获取最新自动编号 ID 的安全方法。我做错了什么?
I have the following code in MS Access:
Sub IdentityFail()
Dim db1 As DAO.Database, db2 As DAO.Database
Dim id1 As Long, id2 As Long
CurrentDb.Execute "CREATE TABLE LocalDummy (Col1 AUTOINCREMENT, Col2 INT)", dbFailOnError
Set db1 = CurrentDb
Set db2 = CurrentDb
db1.Execute "INSERT INTO LocalDummy(Col2) VALUES(Null)", dbFailOnError
id1 = db1.OpenRecordset("SELECT @@IDENTITY")(0)
db2.Execute "INSERT INTO LocalDummy(Col2) VALUES(Null)", dbFailOnError
id2 = db2.OpenRecordset("SELECT @@IDENTITY")(0)
Debug.Print id1, id2
Debug.Print db1.OpenRecordset("SELECT @@IDENTITY")(0), _
db2.OpenRecordset("SELECT @@IDENTITY")(0), _
CurrentDb.OpenRecordset("SELECT @@IDENTITY")(0)
End Sub
I would expect this to output the following (ie, each distinct db object would have its own "most recent identity" value):
1 2
1 2 0
Instead I get (ie, it appears to be globally scoped):
1 2
2 2 2
I thought SELECT @@IDENTITY
was the safe way to get the latest autonumber ID in Jet 4.0+. What am I doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
事实证明,
SELECT @@IDENTITY
的作用域是由会话确定的。在 ADO 中,这是通过连接来处理的。在DAO中,我们必须使用工作区来隔离范围。以下代码按预期工作:输出以下内容:
CurrentDb
仍然不会返回 0,但这很容易编写代码。Turns out that
SELECT @@IDENTITY
is scoped by session. In ADO, this is handled via the connection. In DAO, we have to use Workspaces to isolate the scope. The following code works as expected:This outputs the following:
CurrentDb
still won't return 0, but that's easy enough to code around.请参阅http://www. mikesdotnetting.com/Article/54/Getting-the-identity-of-the-most-recently-added-record
虽然是.Net代码,但关键是@@Identity是连接特定,并且当您在两种情况下都使用 CurrentDb 时,将使用相同的连接。
See http://www.mikesdotnetting.com/Article/54/Getting-the-identity-of-the-most-recently-added-record
Although it is .Net code, the key is the fact that @@Identity is connection specific, and as you are using CurrentDb in both cases, the same connection will be being used.