这是一个非常常见的问题,但我无法获取最后插入记录的ID。我正在使用带有ODBC链接表的DAO来复制一条记录及其子记录。我的表位于SQL Server 2008中,并具有ID字段的标识字段。
到目前为止,我尝试过以下方法。我的第一段代码会导致错误3167,“记录已删除”。如果我进行debug.Print,则recordset实际上包含3个记录。
Dim r as DAO.Recordset, db as DAO.Database
Set db = CurrentDb
Set r = db.OpenRecordset("SELECT TOP 2 * FROM item ORDER BY DateTimeModified DESC", dbOpenDynaset, dbSeeChanges)
r.AddNew
'Set field values here
r.Update 'Completes without error
r.Bookmark = r.LastModified
Debug.Print r("ItemID") 'Error 3167, Record is deleted
这是我接下来尝试的内容:
Debug.Print db.OpenRecordset("SELECT @@identity FROM item")(0)
这个操作可以顺利完成,但返回的值是不正确的。实际上,新项目ID是321,而它却返回了614。它返回的值似乎是递增的(随着我的测试而变化),但它似乎与我的表格完全没有关系。没有一个字段的值为614。我已经仔细检查并确认我在查找正确的表格。
我知道我可以使用类似DLookup或DMax的函数,但在多用户环境下这可能不被认为是可靠的。
我想,我可以使用带有ADO的存储过程来解决这个问题。我想知道这是我的唯一选择吗?
编辑1: 现在我正在使用以下代码,并且它正在做我需要/想要的事情。我怀疑这基本上与使用DMax相同。
Dim r as DAO.Recordset, db as DAO.Database
Set db = CurrentDb
Set r = db.OpenRecordset("SELECT TOP 1 * FROM item ORDER BY ItemID DESC", dbOpenDynaset, dbSeeChanges)
r.AddNew
'Set field values here
r.Update
r.Requery
r.MoveFirst
Debug.Print r("ItemID")
SELECT TOP 2 ... Order by DateTimeModified
引起了问题。而且Select @@Identity
不应该与 from 子句一起使用,也不可能做你想做的事情。如果你不想使用存储过程,你可以尝试在一个批处理中执行插入和选择操作。例如:INSERT INTO ... VALUES ... ; SELECT * FROM items where ItemID = Scope_Identity()
。 - Conrad Frix