使用MS Access,当我想知道最近添加的记录的ID时,我使用
nNewID = CurrentDb.OpenRecordset("SELECT @@IDENTITY")(0)
我从StackOverflow上的帖子中摘录的。
[有人可以解释一下它是如何工作的吗?特别是,似乎没有对该记录已添加到的表的任何引用-那么@@ IDENTITY是否引用最后添加的记录,无论添加到哪个表? -语句结尾的(0)的作用是什么?
感谢您的帮助
首先,您应该知道,这种获取最新添加的记录的自动编号值的方法只有在创建记录的同一数据库工作空间(使用DAO时)或相同的数据库连接(使用ADO时)。独立于此类连接进行评估时,该语句将仅产生0
。
假设我们有一个名为Table1
的表,其中有两个字段:
Table1
+------------+--------+
| ID | Field1 |
+------------+--------+
| AutoNumber | Text |
+------------+--------+
我们可以使用以下代码创建新记录:
With CurrentDb
.Execute "insert into table1 (field1) values ('abc')"
End With
如果要查找分配给自动编号字段ID
的值,则可以执行此操作:
With CurrentDb
.Execute "insert into table1 (field1) values ('abc')"
Debug.Print .OpenRecordset("select @@identity")(0)
End With
@@IDENTITY
?请注意,上面示例中使用的SQL语句独立于任何特定的表或字段(没有from
子句),因为@@identity
列仅引用了最后一个自动编号值(指向其中的任何记录)当前数据库工作区(DAO)/连接(ADO)的任何表)。
此T-SQL documentation可能有助于您的理解,但是请注意,这适用于SQL Server,而不适用于MS Access,因此,尽管此内容对@@identity
的用途进行了描述,但并非所有内容都可以直接转换为MS Access。 >
.OpenRecordset("...")(0)
如何工作?关于在(0)
方法之后直接使用.OpenRecordset
,这只是访问Fields
集合中的第一项(它是Recordset class的默认成员)的简写,因此等效于:
.OpenRecordset("select @@identity").Fields(0)