Reputation: 571
Seems to be a common question, but I cannot get any examples to work with my code.
Sorry in advance if this is trivial as I'm a DBA and not a developer.
I have a stored procedure that requires two parameters LaborRate
and EndDate
. LaborRate
is a decimal data type and will get its variable from worksheet BOMSum
and cell G1. EndDate
is a date data type and will get its variable from worksheet BOMSum
and cell G2. All of my attempts have failed even after looking through tutorials and other recommendations on this website.
Here's my very simple code I started out with that actually runs correct but runs without specifying any params:
Sub Execute_SP()
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=<ServerName>;Initial Catalog=<DB>;User ID=<DB_User>;Password=<pwd>"
conn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "CostingInfo"
cmd.Execute
conn.Close
Set conn = Nothing
Set cmd = Nothing
ActiveWorkbook.RefreshAll
End Sub
Here's what I have now. I'm trying to pass two parameters LaborRate
and EndDate
from cell G1 and G2.
Sub Execute_SP()
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim prm1 As ADODB.Parameter
Dim prm2 As ADODB.Parameter
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=<ServerName>;Initial Catalog=<DB>;User ID=<DB_User>;Password=<pwd>"
conn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = CostingInfo
prm1 = cmd.CreateParameter("@LaborRate", adDecimal, adParamInput)
prm1.Precision = 28
prm1.NumericScale = 4
cmd.Parameters.Append prm1
prm1.Value = ActiveSheet.Range("G1").Text
prm2 = cmd.CreateParameter("@endDate", adDate, adParamInput)
prm2.Value = ActiveSheet.Range("G2").Text
cmd.Parameters.Append prm2
cmd.Execute
conn.Close
Set conn = Nothing
Set cmd = Nothing
ActiveWorkbook.RefreshAll
End Sub
I've gotten errors regarding precision and object variable or with block variables not set. I'm stumped and very removed from VBA programming.
EDIT: After some suggestions by Rude Dawg, here's is my code now. I'm now getting a "Syntax error or access violation" error, which when is debugged points to the cmd.Execute section having the issue:
Sub Execute_SP()
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim prm1 As ADODB.Parameter
Dim prm2 As ADODB.Parameter
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=<ServerName>;Initial Catalog=<DB>;User ID= <DB_User>;Password=<pwd>"
conn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = CostingInfo
set prm1 = cmd.CreateParameter("@LaborRate", adDecimal, adParamInput)
prm1.Precision = 28
prm1.NumericScale = 4
prm1.Value = Sheets("BOMSum").Range("G1").VALUE
cmd.Parameters.Append prm1
set prm2 = cmd.CreateParameter("@endDate", adDate, adParamInput)
prm2.Value = Sheets("BOMSum").Range("G2").VALUE
cmd.Parameters.Append prm2
cmd.Execute
conn.Close
Set conn = Nothing
Set cmd = Nothing
ActiveWorkbook.RefreshAll
End Sub
Upvotes: 0
Views: 4296
Reputation: 571
Ended up finding the issue.
After bashing my head against my keyboard, I found out that I didn't have double quotes around my stored procedure name.
Here's my end result if anyone is interested:
Sub Execute_SP()
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim prm1 As ADODB.Parameter
Dim prm2 As ADODB.Parameter
Dim rs As ADODB.Recordset
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=SQLOLEDB;Data Source=<ServerName>;Initial Catalog=<DB>;User ID= <DB_User>;Password=<pwd>"
conn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
Set prm1 = cmd.CreateParameter("@LaborRate", adDecimal, adParamInput, 14, ThisWorkbook.Sheets("BOMSumTbl").Range("G1").Value)
prm1.Precision = 28
prm1.NumericScale = 4
cmd.Parameters.Append prm1
Set prm2 = cmd.CreateParameter("@EndDate", adDate, adParamInput, 7, ThisWorkbook.Sheets("BOMSumTbl").Range("G2").Value)
cmd.Parameters.Append prm2
cmd.CommandText = "CostingInfo"
Set rs = cmd.Execute(adCmdStoredProc)
conn.Close
Set conn = Nothing
Set cmd = Nothing
Set rs = Nothing
ActiveWorkbook.RefreshAll
End Sub
Upvotes: 1
Reputation: 88
try this slight mod to your entry.
set prm1 = cmd.CreateParameter("@LaborRate", adDecimal, adParamInput)
prm1.Precision = 28
prm1.NumericScale = 4
cmd.Parameters.Append prm1
prm1.Value = Sheets("BOMSum").Range("G1").VALUE
set prm2 = cmd.CreateParameter("@endDate", adDate, adParamInput)
prm2.Value = Sheets("BOMSum").Range("G2").VALUE
cmd.Parameters.Append prm2
also, why are you appending prm1 before you pulled the cell "G1" value? Is that a slight typo?
Upvotes: 1