最后插入行的自动编号值 - MS Access/VBA

a_m*_*m0d 36 ms-access vba jet

我有一个JET以自动编号为主键的表,我想知道如何在插入一行后检索此数字.我曾想过MAX()用来检索具有最高值的行,但我不确定它有多可靠.一些示例代码:

Dim query As String
Dim newRow As Integer
query = "INSERT INTO InvoiceNumbers (date) VALUES (" & NOW() & ");"
newRow = CurrentDb.Execute(query)
Run Code Online (Sandbox Code Playgroud)

现在我知道这不起作用,因为Execute()不会返回主键的值,但这基本上是我正在寻找的那种代码.我将需要使用新行的主键来更新另一个表中的多个行.

这样做最简单/最易读的方法是什么?

Dav*_*ton 49

在您的示例中,因为您使用CurrentDB来执行INSERT,所以您自己更难.相反,这将工作:

  Dim query As String
  Dim newRow As Long  ' note change of data type
  Dim db As DAO.Database

  query = "INSERT INTO InvoiceNumbers (date) VALUES (" & NOW() & ");"
  Set db = CurrentDB
  db.Execute(query)
  newRow = db.OpenRecordset("SELECT @@IDENTITY")(0)
  Set db = Nothing
Run Code Online (Sandbox Code Playgroud)

我曾经通过打开一个AddOnly记录集并从那里获取ID 来添加,但这里的效率要高得多.请注意,它不需要ADO.

  • 即使记录集是SQL Server链接表,它也能正常工作!很棒! (2认同)
  • 这对我不起作用。我使用 dao 向 SQL Server 表中插入了一条数据。我在 newRow 中总是得到 0。 (2认同)

Ton*_*ews 38

如果DAO使用

RS.Move 0, RS.LastModified
lngID = RS!AutoNumberFieldName
Run Code Online (Sandbox Code Playgroud)

如果ADO使用

cn.Execute "INSERT INTO TheTable.....", , adCmdText + adExecuteNoRecords
Set rs = cn.Execute("SELECT @@Identity", , adCmdText)
Debug.Print rs.Fields(0).Value
Run Code Online (Sandbox Code Playgroud)

cn作为有效的ADO连接,@@Identity将返回Identity此连接上插入的最后一个 (自动编号).

请注意,这@@Identity可能很麻烦,因为上一个生成的值可能不是您感兴趣的值.对于Access数据库引擎,请考虑VIEW连接两个表,两个表都具有该IDENTITY属性,并且您可以INSERT INTO使用VIEW.对于SQL Server,请考虑是否有触发器将记录插入另一个也具有该IDENTITY属性的表中.

BTW DMax不会像其他人在你插入一个记录之后插入一个记录,但是在你的Dmax功能完成之前,你会得到他们的记录.

  • DAO也可以做SELECT @@ IDENTITY - 你不需要ADO.我一直这样做:lngID = db.OpenRecordset("SELECT @@ IDENTITY")(0),其中"db"是用于执行插入的相同数据库变量.我不再打开记录集并为此添加. (15认同)

小智 5

这是我为您编写的代码的改编。我从developpez.com(在页面中查找:“ 倒入inserrer desdonnées,记录集或类型要求插入INSERT吗? ”)中受到启发。)他们用一点法语解释。这种方法比一个鞋帮要快得多。在示例中,这种方式快了37倍。试试吧。

Const tableName As String = "InvoiceNumbers"
Const columnIdName As String = "??"
Const columnDateName As String = "date"

Dim rsTable As DAO.recordSet
Dim recordId as long

Set rsTable = CurrentDb.OpenRecordset(tableName)
Call rsTable .AddNew
recordId = CLng(rsTable (columnIdName)) ' Save your Id in a variable
rsTable (columnDateName) = Now()        ' Store your data
rsTable .Update

recordSet.Close
Run Code Online (Sandbox Code Playgroud)

莱西涅

  • 您能否确定比哪个特定示例“快37倍”? (5认同)