【问题标题】:Excel VBA - Run SQL Stored Procedure ErrorExcel VBA - 运行 SQL 存储过程错误
【发布时间】:2017-07-20 17:00:58
【问题描述】:

我从this page.复制的 Excel 工作簿中有以下代码

代码:

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

我在“If rs.EOF = False Then”行收到以下错误消息

"对象关闭时不允许操作。"

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

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

---快速编辑--- 不确定是否值得一提,我已将日期格式化为 yyyy-mm-dd,就像在 SQL Server 中一样。

【问题讨论】:

    标签: sql excel adodb vba


    【解决方案1】:

    我通过将SET NOCOUNT ON 添加到我的存储过程中解决了这个问题。

    我最初不确定我是否可以进行更改。不过我有一个新问题。如果我只使用一个参数,它就可以工作,但当我使用多个参数时,它就不行了。

    我会关闭这个帖子,做一些研究并可能会打开一个新帖子。

    感谢您的帮助。

    【讨论】:

      【解决方案2】:
       cmd.CommandText = "DB.StoredProc"
      

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

      【讨论】:

      • 我将名称更改为“DB.StoredProc”以发布问题。这是我系统上的真实姓名。
      • 抱歉,刚刚发现它 Dim rs As ADODB.Recordset 应该是 Dim rs As New ADODB.Recordset
      • 没问题。我按照你说的改了,但没有运气。
      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-10
        • 1970-01-01
        • 2019-06-25
        • 2020-02-24
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多