【发布时间】:2019-12-27 00:26:59
【问题描述】:
关于这个问题有几个答案,但我的问题是关于我拥有的特定代码。
我正在尝试获取在 VBA 代码上执行的此查询的最后插入 ID。
Public Function Execute(cQry As excfw_dbQuery) As ADODB.Recordset
If pConn.State = 0 Then
OpenConnection
End If
qry = "INSERT INTO [some really long query, which actually works]; SELECT SCOPE_IDENTITY()"
On Error Resume Next
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open qry, pConn 'also tried with adOpenKeyset, adLockOptimistic
'some error handling code which is not related to the issue
Set rs = rs.NextRecordset() 'also tried without moving onto the next recordset
pInsertedId = rs.Fields(0).Value
Set Execute = rs 'this is just to pass the query result for SELECT queries
End Function
这应该将最后插入的 ID 保存在 pInsertedId 变量中,但每次插入一行时我都会得到 0。奇怪的是,当我将相同的代码复制并粘贴到 SSMS 中时,它可以工作。
我可能只是将一些独特的数据插入到数据库的一些未使用的列中并通过它进行查询。
--更新--
我刚刚注意到,在运行 SELECT 查询时,rs 对象保持打开状态,直到超出范围。以下是观看部分的截图:
在插入语句上,它会在查询执行后立即关闭:
【问题讨论】:
-
调试提示:尝试将
SELECT SCOPE_IDENTITY()替换为select 42;并确保其有效。 -
刚刚尝试过,它返回 0。事实上,在尝试这样做时,我注意到在运行
SELECT查询时,rs 对象保持打开状态,直到超出范围。当我运行INSERTquery 时,它在执行第一个查询后立即关闭。 -
尝试直接在SSMS中运行sql语句。如果你得到正确的值,你肯定知道问题出在 VBA 方面(这是最有可能的赌注,甚至在测试之前)。
-
@ZoharPeled 我已经这样做了。事实上,这是我尝试的第一件事。问题说明了这个细节。
-
@SercioSoydanov 抱歉,不知何故错过了。
标签: excel vba tsql adodb scope-identity