Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I run a Stored procedure with parameters from Excel VBA string?

I am trying to run a stored procedure from Excel using VBA, but I'm getting a "Type Mismatch" error with the following code. Can I execute a Stored procedure with parameters as a string passed to the Command object as shown below?

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
like image 265
ibexy Avatar asked Dec 09 '22 02:12

ibexy


2 Answers

This is my preferred approach:

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

Give it a try and let me know what you think.

like image 32
Ralph Avatar answered Dec 11 '22 09:12

Ralph


Try this:

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
like image 127
paul bica Avatar answered Dec 11 '22 09:12

paul bica