0

Ich versuche, eine MSSQL gespeicherte Prozedur von Excel VBA mit ADODB 2.0-Bibliothek (versuchte 2.8 auch, aber das gleiche Problem existiert) , die sendet Ergebnismenge sowie Rückgabewert. Ich bin in der Lage, die Ergebnismenge Wert korrekt zu erhalten, aber nicht in der Lage Rückgabewert zu erhaltenIch bin nicht in der Lage, Rückgabewert der gespeicherten Prozedur, die Ergebnis zurückgibt sowie Rückgabewert

Unten ist die VBA-Prozedur für diesen Zweck verwendet und dies die folgenden Parameter (immer Rückgabewert als leer zu bekommen.): db connection, sp name, parameter values string array, db result set, spretval - letzt zwei sind Parameter aus

Private Sub execSQLSP(dbcon, spname, paramStrInArray, ByRef dbrs, ByRef spretval) 
Dim cmd As ADODB.Command 
Dim dberrflag As Integer 
Dim dberrdesc As String 
Dim ndx As Long 
Dim paramname As String 
On Error Resume Next 

Set cmd = New ADODB.Command 
Set cmd.ActiveConnection = dbcon 
cmd.CommandText = spname 
cmd.CommandType = adCmdStoredProc 

cmd.Parameters.Append cmd.CreateParameter("retVal", adInteger, _ 
              adParamReturnValue) 

For ndx = 0 To UBound(paramStrInArray) 
    paramname = "param" & ndx 
    cmd.Parameters.Append cmd.CreateParameter(Name:=paramname, _ 
           Type:=adVarChar, Direction:=adParamInput, _ 
           size:=Len(paramStrInArray(ndx)), _ 
           Value:=paramStrInArray(ndx)) 
Next 

Set dbrs = cmd.Execute  
Call getDBerror(dbcon.Errors, dberrflag, dberrdesc) 
If dberrflag = 1 Then 
    MsgBox "DB Error while executing following SQL command and hence stopping." & vbCrLf & _ 
      "SQL Cmd:" & spname & vbCrLf & _ 
      "DB Err.:" & dberrdesc, vbCritical, appnameversion 
    cleanup 
    End 
End If 
spretval = cmd.Parameters("retVal").Value 
MsgBox cmd.Parameters("retVal") 
End Sub 

nach Ausführung dieser VBA-Prozedur, Ergebnismenge immer mit, die ich bin in der Lage, die Ergebnismenge Wert korrekt zu erhalten, aber nicht Wert zurück. Ich bekomme nur einen leeren Wert (tatsächlich gibt der SP 10 zurück)

Die gespeicherte Prozedur enthält einige Verarbeitung, um Daten in temporäre Tabellen einzufügen, und schließlich alle Zeilen aus der temporären Tabelle über einen Auswahlbefehl zurück und danach zurückzukehren Wert.

Was könnte das Problem mit diesem Code sein?

Antwort

1

Ich habe den Rückgabewert erhalten, wenn ich den Rückgabewert nach dem Schließen des Recordset-Objekts abgefragt habe.

Offenbar reicht es nicht aus, das Recordset vollständig zu lesen; Das Recordset-Objekt muss ebenfalls geschlossen werden, damit die Rückgabe- und Parameterwerte im Befehlsobjekt aufgefüllt werden können. Ich konnte das in der ADO-Dokumentation nicht finden.

Es sieht so aus, als könnte dies ein ADO-Entwurfsproblem sein, dass Befehlsrückgabe-/Parameterwerte erst nach dem Schließen des Recordset-Objekts gefüllt werden.