It turns out that SELECT @@IDENTITY is session limited. In ADO, this is handled through the connection. In the DAO, we must use Workspaces to highlight the area. The following code works as expected:
Sub IdentitySucceed() Dim ws1 As DAO.Workspace, ws2 As DAO.Workspace Dim db1 As DAO.Database, db2 As DAO.Database Dim id1 As Long, id2 As Long, DbPath As String CurrentDb.Execute "CREATE TABLE LocalDummy (Col1 AUTOINCREMENT, Col2 INT)", dbFailOnError 'The workspace names need not be unique;' ' we'll use the objects themselves (ws1 and ws2) to keep them straight' Set ws1 = DAO.CreateWorkspace("TempWS", "Admin", "") Set ws2 = DAO.CreateWorkspace("TempWS", "Admin", "") DbPath = Application.CurrentProject.Path & "\" & _ Application.CurrentProject.Name Set db1 = ws1.OpenDatabase(DbPath) Set db2 = ws2.OpenDatabase(DbPath) 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
Outputs the following:
1 2 1 2 2
CurrentDb will still not return 0, but it's easy enough for encoding.
source share