2010-07-16 4 views
2

J'ai une procédure stockée SQL Server 2008 qui met à jour les valeurs dans une table. Je voudrais que la procédure stockée renvoie une valeur entière indiquant que la mise à jour a réussi (return 0) ou non (renvoie le numéro d'erreur). Quel serait le meilleur moyen d'y parvenir via ADO et VBA? Voici quelques-uns de mon code sous une forme simplifiée qui effectue la mise à jour ... Je ne suis pas sûr comment récupérer la valeur de retour de la procédure stockéeValeur renvoyée indiquant la réussite de la mise à jour/l'échec de la procédure stockée SQL Server via ADO/VBA

Public Function DoUpdate(employeeID as integer, firstName as string, lastname as string) as integer 

    Dim cnn As ADODB.Connection 
    Dim cmd As ADODB.Command 
    Dim activeConnectionString As String 

    activeConnectionString = GetActiveConnectionString() 

    Set cnn = New ADODB.Connection 
    cnn.ConnectionString = activeConnectionString 
    cnn.CursorLocation = adUseClient 
    cnn.Open 

    Set cmd = New ADODB.Command 
    cmd.ActiveConnection = cnn 
    cmd.CommandType = adCmdStoredProc 
    cmd.CommandText = "uspUpdateEmployeeName" 
    cmd.NamedParameters = True 

    cmd.Parameters("@EmployeeID").Value = employeeID 
    cmd.Parameters("@FirstName").Value = firstName 
    cmd.Parameters("@LastName").Value = lastName 

    cmd.Execute 

    'Unsure of how to get back return value here 
    'DoUpdate = returnValue 

    Set cnn = Nothing 

End Function 

Répondre

2

Si vous utilisez

Dim lngRecs As Long 

cmd.Execute lngRecs 

lngRecs devrait contenir des enregistrements affectés.

2

me semble me rappeler que vous devez fournir un paramètre supplémentaire du type « adParamReturnValue » comme ceci:

Dim lRetVal as Long 

Set cmd = New ADODB.Command 
cmd.Parameters.Append .CreateParameter("returnvalue", adInteger, adParamReturnValue) 

cmd.Execute 

'Now check the return value of the procedure 
lRetVal = cmd.Parameters("returnvalue") 

If lRetVal > 0 then 
4

Note: Le return_value doit être le premier paramètre !

L'ordre est important.

Je recevais des erreurs indiquant que ma requête "had too many arguments" lorsque j'avais spécifié mon dernier paramètre return_value, au lieu de la première.

La commande des paramètres était la cause de mon erreur.

0

Plusieurs voies sont possibles pour obtenir des valeurs de retour en utilisant VBA:

  1. Recordset
  2. Nombre d'enregistrements affectés (uniquement pour Insérer/Mise à jour/Supprimer sinon -1)
  3. paramètre de sortie
  4. Retour valeur

Mon code illustre tous les quatre. Voici une procédure stockée qui renvoie une valeur:

Create PROCEDURE CheckExpedite 
    @InputX varchar(10), 
    @InputY int, 
    @HasExpedite int out 
AS 
BEGIN 
    Select @HasExpedite = 9 from <Table> 
    where Column2 = @InputX and Column3 = @InputY 

    If @HasExpedite = 9 
     Return 2 
    Else 
     Return 3 
End 

Voici le sous-article que j'utilise dans Excel VBA. Vous aurez besoin de référence à la bibliothèque Microsoft ActiveX Data Objects 2.8.

Sub CheckValue() 

    Dim InputX As String: InputX = "6000" 
    Dim InputY As Integer: InputY = 2014 

    'open connnection 
    Dim ACon As New Connection 
    'ACon.Open ("Provider=SQLOLEDB;Data Source=<SqlServer>;" & _ 
    ' "Initial Catalog=<Table>;Integrated Security=SSPI") 

    'set command 
    Dim ACmd As New Command 
    Set ACmd.ActiveConnection = ACon 
    ACmd.CommandText = "CheckExpedite" 
    ACmd.CommandType = adCmdStoredProc 

    'Return value must be first parameter else you'll get error from too many parameters 
    'Procedure or function "Name" has too many arguments specified. 
    ACmd.Parameters.Append ACmd.CreateParameter("ReturnValue", adInteger, adParamReturnValue) 
    ACmd.Parameters.Append ACmd.CreateParameter("InputX", adVarChar, adParamInput, 10, InputX) 
    ACmd.Parameters.Append ACmd.CreateParameter("InputY", adInteger, adParamInput, 6, InputY) 
    ACmd.Parameters.Append ACmd.CreateParameter("HasExpedite", adInteger, adParamOutput) 

    Dim RS As Recordset 
    Dim RecordsAffected As Long 

    'execute query that returns value 
    Call ACmd.Execute(RecordsAffected:=RecordsAffected, Options:=adExecuteNoRecords) 

    'execute query that returns recordset 
    'Set RS = ACmd.Execute(RecordsAffected:=RecordsAffected) 

    'get records affected, return value and output parameter 
    Debug.Print "Records affected: " & RecordsAffected 
    Debug.Print "Return value: " & ACmd.Parameters("ReturnValue") 
    Debug.Print "Output param: " & ACmd.Parameters("HasExpedite") 

    'use record set here 
    '... 

    'close 
    If Not RS Is Nothing Then RS.Close 
    ACon.Close 

End Sub 
Questions connexes