0

Excel VBAからADODB 2.0ライブラリを使用してMSSQLストアドプロシージャを実行しようとしています(2.8も試しましたが同じ問題があります) 結果セットと戻り値を送信します。 (。常に空のように戻り値を取得)私は、結果セットの値が正しくなく、戻り値を取得することができませんが、取得することができる午前以下結果セットと戻り値を返すストアドプロシージャの戻り値を取得することができません

は、この目的のために使用されるVBAの手順であり、これは次のパラメータを取ります。 db connection, sp name, parameter values string array, db result set, spretval - 最後二人は出ている私が正しく、結果セットの値を取得しますが、値を返さないことができていた使用して結果セットを取得し、このVBAプロシージャの実行後

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 

パラメータ。私は空値のみを取得しています(実際にはSPは10を返します)

ストアドプロシージャには、値。

このコードでは何が問題になりますか?

答えて

1

レコードセットオブジェクトを閉じた後に戻り値を照会したときに、戻り値を取得することができました。

明らかに、レコードセットを完全に読み取るだけでは不十分です。戻り値とパラメーター値がコマンドオブジェクトに取り込まれるように、レコードセットオブジェクトも閉じておく必要があります。私はADOのドキュメントでこれを見つけることができませんでした。

これは、コマンドオブジェクトの戻り値/パラメータ値がレコードセットオブジェクトのクロージャ後にのみ設定されるというADO設計上の問題のようです。

関連する問題