在ADODB Recordset中使用"SELECT SCOPE_IDENTITY()"

Joe*_*ool 6 vba adodb recordset excel-vba sql-server-2008

在Excel中使用VBA脚本,我试图在表中插入一个新行,然后返回该行的标识值.如果我跑:

INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP);
SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

在Management Studio中,插入行并按预期返回给我返回的标识值.但是,当我通过VBA中的ADODB记录集运行完全相同的查询时,我遇到了麻烦.该行确实已插入,但我无法访问标识值.记录集列出了0个字段,实际上也已关闭.我已尝试使用和不使用分号,我也尝试将查询作为单个事务运行.同样的交易,没有骰子.知道发生了什么事吗?

这是我的VBA:

Dim rs As ADODB.Recordset
Dim cn As Connection
Dim SQLStr As String
Dim serverName As String
Dim databaseName As String

serverName = "MSSQLServer"
databaseName = "QA"
cxnStr = "Driver={SQL Server};Server=" & serverName & ";Database=" & databaseName & ";"

SQLStr = "INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP); SELECT SCOPE_IDENTITY()"
Set cn = New ADODB.Connection
cn.Open cxnStr
Set rs = New ADODB.Recordset
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic
MsgBox (rs.Fields(0).Value)
Run Code Online (Sandbox Code Playgroud)

并且消息框无法显示,因为rs.Fields(0).Value返回NULL.我向rs添加了一个手表,就像我说的那样,在查询后显示0个字段,并且似乎也是关闭的(状态= 0).

Tim*_*ves 8

当您使用ADODB运行一批命令时,我相信它会分别运行每个命令.要强制运行下一个命令,必须使用以下命令:

Set rs = rs.NextRecordset()
Run Code Online (Sandbox Code Playgroud)

将例行程序的结尾更改为以下内容应该可以解决问题:

Set rs = New ADODB.Recordset
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic
Set rs = rs.NextRecordset
MsgBox (rs.Fields(0).Value)
Run Code Online (Sandbox Code Playgroud)