获取对象变量,块变量未设置错误尝试使用 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 New
让 With
块持有对象引用,而无需声明局部变量:
With New ADODB.Command
'...
End With
我正在尝试使用 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 New
让 With
块持有对象引用,而无需声明局部变量:
With New ADODB.Command
'...
End With