2010-09-14 12 views
0

J'ai le code suivant qui exécute une procédure stockée dans Sybase via VBA.Erreur VBA lors de l'exécution d'une procédure stockée 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 

La première exécution procédure stockée fonctionne bien, mais quand il va pour la deuxième

rstRUB.Open cmd.Execute 

le programme ne se termine pas ..

Je allready commutées arguments (les premiers avec le deuxième) et le programme ne se terminera pas à la deuxième fois.

Savez-vous ce que je fais mal?

Merci d'avance!

Répondre

1

Je ne sais pas pourquoi Set rstRUB = cmd.Execute donnerait une erreur de compilation ...

vous pouvez aussi essayer un appel comme celui-ci:

rstRUB.Open cmd 

Pas besoin d'appeler le La méthode execute de cmd dans la commande Open, puisque la commande Open déclenche l'exécution de la requête. Voici un lien vers la commande d'ouverture de registre: http://msdn.microsoft.com/en-us/library/ms675544(VS.85).aspx

Peut également aider à effacer la mémoire des objets cmd et rstRUB après avoir incrémenter le nombre de lignes pour être prêt pour la prochaine boucle.

Set cmd = Nothing 
Set rstRUB = Nothing 
+0

c'est comme ça :) Je dois ouvrir et "fermer" la connexion à chaque fois –

1

essayer set rstRUB = cmd.execute au lieu de rstRUB.Open cmd.Execute

+0

qui donne l'erreur de compilation –

0

Je rcommend que vous définissez la propriété de délai d'attente pour votre objet de commande:

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

Au moins vous aurez votre demande de retour.

Je suppose qu'il y a une erreur dans vos paramètres - nom, type ou nombre de paramètres que vous transmettez; ou pire, il y a une erreur dans le SQL. Malheureusement, certains fournisseurs de bases de données OLEDB et leurs pilotes associés n'implémentent pas très bien la gestion des erreurs, et je suppose que vous n'obtiendrez rien de la collection d'erreurs de l'objet Connection, autre qu'un message 'Timeout'. Il vous reste donc la tâche de capturer le SQL et la collection de paramètres, et de le coller dans la fenêtre de développement SQL que vous avez pour le serveur de base de données: il est très, très courant pour une erreur dans le Le jeu de paramètres de VBA doit être corrigé de manière invisible lors de vos tentatives d'exécution manuelle du SQL.