Newsgroup: it.comp.lang.visual-basic
Titolo: ADO e parametri stored procedures. EUREKA!!

Qualche giorno fa ho postato un messaggio in cui chiedevo informazioni
circa i parametri di ritorno delle stored procedures; da quello, dalle
informazioni di un certo Luca (che non so chi sia ma che desidero
ringraziare perche' le informazioni che mi ha dato sono state
preziose) e dalle baruffe successive ho raggiunto i risultati sperati.
Spiego il problema e la soluzione, casomai qualcuno dovesse averne uno
simile.
Allora, tutto nasce dal fatto che io - forse per una questione di
scarsa sanita' mentale - cerco sempre di scrivere codice che sia
riutilizzabile. Nel caso specifico, stavo cercando di espandere la mia
piccola libreria di helpers ADO (a proposito, dovessero interessare a
qualcuno... ;-) ) con una funzione generica per l'utilizzo delle
stored procedures di SQL server. La funzione che avevo scritto era la
seguente:
Public Function OpenStoredProc(cnsApp As ADODB.Connection, _
                       strStoredProcedure As String, _
                       arrayParameters As Variant, _
                       arrayValues As Variant, _
                       Optional rstResult As ADODB.Recordset =
Nothing) As Long
 
    Dim cmdApp As ADODB.Command
    Dim iApp As Integer
 
    If LBound(arrayParameters) <> LBound(arrayValues) Or _
       UBound(arrayParameters) <> UBound(arrayValues) Then
        Err.Raise vbObjectError + 1, "OpenStoredProc", _
            "Numero parametri errato"
    End If
 
    Set cmdApp = New ADODB.Command
 
    cmdApp.ActiveConnection = cnsApp
    cmdApp.CommandType = adCmdStoredProc
    cmdApp.CommandText = strStoredProcedure
 
    ''  compilazione dei parametri
    ''  nota: solo i parametri input e input/output
    For iApp = LBound(arrayValues) To UBound(arrayValues)
        With cmdApp.Parameters(arrayParameters(iApp))
            If .Direction = adParamInput Or .Direction =
adParamInputOutput Then
                .Value = arrayValues(iApp)
            End If
        End With
    Next
 
    Set rstResult = cmdApp.Execute
 
    OpenStoredProc = 0
 
    ''  aggiornamento dei valori connessi ai parametri in output e
    ''  input/output
    For iApp = LBound(arrayValues) To UBound(arrayValues)
        With cmdApp.Parameters(arrayParameters(iApp))
            If .Direction = adParamOutput Or .Direction =
adParamInputOutput Then
                arrayValues(iApp) = .Value
            End If
        End With
    Next
 
    ''  riporto di un eventuale valore di ritorno
    For iApp = 0 To cmdApp.Parameters.Count - 1
        If cmdApp.Parameters(iApp).Name = "RETURN_VALUE" Then
            OpenStoredProc = cmdApp.Parameters(iApp).Value
            Exit For
        End If
    Next
End Function
Con questa intendevo coprire tutti i casi possibili, sia nel caso in
cui la mia stored procedure avesse restituito un recordset, sia nel
caso in cui l'eventuale risultato fosse passato attraverso un
parametro di output; da notare che le due cose insieme non sono
possibili perche', come dice la documentazione, qualora la stored
procedure restituisca un recordset, i parametri di output sarebbero
aggiornati di fatto solo alla chiusura del recordset stesso.
Bene, la funzione non eseguiva quello che volevo io!! Il parametro di
ouput che avevo definito nella stored procedure non veniva MAI
aggiornato, e questo non ostantee non avessi errori da nessuna  parte.
Bene, dopo un po' di prove, ho scoperto che il tutto era dovuto a una
semplice, piccola, insignificante riga, ovvero:
     Set rstResult = cmdApp.Execute
Rimossa infatti l'assegnazione al recordset risultato, il tutto ha
cominciato a funzionare correttamente.
Di conseguenza, ho ritenuto opportuno sdoppiare la funzione in due
funzioni piu' specializzate, ciascuna che persegue un risultato
specifico. Ne allego il codice.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''  ExecuteStoredProc
''  Helper per l'esecuzione di una stored procedure. I parametri
''  vanno indicati attraverso arrayParameters e arrayValues,
''  rispettivamente destinati a contenere il nom dei parametri e i
''  valori in essi contenuti. L'array dei valori viene anche
''  utilizzato per conservare i valori di ritorno dei parametri
''  indicati come di output nella stored procedure
''
Public Function ExecuteStoredProc(cnsApp As ADODB.Connection, _
                                  strStoredProcedure As String, _
                                  arrayParameters As Variant, _
                                  arrayValues As Variant) As Long
 
    Dim cmdApp As ADODB.Command
    Dim iApp As Integer
 
    If LBound(arrayParameters) <> LBound(arrayValues) Or _
       UBound(arrayParameters) <> UBound(arrayValues) Then
        Err.Raise vbObjectError + 1, "ExecuteStoredProc", _
            "Numero parametri errato"
    End If
 
    Set cmdApp = New ADODB.Command
 
    cmdApp.ActiveConnection = cnsApp
    cmdApp.CommandType = adCmdStoredProc
    cmdApp.CommandText = strStoredProcedure
 
    ''  compilazione dei parametri
    ''  nota: solo i parametri input e input/output
    For iApp = LBound(arrayValues) To UBound(arrayValues)
        With cmdApp.Parameters(arrayParameters(iApp))
            If .Direction = adParamInput Or .Direction =
adParamInputOutput Then
                .Value = arrayValues(iApp)
            End If
        End With
    Next
 
    cmdApp.Execute
 
    ExecuteStoredProc = 0
 
    ''  aggiornamento dei valori connessi ai parametri in output e
    ''  input/output
    For iApp = LBound(arrayValues) To UBound(arrayValues)
        With cmdApp.Parameters(arrayParameters(iApp))
            If .Direction = adParamOutput Or .Direction =
adParamInputOutput Then
                arrayValues(iApp) = .Value
            End If
        End With
    Next
 
    ''  riporto di un eventuale valore di ritorno
    For iApp = 0 To cmdApp.Parameters.Count - 1
        If cmdApp.Parameters(iApp).Name = "RETURN_VALUE" Then
            ExecuteStoredProc = cmdApp.Parameters(iApp).Value
            Exit For
        End If
    Next
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''  OpenStoredProcRS
''  Helper per l'esecuzione di una stored procedure che restituisce
''  un recordset.
''  I parametri vanno indicati attraverso arrayParameters e
arrayValues,
''  rispettivamente destinati a contenere il nom dei parametri e i
''  valori in essi contenuti.
''
Public Function OpenStoredProcRS(cnsApp As ADODB.Connection, _
                                 strStoredProcedure As String, _
                                 arrayParameters As Variant, _
                                 arrayValues As Variant) As
ADODB.Recordset
    Dim cmdApp As ADODB.Command
    Dim iApp As Integer
 
    If LBound(arrayParameters) <> LBound(arrayValues) Or _
       UBound(arrayParameters) <> UBound(arrayValues) Then
        Err.Raise vbObjectError + 1, "OpenStoredProcRS", _
            "Numero parametri errato"
    End If
 
    Set cmdApp = New ADODB.Command
 
    cmdApp.ActiveConnection = cnsApp
    cmdApp.CommandType = adCmdStoredProc
    cmdApp.CommandText = strStoredProcedure
 
    ''  compilazione dei parametri
    ''  nota: solo i parametri input e input/output
    For iApp = LBound(arrayValues) To UBound(arrayValues)
        With cmdApp.Parameters(arrayParameters(iApp))
            If .Direction = adParamInput Or .Direction =
adParamInputOutput Then
                .Value = arrayValues(iApp)
            End If
        End With
    Next
 
    Set OpenStoredProcRS = cmdApp.Execute
End Function
Ciao!
Luca Menegotto.

Ciao, mi fa piacere che seppur piccolo il mio aiuto ti sia servito.
Ciao
Luca Perazzo
cosě sai chi sono! :-)









