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.
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功能完成之前,你会得到他们的记录.
小智 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)
莱西涅