2014-09-24 29 views
0

似乎是一个常见问题,但我无法获得任何示例来处理我的代码。使用Excel VBA将参数传递给存储过程的问题

对不起,如果这是微不足道的,因为我是DBA而不是开发人员。

我有一个存储过程,需要两个参数LaborRateEndDateLaborRate是一个十进制数据类型,将从工作表BOMSum和单元格G1中获取它的变量。 EndDate是日期数据类型,将从工作表BOMSum和单元格G2中获取其变量。即使浏览了本网站上的教程和其他建议,我的所有尝试都失败了。

这是我非常简单的代码我开始了实际运行正确的,但不指定任何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 

这是我现在有。我试图从G1和G2传递两个参数LaborRateEndDate

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 

我已经收到有关精度和对象变量或块变量未设置的错误。我很困惑,很难从VBA编程中移除。

编辑:经过Rude Dawg的一些建议,现在是我的代码。现在我得到一个“语法错误或访问冲突”错误,这在调试点,遇到的问题的cmd.Execute部分:

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 

回答

1

结束查找问题。

在将我的头撞向我的键盘后,我发现我的存储过程名称周围没有双引号。

这里是我的最终结果,如果有人有兴趣:

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 
+0

我有一个类似的问题与我的存储过程名称的双括号:'[[spDistPOCheckOrderConfirmation_byLine]]' – nutsch 2016-09-19 18:30:09

1

尝试这种轻微的mod输入。

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 

另外,为什么在添加单元格“G1”值之前添加prm1?这是一个轻微的错字?

+0

耶先生,感谢您的建议。这确实是一个错字。我用你的建议,它抛出一个“下标超出范围”的错误。当我调试时,它突出显示了这一行代码:prm1.Value = Sheets(“BOMSum”)。Range(“G1”)。Value – jdidsQAA 2014-09-24 20:00:36

+0

你肯定有一张名为'BOMSum'的表是否正确?确保prm1参数具有.value属性。如果这两个都是真的,我唯一能想到的就是尝试'thisworkbook.sheets(“BOMSum”)。Range(“G1”)。value' – 2014-09-24 20:38:30

+0

Yup。绝对有一张名为“BOMSum”的表。更改后,它会在代码的“cmd.Execute”部分引发语法错误或访问冲突错误。 – jdidsQAA 2014-09-24 20:51:22

相关问题