使用 @@Identity

6

我想知道如何从另一个数据库的表中获取最近生成的自动编号值。目前我正在执行以下操作:

Do Until rsA.EOF
    'Inserts new row here (works)
    Set rs = New ADODB.Recordset 
    rs.Open "SELECT @@Identity" (Connection info)
    SQLcmd = "UPDATE tbl SET col = " & rs("SELECT @@Identity").Value & " 
    (WHERE statement);"
    DoCmd.RunSQL SQLcmd
    rsA.MoveNext
Loop

但是它将col的值设置为0而不是新生成的自动编号。有什么想法吗?或者还有其他方法可以实现这个功能吗?

请查看 https://dev59.com/hHVC5IYBdhLWcg3wykQt - GSerg
1个回答

3
您没有展示将数据插入到另一个数据库的代码。如果您正在使用ADO连接对象的Execute方法进行操作,请从相同的连接对象中运行SELECT @@Identity查询,而不是使用相同连接字符串的新连接。@@Identity仅在同一连接会话中可用;否则,您将得到0。
实际上,您甚至不需要记录集来捕获该值。如果您的连接对象命名为conn,则这将返回一个记录集,但您不需要将其分配给记录集对象变量。只需请求返回记录集中的第一项即可。
Debug.Print "most recent autonumber: " & _
    conn.Execute("SELECT @@Identity")(0)

1
+1 你比我先说了。正如@HansUp所说,关键是要使用相同的连接,而不仅仅是相同的连接字符串。 - mwolfe02
我正在使用SQL INSERT INTO SELECT语句。当我运行conn.Execute(...)时,它返回0。 - user2618908
如果您是从 ADO 连接对象执行 INSERT,并且稍后从同一连接对象中选择 @@Identity,那么这不应该是一个问题。我在 Access 2007 中测试了我的答案代码。我没有展示 INSERT,但如果有帮助的话,我可以展示它。 - HansUp
我把命令保存为字符串,然后使用runcmd.runSQL。这样做不行吗? - user2618908
“RunSQL”不使用ADO连接。最有可能的情况是,您正在从当前数据库而不是从插入到的其他数据库中获取0作为最后一个标识值。 - HansUp
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接