6

在 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

4 回答 4

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)
于 2009-07-29T15:37:15.453 回答
3

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

Set rs = rs.NextRecordset
于 2009-07-29T15:38:01.443 回答
1

在你的 rs.Open 试试这个

rs.Open SQLStr, cn, adCmdText

于 2009-07-29T15:31:18.790 回答
0

看看当您删除 adOpenKeySet 和 adLockOptimistic 值时会发生什么,将它们保留为默认值。

于 2009-07-29T15:29:23.397 回答