Access VBA中的 SELECT @@ IDENTITY 语句将允许用户查看/获取在表中生成的自动编号,其记录只是已插入,在数据库上。如果只有一个用户并且在任何时刻只发生一次INSERT,则这在某种程度上易于跟踪和维护。
我的应用程序是多用户,到目前为止只有一个人用于进行数据输入。现在我们有两个人,当一个用户(布朗先生)插入记录(自动识别码:1234
)并在一秒钟内(我们处理毫秒)另一个(格林先生)插入一条记录(自动识别码:{ {1}}),@@ IDENTITY似乎返回布朗先生的最新ID 1235
,而不是他插入的1234。由于同样的格林先生获得相同的1235,这是正确的。
我的问题是,有没有办法确保@@ IDENTITY为执行INSERT的用户返回该特定INSERT的AutoID。这是我的代码,如果有帮助的话。
1235
编辑:不是MS Access TableAdapter Get Identity after insert的重复。由于另一个线程涉及SQL Server,我的是JET Engine和Not .NET,我在VBA中使用此代码。
答案 0 :(得分:1)
Paul有没有尝试将其封装在一个事务中?试试这个
Dim tranDB As DAO.Database
Set tranDB = CurrentDb
tranSQL = "INSERT INTO Transactions (Password....." 'My Insert goes here
dbEngine.BeginTrans
on Error goto ERROR_INSERT:
tranDB.Execute tranSQL, dbFailOnError
Dim idRS As DAO.Recordset
Set idRS = tranDB.OpenRecordset("SELECT @@IDENTITY AS LastID;")
'ideally put another error trap here
TranID = nz(idRS("LastID"),0)
DBEngine.CommitTrans
On Error resume Next
idRS.Close
Set idRS = Nothing
SET tranDB = nothing
Exit sub/Function
ERROR_INSERT:
dbengine.rollback
'and other stuffs or resume to exit label
答案 1 :(得分:0)
我已经永远使用这种技术,它对我有用(如果它不起作用,我会多次失去工作!!)。
1)您已将此标记为Access 10问题。那么,你在项目中使用这个引用吗?:
Microsoft Office 14.0 Access database engine Object Library
C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE14\ACEDAO.DLL
较旧的DAO引用可能存在问题。 DAO 4.0之前不支持此功能。
2)关于krish的建议:交易虽然是一个好主意,但并不需要此功能才能运行。最后一个标识值由当前连接本地存储。您只需在用户执行另一次插入之前调用它。
3)但是,最好使用相同的数据库引用来同时执行Insert和检索Identity。在您的示例中,您对tranDB 的使用应该是正确的 - 但如果您在调用Identity之前将其重新分配给CurrentDB,则可能是问题所在。
4)你是否在Green之前使用时间戳确定布朗?
5)作为最后的手段,您可以尝试全DAO替代方案:
'------------------------------------------------------------------------------------------
' The query insert method is used here because DAO respects record-level locking
' on programmatically opened recordsets
'------------------------------------------------------------------------------------------
Set idRs = tranDB.OpenRecordset("SELECT ID, Password, InsertTime FROM Transactions (Password.....", dbOpenDynaset, dbAppendOnly + dbSeeChanges, dbOptimistic)
With idRs
.AddNew
!Password = sPassword
!InsertTime = Now
.Update
' Move to New Record
.Bookmark = .LastModified
lIdentity = !ID
.Close
End With
看看这是否会产生不同的结果。