在ADODB Recordset中使用“SELECT SCOPE_IDENTITY()”

时间:2009-07-29 15:25:08

标签: excel-vba sql-server-2008 adodb recordset vba

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

INSERT INTO DataSheet(databaseUserID, currentTimestamp)
VALUES (1, CURRENT_TIMESTAMP);
SELECT SCOPE_IDENTITY()
在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)

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

4 个答案:

答案 0 :(得分:8)

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

Set rs = rs.NextRecordset()

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

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

答案 1 :(得分:3)

您正在执行两个语句,因此您将获得两个结果。记录集对象一次只能保存一个结果 - 获取使用NextRecordset方法所需的其他结果。

Set rs = rs.NextRecordset

答案 2 :(得分:1)

在你的rs.Open试试这个

rs.Open SQLStr, cn, adCmdText

答案 3 :(得分:0)

查看删除adOpenKeySet时发生的情况,并将adLockOptimistic值保留为默认值。