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?
答
这里有两个选项供您考虑。
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
。
我最初并不确定自己是否有权进行此项更改。但我有一个新问题。如果我只使用单个参数,但在使用多个参数时不起作用,它将起作用。
我将关闭此主题,进行一些研究并可能会开启一个新主题。
感谢您的帮助。
我将名称更改为“DB.StoredProc”以发布问题。这是我系统上的真实姓名。 – Jamsandwich
对不起,刚刚发现它 昏暗的rs作为ADODB.Recordset 应该是 昏暗的rs作为新的ADODB.Recordset –
没问题。我按照你的说法改变了它,但没有运气。 – Jamsandwich