【问题标题】:Using "SELECT SCOPE_IDENTITY()" in ADODB Recordset在 ADODB 记录集中使用“SELECT SCOPE_IDENTITY()”
【发布时间】:2010-11-15 02:59:22
【问题描述】:

在 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)。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在你的 rs.Open 中试试这个

      rs.Open SQLStr, cn, adCmdText

      【讨论】:

        【解决方案3】:

        当您使用 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)
        

        【讨论】:

          【解决方案4】:

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

          Set rs = rs.NextRecordset
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-02
            相关资源
            最近更新 更多