は私が考えてみましょう次のストアドプロシージャを2014年TStoredProcedureのパラメータの方向がpdOutputの場合は?そのパラメータを列挙するために、私は、このDelphiのコードを使用し</p> <pre><code>CREATE PROCEDURE [dbo].[usp2_BaseShow_By_Id]( @ShowId int, @Result int OUT ) </code></pre> <p>:
をデルファイXE8とSQL Serverを使用しています
function TDBHelper<T>.OpenSingle(ProcedureName:string; Args: TArray<Variant>;
Transform: TTransformFunc<T>): TDBResult<T>;
var
Con:TADOConnection;
Proc:TADOStoredProc;
ArgIndex,ParamIndex: Integer;
begin
Result:=TDBResult<T>.Create;
Con:=GetConnection;
Proc:=TADOStoredProc.Create(nil);
try
try
Proc.Connection:=Con;
Proc.ProcedureName:=ProcedureName;
Proc.Parameters.Clear;
Proc.Parameters.Refresh;
ArgIndex:=0;
for ParamIndex := 0 to Proc.Parameters.Count-1 do begin
if(Proc.Parameters[ParamIndex].Direction in [pdInput,pdInputOutput])then begin
Proc.Parameters[ParamIndex].Value:=Args[ArgIndex];
Inc(ArgIndex);
end;
end;
Proc.Open;
Result.Data:=Transform(Proc);
Result.Success:=True;
Proc.Close;
Con.Close;
except
on E:Exception do begin
Result.Success:=False;
Result.E:=E;
end;
end;
finally
Proc.Free;
Con.Free;
end;
end;
これは、と言われますパラメータは次のとおりです。parameter direction:
pdReturnValue
ストアドプロシージャの結果。ストアドプロシージャの最初のパラメーターのpdInput
。ストアドプロシージャの2番目のパラメータのpdInputOutput
。
Iは、上記のリストに項目3に驚いています。私はpdOutput
を期待していただろう。質問:
- なぜこのパラメータは
pdOutput
ではなくpdInputOutput
ですか?パラメータがpdOutput
とみなされるだろうどのような状況で - ?
私の質問は:あなたのポストは疑問があるとき?私はあなたが何を求めているのか心から考えていません。あなたの質問のタイトルは、何かが起きたときに尋ねるように見えます。 –
私はまたあなたが何の質問をしているのか疑問に思います。ああ、私はあなたがなぜ2番目のパラメータが 'pdOutput'ではなく' pdInputOutput'であるのだろうと思っていると思います。それですか? –
ところで、 'except'ブロックが完了すると' E'は破壊されます。しかし、あなたはオブジェクトへの参照を保持します。これは待機中の実行時エラーです。そのことを避けるには 'AcquireExceptionObject'を使う必要があります。あなたが 'Free'を呼び出すときに' Close'を呼び出すという点を本当に見ることができません。なぜ例外をキャッチするのか不思議です。あなたは例外を飲み込むつもりはありません。 –