Excel的VBA - 运行SQL存储过程中的错误

问题描述:

我在Excel工作簿下面的代码,我从this page.复制Excel的VBA - 运行SQL存储过程中的错误

代码:

Sub Button1_Click() 

Dim con As ADODB.Connection 
Dim cmd As ADODB.Command 
Dim rs As ADODB.Recordset 
Dim WSP1 As Worksheet 

Set con = New ADODB.Connection 
Set cmd = New ADODB.Command 
Set rs = New ADODB.Recordset 

'''Clear extract area''' 
Worksheets("Extract").UsedRange.Delete 

'''Log into SQL Server''' 
con.Open "Provider = SQLOLEDB;" & _ 
     "Data Source = MySource;" & _ 
     "Initial Catalog = MyDB;" & _ 
     "User ID = MyID;" & _ 
     "Password = MyPassword;" 
cmd.ActiveConnection = con 

'''Set up parameters for stored procedure''' 
cmd.Parameters.Append cmd.CreateParameter("startDate", adDate, adParamInput, , Range("C2")) 
cmd.Parameters.Append cmd.CreateParameter("endDate", adDate, adParamInput, , Range("C3")) 

cmd.CommandText = "DB.StoredProc" 
Set rs = cmd.Execute(, , adCmdStoredProc) 

Set WSP1 = Worksheets("Extract") 
WSP1.Activate 
If rs.EOF = False Then WSP1.Cells(1, 1).CopyFromRecordset rs 

rs.Close 
Set rs = Nothing 
Set cmd = Nothing 

con.Close 
Set con = Nothing 

End Sub 

我上线“如果RS以下错误消息.EOF = False Then'

“当对象关闭时不允许操作。”

这是我第一次使用这些功能。我做错了什么?

另外,我是否正确设置了多个参数?

---快速编辑--- 不知道是否值得一提的是,我将日期格式设置为yyyy-mm-dd,因为它在SQL服务器中。

cmd.CommandText = "DB.StoredProc" 

应该是您的存储过程的实际名称 - 除非您实际上已将其命名为StoredProc?

+0

我将名称更改为“DB.StoredProc”以发布问题。这是我系统上的真实姓名。 – Jamsandwich

+0

对不起,刚刚发现它 昏暗的rs作为ADODB.Recordset 应该是 昏暗的rs作为新的ADODB.Recordset –

+0

没问题。我按照你的说法改变了它,但没有运气。 – Jamsandwich

这里有两个选项供您考虑。

Option Explicit 

Sub RunSProc() 

'USE [Northwind] 
'GO 
'DECLARE @return_value int 
'EXEC @return_value = [dbo].[TestNewProc] 
'  @ShipCountry = NULL 
'SELECT 'Return Value' = @return_value 
'GO 

Dim con As Connection 
Dim rst As Recordset 
Dim strConn As String 

Set con = New Connection 
strConn = "Provider=SQLOLEDB;" 
strConn = strConn & "Data Source=YOUR_SERVER_NAME;" 
strConn = strConn & "Initial Catalog=YOUR_DB_NAME;" 
strConn = strConn & "Integrated Security=SSPI;" 

con.Open strConn 

'Put a country name in Cell E1 
Set rst = con.Execute("Exec dbo.TestNewProc '" & ActiveSheet.Range("E1").Text & "'") 

'The total count of records is returned to Cell A5 
ActiveSheet.Range("A5").CopyFromRecordset rst 

rst.Close 
con.Close 

End Sub 


Sub TryThis() 

'USE [Northwind] 
'GO 
'DECLARE @return_value int 
'EXEC @return_value = [dbo].[Ten Most Expensive Products] 
'SELECT 'Return Value' = @return_value 
'GO 

Dim con As Connection 
Dim rst As Recordset 

Set con = New Connection 
con.Open "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DB_NAME;Integrated Security=SSPI;" 

Set rst = con.Execute("Exec dbo.[Ten Most Expensive Products]") 
'Results of SProc are returned to Cell A1 
ActiveSheet.Range("A1").CopyFromRecordset rst 

rst.Close 
con.Close 
End Sub 

我解决了这个问题,在我的存储过程中添加了SET NOCOUNT ON

我最初并不确定自己是否有权进行此项更改。但我有一个新问题。如果我只使用单个参数,但在使用多个参数时不起作用,它将起作用。

我将关闭此主题,进行一些研究并可能会开启一个新主题。

感谢您的帮助。