Newsgroup: it.comp.lang.visual-basic
Titolo: [?][forseOT] ADO e parametri di Stored Procedures

Sto scrivendo un'applicazione che si connette a un DBMS SQL Server via
ADO. Tutto bene finche' non si e' trattato di scrivere stored
procedures con parametri di output.....
In particolare ho scritto una stored procedure che riceve alcuni
parametri di input e un parametro di output. Questo l'ho dovuto fare
perche' il tipo restituito deve essere di tipo real (il tipo double di
VB).
Premetto che sono CERTO che la stored procedure funziona e da i
risultati sperati: l'ho verificato tramite il query analizer prima di
scrivere il codice VB.
Ora, il problema e' che, per quanto faccia, non riesco in alcun modo a
vedere il valore in output da codice.
In prima battuta, ho fatto come dice l'articolo "ADO and SQL Server
Developer's Guide", ma in qualsiasi modo io chiami il parametro di
output o qualsiasi tipo io gli dia, ADO mi manda una bella eccezione
dicendo che il numero di parametri e' errato.
Poi ho scoperto che i parametri vengono automaticamente importati, e
quindi ho evitato di crearli (l'unico problema sta nel fatto che in
questo caso e' necessario costruire i parametri con il nome preceduto
da @, come in SQL server); ho risolto il problema del numero di
parametri e riesco a passare i parametri in input senza problemi, ma
comunque non riesco a vedere il valore del parametro in output.
Confesso che sono abbastanza alla disperazione.
Non e' che qualcuno di voi abbia gia' affrontato e risolto il
problema??
Se si, lo ringrazio in anticipo per la risposta!!
Ciao!
Luca Menegotto.

Ciao Luca,
ti allego del codice che uso per utilazzare una stored procedure e
utilizzare i valori di output.
Spero che ti risolva il problema.
Ciao Luca
   Dim comm As ADODB.Command
   Set comm = New ADODB.Command
   With comm
      .ActiveConnection = con   'oggetto Connection precedentemente
inizializzato e aperto
      .CommandText = "msp_miastored"
      .CommandType = adCmdStoredProc
      With .Parameters
         .item("@param1").Value = Param1
         .item("@param2").Value = Param2
         .item("@param3").Value = Param3
      End With
      .Execute
      With .Parameters
         Param1 = .item("@Param1").Value
         Param2 = .item("@Param2").Value
         Param4 = .item("@Param4").Value
         Param5 = .item("@Param5").Value
      End With
   End With
   Set comm = Nothing

Ma porco cane!! Faccio esattamente la stessa cosa!!!!
Ascolta, ti posto un po' di roba, chissa' che due occhi in piu' vedano
meglio dei miei due, vecchi e stanchi....
1) Questa e' la stored procedure. Nota che e' testata.
--  procedura per il calcolo del saldo ore
CREATE PROCEDURE qryCalcolaSaldoAssistenze
    @parID int,
    @parPagamento bit,
    @parOmnitech bit,
    @parData datetime,
    @parRisultato real OUTPUT
AS
Declare @tmpAssistenza real
Declare @tmpContratti real
Execute qryTotaleAssistenze @parID, @parPagamento, @parOmnitech, 
        @parData, @parRisultato = @tmpAssistenza OUTPUT
Execute  qryTotaleContratti  @parID, @parPagamento, 
	 @parOmnitech, @parData, @parRisultato= @tmpContratti OUTPUT
SELECT @parRisultato =@tmpContratti - @tmpAssistenza
------------------
2) Questa e' la funzione generica VB che ho scritto. Nota che se la
specializzo il risultato non cambia.
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
-----------------
3) e questa e' la chiamata alla funzione. Il parametro @parRisultato
e' quello destinato a contenere l'output.
    arrayApp = Array(346, -1, 0, CDate(31 / 1 / 2000), 0#)
    OpenStoredProcTest cnsGlobal, "qryCalcolaSaldoAssistenze", _
                   Array("@parID", "@parPagamento", "@parOmnitech", _
                         "@parData", "@parRisultato"), _
                   arrayApp
Il risultato che ottengo e' sempre 0, indipendentemente da quel che
faccio!!! Nota che se il valore lo passo via return value, mi arriva
giusto, salvo il fatto che, dovendo essere il return value sempre
intero, non va bene per le mie esigenze.....
Vedi qualcosa che non va??
Ciao!
Luca Menegotto.
