【问题标题】:VBA error when executing a sybase stored procedure执行 sybase 存储过程时出现 VBA 错误
【发布时间】:2011-11-11 00:59:39
【问题描述】:

我有以下代码通过 VBA 在 Sybase 中执行存储过程。

Sub GetInfo()

    Dim rstRUB As ADODB.Recordset
    Dim strRUB As String
    Dim strcnn As String
    Dim productType As String
    Dim DealId As String

    strcnn = "DSN=...;DATABASE=...;UID=...;PWD=...;"
    Set cnn = New ADODB.Connection
    cnn.Open strcnn

    Set rstRUB = New ADODB.Recordset

    Set ws = Workbooks("BODN_CPOTC.xls").Sheets("BODN_CPOTC")

    Dim row As Long
    row = 5

    While ws.Cells(row, 1) <> ""
        productType = ws.Cells(row, 1)
        DealId = ws.Cells(row, 3)



        Set cmd = New ADODB.Command
        With cmd
        .CommandText = "[Proc_BO_Deriv_AFOFLD]"
        .ActiveConnection = cnn
        .CommandType = adCmdStoredProc

        '.Parameters.Append .CreateParameter("@valueD", adDate, adParamInput, , strDate)
        '.Parameters.Append .CreateParameter("@maturityD", adDate, adParamInput, , Format$("20100504", "YYYYMMDD"))
        .Parameters.Append .CreateParameter("@tipoProduto", adVarChar, adParamInput, 9, productType)
        .Parameters.Append .CreateParameter("@dealId", adInteger, adParamInput, 0, DealId)
        End With


        rstRUB.Open cmd.Execute

        If rstRUB.EOF = False Then
            ws.Cells(row, 5) = rstRUB.Fields(0).Value
            ws.Cells(row, 6) = rstRUB.Fields(1).Value
            ws.Cells(row, 7) = rstRUB.Fields(2).Value
            ws.Cells(row, 8) = rstRUB.Fields(3).Value
            ws.Cells(row, 9) = rstRUB.Fields(4).Value
            ws.Cells(row, 10) = rstRUB.Fields(5).Value
            ws.Cells(row, 11) = rstRUB.Fields(6).Value
            ws.Cells(row, 12) = rstRUB.Fields(7).Value
            ws.Cells(row, 13) = rstRUB.Fields(8).Value
            ws.Cells(row, 14) = rstRUB.Fields(9).Value
            ws.Cells(row, 15) = rstRUB.Fields(10).Value
            ws.Cells(row, 16) = rstRUB.Fields(11).Value
            ws.Cells(row, 17) = rstRUB.Fields(12).Value
            ws.Cells(row, 18) = rstRUB.Fields(13).Value
            ws.Cells(row, 19) = rstRUB.Fields(14).Value
            ws.Cells(row, 20) = rstRUB.Fields(15).Value
            ws.Cells(row, 21) = rstRUB.Fields(16).Value
            ws.Cells(row, 22) = rstRUB.Fields(17).Value
            ws.Cells(row, 23) = rstRUB.Fields(18).Value
            ws.Cells(row, 24) = rstRUB.Fields(19).Value
            ws.Cells(row, 25) = rstRUB.Fields(20).Value
            ws.Cells(row, 26) = rstRUB.Fields(21).Value
            ws.Cells(row, 27) = rstRUB.Fields(22).Value
            ws.Cells(row, 28) = rstRUB.Fields(23).Value
            ws.Cells(row, 29) = rstRUB.Fields(24).Value
            ws.Cells(row, 30) = rstRUB.Fields(25).Value
            ws.Cells(row, 31) = rstRUB.Fields(26).Value
            ws.Cells(row, 32) = rstRUB.Fields(27).Value
        Else
            ws.Cells(row, 5) = "Deal Not Found"
        End If


        row = row + 1
    Wend


End Sub

第一个存储过程执行效果很好,但是当它进入第二个时

rstRUB.Open cmd.Execute

程序没有结束..

我已经切换了参数(第一个和第二个),程序不会在第二次结束。

你知道我做错了什么吗?

提前致谢!

【问题讨论】:

    标签: sql vba excel sybase


    【解决方案1】:

    不知道为什么Set rstRUB = cmd.Execute 会给出编译错误...

    你也可以尝试这样的调用:

    rstRUB.Open cmd
    

    不需要在 Open 命令中调用 cmd 的 execute 方法,因为 Open 命令会触发查询执行。这是记录集打开命令的链接:http://msdn.microsoft.com/en-us/library/ms675544(VS.85).aspx

    在增加行数以为下一个循环做好准备后,还可能有助于清除 cmd 和 rstRUB 对象的内存。

    Set cmd = Nothing
    Set rstRUB = Nothing
    

    【讨论】:

    • 是这样的 :) 我每次都必须打开和“关闭”连接
    【解决方案2】:

    尝试set rstRUB = cmd.execute 而不是rstRUB.Open cmd.Execute

    【讨论】:

      【解决方案3】:

      我建议您为命令对象设置超时属性:

      http://msdn.microsoft.com/en-us/library/ms678265(v=VS.85).aspx

      至少你会拿回你的申请。

      我怀疑您的参数有错误 - 名称、类型或您传递的参数数量;或者更糟糕的是,SQL 中有错误。不幸的是,一些 OLEDB 数据库提供程序及其相关驱动程序没有很好地实现错误处理,我怀疑除了“超时”消息之外,您不会从 Connection 对象的错误集合中得到任何信息。

      因此,您的任务是捕获 SQL 和参数集合,并将其粘贴到您为数据库服务器获得的任何 SQL 开发窗口中:VBA 中的错误非常非常常见在您尝试手动运行 SQL 的过程中不可见地更正参数集。

      【讨论】:

        猜你喜欢
        • 2014-07-03
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        • 2023-03-15
        • 1970-01-01
        相关资源
        最近更新 更多