在多用户环境中使用@@ IDENTITY

时间:2015-04-10 10:42:43

标签: vba access-vba ms-access-2010

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中使用此代码。

2 个答案:

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

看看这是否会产生不同的结果。