При получении переменной объекта, переменной блока не установлена ​​ошибка при попытке использовать VBA для извлечения хранимой процедуры SQL Server - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь извлечь хранимую процедуру из SQL Server, используя VBA.Я могу получить базовый код 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

1 Ответ

0 голосов
/ 06 февраля 2019

«Переменная Object [или With block] не установлена» является эквивалентом VBA «исключения нулевой ссылки» других языков, ошибка, возникающая при попытке доступа к членам объекта, когда ссылка на этот объект null, или вТермины VBA, Nothing.

Это именно то, что происходит здесь:

cmd.ActiveConnection = conn

Объект cmd был объявлен, но никогда не инициализирован.Set это экземпляр New класса ADODB.Command для решения проблемы:

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

Часть сообщения «С блоком» относится к синтаксису блока With:

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

Вы можете использовать With New, чтобы ссылка на объект содержалась в блоке With, без необходимости объявления локальной переменной:

With New ADODB.Command
    '...
End With
...