VBA + SQL Server - 获取插入的最后一个 ID

Posted

技术标签:

【中文标题】VBA + SQL Server - 获取插入的最后一个 ID【英文标题】:VBA + SQL Server - Get Last ID Inserted 【发布时间】:2017-12-29 16:40:44 【问题描述】:

希望您能提供帮助 - 我在 INSERT 后获取最后一个 ID 时遇到问题。

所以环境——Access 2016、SQL Server 和 VBA

Dim db As DAO.Database
Dim RS As New ADODB.Recordset
Dim sql As String

我已经声明了这些论文,然后是私有子。

Private Sub CreateOrderHeader()
Dim CustomerID As Integer
Dim OrderDate As String
Dim OrderStatus As String
Dim OrderValue As Double
Dim OrderNotes As String
Dim OrderPostageID As String
Dim OrderAddressID As String
Dim OrderBatchID As Integer
Dim OrderPayment As String
Dim OrderCourierID As String
Dim OrderAgentID As Integer
Dim OrderOutstanding As Double

CustomerID = tbxCusID
OrderDate = Format(Now)
OrderStatus = "InProcess"
OrderValue = txtTotal.value
OrderNotes = tbxNotes.value
OrderPostageID = txtPostage.Column(0)

If tbxCustomerAddress = tbxDeliveryAddress Then
    OrderAddressID = 3 'default customers address
Else
    'NEED TO GET CUSTOMER ADDRESS TO DO
End If
OrderBatchID = cmbBatch.Column(0)
OrderPayment = sPayMethod
OrderCourierID = cbxShipping.Column(0)
OrderAgentID = 0
OrderOutstanding = txtTotal.value

 Dim testvar As String

sql = "INSERT INTO dbo_OrderHeader " _
      & "(OrdCusID, OrdDate, OrdStatus, OrdValue, OrdNotes, OrdPostageID, OrdDelAddID,OrdBatchID,OrdPaymentMethod, OrdCourierID,ordAgentID, OrdOutstanding,OrdSource) " _
      & " VALUES ('" & CustomerID & "' ,'" & OrderDate & "', '" & OrderStatus & "', '" & OrderValue & "', '" & OrderNotes & "', '" & OrderPostageID & "','" & OrderAddressID & "','" & OrderBatchID & "','" & OrderPayment & "','" & OrderCourierID & "','" & OrderAgentID & "','" & OrderOutstanding & "', 1)"



DoCmd.RunSQL (sql)

sql = "SELECT @@IDENTITY As IDT"
RS.Open sql, CurrentProject.Connection, adOpenStatic, adLockReadOnly
IDT = RS!IDT

MsgBox ("Succes - OrderHeader" & " '" & IDT & "'  ")
End Sub

我期待这段代码的结果:

sql = "SELECT @@IDENTITY As IDT"
RS.Open sql, CurrentProject.Connection, adOpenStatic, adLockReadOnly
IDT = RS!IDT

但这给了我“0”的结果。

你能帮忙吗?

谢谢

【问题讨论】:

可能相关,另请参阅此答案中嵌入的访问特定链接:***.com/a/186563/84206 我推荐一个存储过程,以防止我看到的 SQL 注入可能出现的问题。 proc 可以进行插入并有一个输出参数给你 ID。 谢谢,我得检查一下——我不熟悉存储过程。 考虑同时使用 parameterization 和 Access' PARAMETERS 子句,因为其中一些表单值看起来对聪明的用户来说是开放式的。 【参考方案1】:

你可以试试这个:

Set db = CurrentDB
db.Execute(sql)

IDT = db.OpenRecordset("SELECT @@IDENTITY")(0)
Set db = Nothing

注意

不要像DoCmd.RunSQL (sql)那样执行插入查询,而是按照上面的方法。

【讨论】:

谢谢 - 但这仍然返回 0。 很高兴您的问题得到了解决。不要忘记将此答案标记为有用(赞成):) 如果可能,我会将 @@IDENTITY 更改为 Scope_Identity() 。 @@Identity 不限于您的交易范围,因此可能会返回错误的数字。 @twoleggedhorse ...Scope_Identity() 是not supported in MS Access。 OP 正在运行对 SQL Server 链接表的访问引擎。

以上是关于VBA + SQL Server - 获取插入的最后一个 ID的主要内容,如果未能解决你的问题,请参考以下文章

VBA:为从 SQL Server 数据库中选择的十进制数获取逗号分隔符而不是点

使用 VBA 从 SQL Server 查询 VIEW

从 Excel VBA 更新 SQL Server 表

将本地数据插入 SQL Server 临时表

VBA 将日期参数传递给 SQL Server 存储过程

SQL SERVER 2008 获取最后插入的值