5

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
1
  • 1
    Where is your problem? On which line is an exception being thrown? What is the error message? Commented Aug 13, 2015 at 12:15

2 Answers 2

14

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
Sign up to request clarification or add additional context in comments.

1 Comment

.ActiveConnection = cnn throws Object variable or With block variable not set. But probably its my wrong connetion string :/ what if i dont want to use OLEDB but database directly ?
4

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.