【发布时间】:2012-06-05 21:58:45
【问题描述】:
这是一个非常常见的问题,但我无法获取最后插入的记录的 ID。我正在使用带有 ODBC 链接表的 DAO 来复制一条记录,它是子记录。我的表在 SQL Server 2008 中,并有 ID 字段的标识字段。
这是我迄今为止尝试过的。我这里的第一段代码导致错误 3167,记录已删除。如果我进行调试。打印记录集实际上包含 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)
最后一个完成没有任何问题,但返回的值不正确。如果实际的新 ItemID 为 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")
【问题讨论】:
-
您可以使用直通查询或存储过程吗?我很确定您不应该将@@identity 与 SQL Server (wiki.lessthandot.com/index.php/…) 一起使用。
-
我认为是
SELECT TOP 2 ... Order by DateTimeModified搞砸了你。此外,Select @@Identity不打算与 from 子句一起使用,也不太可能按照您的想法行事。此外,如果您不想使用 SP,您可以尝试执行插入并在一批中选择。例如INSERT INTO ... VALUES ... ; SELECT * FROM items where ItemID = Scope_Identity() -
@ConradFrix 我在 Recordset 'r' 中尝试了不同的 SELECT 语句,但似乎没有任何区别。
-
我正在使用这些信息来指导我,但我想它可能不准确:social.msdn.microsoft.com/Forums/en-US/accessdev/thread/…
标签: sql-server-2008 ms-access vba odbc