【问题标题】:Issues passing parameters to stored procedure with Excel VBA使用 Excel VBA 将参数传递给存储过程的问题
【发布时间】:2014-11-19 08:38:18
【问题描述】:

似乎是一个常见问题,但我找不到任何示例来处理我的代码。

如果这是微不足道的,请提前抱歉,因为我是 DBA 而不是开发人员。

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

这是我开始使用的非常简单的代码,它实际上运行正确,但在没有指定任何参数的情况下运行:

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

【问题讨论】:

    标签: vba excel stored-procedures parameter-passing


    【解决方案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 ?是不是有点错别字?

    【讨论】:

    • 先生。道格,谢谢你的建议。那确实是一个错字。我已经使用了您的建议,但它引发了“下标超出范围”错误。当我调试时,它会突出显示这行代码: prm1.Value = Sheets("BOMSum").Range("G1").Value
    • 您肯定有一个名为“BOMSum”的工作表,对吗?确保 prm1 参数具有 .value 属性。如果这两个都是真的,我唯一能想到的就是尝试 'thisworkbook.sheets("BOMSum").Range("G1").value'
    • 是的。肯定有一张名为“BOMSum”的表格。更改后,它会在代码的“cmd.Execute”部分引发语法错误或访问冲突错误。
    • 很抱歉,这超出了我的知识范围。我希望有人可以加入更多的见解。我唯一能想到的是 cmd 没有执行,但我认为它有。也许你需要 cmd.parameters.execute?不过我现在不知道,只是在黑暗中刺伤。
    • 没问题!感谢您为此付出的努力!
    【解决方案2】:

    最终找到了问题。

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

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

    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
    

    【讨论】:

    • 我在存储的过程名称周围有一个类似的问题:[[spDistPOCheckOrderConfirmation_byLine]]
    猜你喜欢
    • 2021-12-29
    • 2017-02-19
    • 2016-04-05
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多