【问题标题】:Calling a Stored Procedure in Access 2007 from VB 6.0从 VB 6.0 调用 Access 2007 中的存储过程
【发布时间】:2011-05-15 04:33:48
【问题描述】:

我需要从 VB 6.0 中的程序调用在 Access 2007 中创建的存储过程。

当您右键单击时,这是 Access db 上的工作存储过程 -> 设计视图:

PARAMETERS prodCode Text ( 255 ), orderNum Text ( 255 );
SELECT Sum(FullPrice) AS Expr1
FROM Transacs
WHERE (((Transacs.prodcode)=[prodCode]) AND ((Transacs.ordernum)=[orderNum]) AND ((Transacs.Type)='R'));

这是需要在 VB 6.0 中修复的代码:

Set TransRs = New ADODB.Recordset
Dim transcommQuery As String
transcommQuery = "execute SP_SumOfTransComm " & prodcode & " " & orderNum

TransRs.Open transcommQuery, db, adOpenDynamic, adLockBatchOptimistic

第 3 行:transcommQuery = "execute SP_SumOfTransComm " & selProdcode & " " & selPolNo 是我需要修复的。如何从那里正确调用存储过程?

【问题讨论】:

    标签: stored-procedures vb6 ms-access-2007 adodb


    【解决方案1】:

    您可以使用 Command 对象来调用存储过程。详细信息可以看here

    您的代码如下所示:

    Dim Cmd1 As ADODB.Command
    Set Cmd1 = New ADODB.Command
    Cmd1.ActiveConnection = db
    Cmd1.CommandText = "SP_SumOfTransComm"
    Cmd1.CommandType = adCmdStoredProc
    Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarWChar, , 255, prodcode)
    Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarWChar, , 255, orderNum)
    Dim TransRs As ADODB.Recordset
    Set TransRs = Cmd1.Execute()
    

    【讨论】:

    • 这看起来几乎正确,但是在 Command 对象上调用 Execute 总是返回一个只读的、只进的游标。我相信您需要创建一个新的 Recordset 对象并在其上调用 Open,将 Command 对象作为 Source 参数传递(没有 Connection 参数,因为您已经设置了 ActiveConnection)。这允许您请求特定的锁定和游标类型。
    • 谢谢。我会试试这个,因为使用 Execute 不起作用。我猜应该是TransRS.Open Cmd1, db
    • 由于某种原因,在执行 Append 时,它在存储过程中添加了更多的 {?},而不是 2 个参数,现在它有 4 个。所以我用我的答案中看到的直接文本命令来解决它。
    【解决方案2】:

    您的参数应该用引号括起来并用逗号分隔,例如

    transcommQuery = "EXECUTE SP_SumOfTransComm '@prodcode', '@orderNum';"
    transcommQuery = Replace$(transcommQuery, "@prodcode", prodcode)
    transcommQuery = Replace$(transcommQuery, "@orderNum", orderNum)
    

    ...但是你必须担心转义引号和其他类似的问题。

    最好使用带有强类型Parameter 对象的Command 对象,并让OLE DB 提供程序处理清理值。有关示例代码,请参阅@MicSim 的答案。

    【讨论】:

      【解决方案3】:

      它现在对我有用,执行以下操作:

      Set TransRs = New ADODB.Recordset
      Dim transcommQuery As String
      
      transcommQuery = "{ call SP_SumOfTransComm('" & prodcode & "','" & orderNum & "') }"
      
      TransRs.Open transcommQuery, db, adOpenDynamic, adLockBatchOptimistic
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多