2010-09-14 44 views
0

我有以下代碼在Sybase到VBA中執行存儲過程。執行sybase存儲過程時發生VBA錯誤

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 

程序沒有結束..

我媒體鏈接切換參數(第一者與第二個),程序不會在第二次結束。

你知道我在做什麼錯嗎?

提前致謝!

回答

1

不知道爲什麼Set rstRUB = cmd.Execute會給編譯錯誤......

你也可以嘗試這樣的電話:

rstRUB.Open cmd 

無需調用cmd的執行方法在Open命令中,因爲Open命令觸發查詢執行。以下是指向recordset open命令的鏈接:http://msdn.microsoft.com/en-us/library/ms675544(VS.85).aspx

在增加行數以準備進行下一個循環之後,可能還會幫助清除cmd和rstRUB對象的內存。

Set cmd = Nothing 
Set rstRUB = Nothing 
+0

就像這樣:)我必須每次打開和「關閉」連接 – 2010-09-21 20:37:14

1

嘗試set rstRUB = cmd.execute代替rstRUB.Open cmd.Execute

+0

給編譯錯誤 – 2010-09-15 08:17:04

0

我會rcommend您設置的超時屬性爲您的命令對象:

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

至少你會得到你的應用程序了。

我懷疑你的參數 - 名稱,類型或你傳遞的參數數量有錯誤,或者更糟糕的是,SQL中有一個錯誤。不幸的是,一些OLEDB數據庫提供者及其相關驅動程序沒有很好地實現錯誤處理,並且我懷疑你不會從Connection對象的錯誤集合中得到任何東西,除了'超時'消息。

因此,您只需完成捕獲SQL和參數集合的任務,並將其粘貼到您爲數據庫服務器獲得的任何SQL開發窗口中即可:而且這種情況非常常見在嘗試手動運行SQL期間,VBA的參數集將被無形地修正。