获取对象变量,块变量未设置错误尝试使用 VBA 拉取 SQL 服务器存储过程

Getting Object Variable, Block Variable not set error trying to use VBA to pull SQL Server stored procedure

我正在尝试使用 VBA 从 SQL 服务器中提取存储过程。我能够从服务器中提取基本的 SQL 代码,但是当尝试将复杂代码与存储过程一起使用时,我收到错误 91:未设置对象变量或块变量。无法确定我需要设置什么才能正确地 运行。

完成的存储过程没有参数,也没有列出参数的代码。我已经尝试了本论坛其他主题的一些参数代码,但没有任何变化

删除 cmd 行并 运行 仅针对 SQL 代码 (SELECT * FROM Table) 有效

Sub ConnectSQL()
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim sConnString As String
'Create Connection String
    sConnString = "Provider=SQLOLEDB;Data Source=ServerName;" & _
        "Initial Catalog=DatabaseName;" & _
        "User ID=ID;" & _
        "Password=Password;" & _
        "Integrated Security=SSPI;"
'Create Connection and Recordset Objects
    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset
'Open Connection and Execute
    conn.Open sConnString
    cmd.ActiveConnection = conn
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "Paint558Ranking"
    Set rs = cmd.Execute
'Check If Data
    If Not rs.EOF Then
'Transfer Result
        Sheets("Sheet1").Range("A1").CopyFromRecordset rs
'Close record
        rs.Close
    Else
        MsgBox "Error: No Records Returned.", vbCritical
    End If
'Clean Up
    If CBool(conn.State And adStateOpen) Then conn.Close
    Set conn = Nothing
    Set rs = Nothing
End Sub

"Object [or With block] variable not set" 是 VBA 等同于其他语言的 "null reference exception",当您尝试访问一个对象的成员时发生的错误,而该对象的引用是 null,或 VBA 术语,Nothing

这正是这里发生的事情:

cmd.ActiveConnection = conn

cmd 对象已声明,但从未初始化。 Set 它到 ADODB.Command class 的 New 实例来解决问题:

Set cmd = New ADODB.Command
cmd.ActiveConnection = conn

错误消息的 "With block" 部分引用了 With 块语法:

Dim cmd As ADODB.Command
With cmd ''<< error 91 here
    '...
End With

您可以使用 With NewWith 块持有对象引用,而无需声明局部变量:

With New ADODB.Command
    '...
End With