【问题标题】:How do I run a Stored procedure with parameters from Excel VBA string?如何使用 Excel VBA 字符串中的参数运行存储过程?
【发布时间】:2020-07-02 21:26:15
【问题描述】:

我正在尝试使用 VBA 从 Excel 运行存储过程,但我收到以下代码的“类型不匹配”错误。我可以执行一个存储过程,其参数作为一个字符串传递给 Command 对象,如下所示?

Function Sproc()
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim ConnectionString As String
    Dim StrSproc As String

    ConnectionString = "Provider=SQLOLEDB;Data Source=DBSource;" & _
                  "Initial Catalog=CurrentDb;" & _
                  "Integrated Security=SSPI;"

    'Opens connection to the database
    cnn.Open ConnectionString

    'Timeout error in seconds for executing the entire query; this will run for 15 minutes
    'before VBA times out, but your database might timeout before this value

    cnn.CommandTimeout = 900

    StrSproc = "EXEC StoredProcedure " & _
                    "@parameter1 = 0," & _
                    "@parameter2 = 0," & _
                    "@parameter3 = 0,"

        Application.StatusBar = "Running stored procedure..."
        Set rst = cmd.Execute(, , StrSproc)
End Function

【问题讨论】:

  • 您的问题在哪里?在哪一行抛出异常?错误信息是什么?

标签: excel vba stored-procedures


【解决方案1】:

试试这个:

Option Explicit

Function Sproc()
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim cnnStr As String
    Dim Rs As New ADODB.Recordset
    Dim StrSproc As String

    cnnStr = "Provider=SQLOLEDB;Data Source=DBSource;" & "Initial Catalog=CurrentDb;" & _
             "Integrated Security=SSPI;"
    With cnn
        .CommandTimeout = 900
        .ConnectionString = cnnStr
        .Open
    End With
    With cmd
        .ActiveConnection = cnn
        .CommandType = adCmdStoredProc
        .CommandText = "[StoredProcedureName]"
        .Parameters.Append .CreateParameter("@parameter1", adInteger, adParamInput, , 0)
        .Parameters.Append .CreateParameter("@parameter2", adInteger, adParamInput, , 0)
        .Parameters.Append .CreateParameter("@parameter2", adInteger, adParamInput, , 0)
    End With
    With Rs
        .CursorType = adOpenStatic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open cmd
    End With
    Application.StatusBar = "Running stored procedure..."
    Set rst = cmd.Execute
End Function

【讨论】:

  • .ActiveConnection = cnn 抛出 Object variable or With block variable not set。但可能是我的错误连接字符串:/ 如果我不想使用 OLEDB 而是直接使用数据库怎么办?
【解决方案2】:

这是我的首选方法:

Function Sproc()
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim ConnectionString As String
    Dim StrSproc As String

    Set cnn = New ADODB.Connection
    cnn.ConnectionString = "Provider=SQLOLEDB;Data Source=DBSource;" & _
                  "Initial Catalog=CurrentDb;" & _
                  "Integrated Security=SSPI;"

    'Opens connection to the database
    On Error GoTo SQL_ConnectionError
    cnn.Open ConnectionString
    On Error GoTo 0
    'Timeout error in seconds for executing the entire query; this will run for 15 minutes before VBA timesout, but your database might timeout before this value
    cnn.CommandTimeout = 900

    Set rst = New ADODB.Connection
    StrSproc = "set nocount on; "
    StrSproc = StrSproc & "EXEC StoredProcedure " & _
                        "@parameter1 = 0," & _
                        "@parameter2 = 0," & _
                        "@parameter3 = 0 "
    rst.ActiveConnection = cnn
    On Error GoTo SQL_StatementError
    rst.Open StrSproc
    On Error GoTo 0

    If Not rst.EOF And Not rst.BOF Then
        Sproc = IIF(IsNull(rst.Fields(0).Value), "(BLANK)", rst.Fields(0).Value)
    EndIf

    Exit Function

    SQL_ConnectionError:
    Msgbox "Error connecting to the server / database. Please check the connection string."
    Exit Function

    SQL_StatementError:
    Msgbox "Error with the SQL syntax. Please check StrSproc."
    Debug.Print StrSproc
    Exit Function

End Function

试一试,告诉我你的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-02
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多