10

SQL Server で正常に動作するストアド プロシージャをセットアップしました。VBA から呼び出すことができるようになりましたが、エラーなどがあるかどうかを知るために値を返したいと考えています。SP の最後のパラメーターは OUTPUT として設定されています。

@DataSetID int = 0,
@Destination char(1)='-',
@errStatusOK bit OUTPUT

SP を呼び出すための VBA は以下のとおりですが、新しいパラメーターを追加した後は機能しません。どこが間違っているのかわかりません。次のようになり3708 - Parameter object is improperly defined. Inconsistent or incomplete information was provided.ます。

Set cnn = New adodb.Connection
cnn.ConnectionString = 
   "DRIVER=SQL Server;SERVER=SERVER\SERVER;DATABASE=a_db;Trusted_Connection=Yes"

cnn.Open cnn.ConnectionString

Set cmd = New adodb.Command
cmd.ActiveConnection = cnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "stprMoveDataSet"

Set param = cmd.CreateParameter
               ("@DataSetID", adInteger, adParamInput, , stDataSet)
cmd.Parameters.Append param
Set param = cmd.CreateParameter
               ("@Destination", adChar, adParamInput, 1, stDestination)
cmd.Parameters.Append param
Set param = cmd.CreateParameter
               ("@errStatusOK", adBit, adParamReturnValue)
cmd.Parameters.Append param

rs.CursorType = adOpenStatic
rs.CursorLocation = adUseClient
rs.LockType = adLockOptimistic
rs.Open cmd

vba を OUTPUT パラメータで動作させ、戻り値を vba で「読み取り可能」にする方法を教えてください。

編集 - 質問を変更して、出力パラメーターの使用だけでなく、値を返すことについてより具体的にしました。

4

4 に答える 4

9
Set cnn = New adodb.Connection
cnn.ConnectionString = 
   "DRIVER=SQL Server;SERVER=SERVER\SERVER;DATABASE=a_db;Trusted_Connection=Yes"

cnn.Open cnn.ConnectionString

Set cmd = New adodb.Command
cmd.ActiveConnection = cnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "stprMoveDataSet"

Set param1 = cmd.CreateParameter
               ("@DataSetID", adInteger, adParamInput, , stDataSet)
cmd.Parameters.Append param
Set param2 = cmd.CreateParameter
               ("@Destination", adChar, adParamInput, 1, stDestination)
cmd.Parameters.Append param
Set param3 = cmd.CreateParameter
               ("@errStatusOK", adBit, adParamOutput, , adParamReturnValue)
cmd.Parameters.Append param

rs.CursorType = adOpenStatic
rs.CursorLocation = adUseClient
rs.LockType = adLockOptimistic
rs.Open cmd
于 2012-09-13T13:54:59.830 に答える
5

私は最初にOUTPUTパラメーターを調べましたが、それらをAccess(VBA内)に戻してユーザーにフィードバックを提供する方法を見つけることができませんでした。同僚は、ストアドプロシージャでSELECTを使用し、これを使用することを提案しました。

ストアドプロシージャ:最後に次を追加しました。

SELECT @errStatusOK as errStatusOK, @countCurrent as countCurrent, @countHistorical as countHistorical

VBA:

Dim cnn As ADODB.Connection
Dim cmd As New ADODB.Command, rs As New ADODB.Recordset, param As New ADODB.Parameter
Dim fld As ADODB.Field
Dim stMessage As String

Set cnn = New ADODB.Connection
cnn.ConnectionString = "DRIVER=SQL Server;SERVER=SERVER\SERVER;DATABASE=a_db;Trusted_Connection=Yes"

cnn.Open cnn.ConnectionString

Set cmd = New ADODB.Command
cmd.ActiveConnection = cnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "stprMoveDataSet"

Set param = cmd.CreateParameter("@DataSetID", adInteger, adParamInput, , stDataSet)
cmd.Parameters.Append param
Set param = cmd.CreateParameter("@Destination", adChar, adParamInput, 1, stDestination)
cmd.Parameters.Append param

rs.CursorType = adOpenStatic
rs.CursorLocation = adUseClient
rs.LockType = adLockOptimistic
'rs.Open cmd
Set rs = cmd.Execute
If rs!errstatusok = True Then
    stMessage = "Operation appears to have been successful, check the DataSets Listing..." & Chr(13) & "Also, the Server returned the following information: ["
Else
    stMessage = "Operation appears to have failed, check the DataSets Listing..." & Chr(13) & "Also, the Server returned the following information: ["
End If
For Each fld In rs.Fields
    stMessage = stMessage & "| " & fld.Name & " / " & fld.Value & " |"
Next fld
stMessage = stMessage & "]"

MsgBox stMessage

これにより、次の結果が返されます。 Operation appears to have failed, check the DataSets Listing... Also, the Server returned the following information: [| errStatusOK / False || countCurrent / 0 || countHistorical / 10 |]

于 2012-09-13T13:58:53.540 に答える
2

「adParamInput」が取得される他のパラメーター列挙の中には、ストアード・プロシージャーからの出力パラメーターを示す「adParamOutput」と、いわば「両方向」に進むパラメーターの「adParamInputOutput」があります。あなたの場合、「adParamOutput」が適切だと思います。これがあなたが探しているものであることを願っています。

于 2012-09-13T13:30:42.370 に答える