2016-08-12 14 views
2

は私が考えてみましょう次のストアドプロシージャを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

  1. pdReturnValueストアドプロシージャの結果。ストアドプロシージャの最初のパラメーターの
  2. pdInput。ストアドプロシージャの2番目のパラメータの
  3. pdInputOutput

Iは、上記のリストに項目3に驚いています。私はpdOutputを期待していただろう。質問:

  • なぜこのパラメータはpdOutputではなくpdInputOutputですか?パラメータがpdOutputとみなされるだろうどのような状況で
+1

私の質問は:あなたのポストは疑問があるとき? 私はあなたが何を求めているのか心から考えていません。あなたの質問のタイトルは、何かが起きたときに尋ねるように見えます。 –

+0

私はまたあなたが何の質問をしているのか疑問に思います。ああ、私はあなたがなぜ2番目のパラメータが 'pdOutput'ではなく' pdInputOutput'であるのだろうと思っていると思います。それですか? –

+1

ところで、 'except'ブロックが完了すると' E'は破壊されます。しかし、あなたはオブジェクトへの参照を保持します。これは待機中の実行時エラーです。そのことを避けるには 'AcquireExceptionObject'を使う必要があります。あなたが 'Free'を呼び出すときに' Close'を呼び出すという点を本当に見ることができません。なぜ例外をキャッチするのか不思議です。あなたは例外を飲み込むつもりはありません。 –

答えて

1

なぜこのパラメータpdInputOutputいうよりpdOutputはありますか?

OUTキーワードにもかかわらず、パラメータは入力と出力の両方に使用されるためです。次のことを試してみてください。

CREATE PROC DoubleIt (@Value int OUT) 
AS 
SET @Value = @Value * 2 
GO 

DECLARE @Val int = 3 
exec DoubleIt @Val OUTPUT 
PRINT @Val 

あなたは@Valueは、入力と出力の両方として使用されていることがわかります。

どのような場合、パラメータはpdOutputと見なされますか?

は、手動のようなパラメータを作成することができるかもしれません。残念ながら私は現時点でこれを簡単にテストすることはできません。また、それをサポートする他のデータベースプラットフォームもあります。

デルファイでpdOutputパラメータを使用するには、SQL Serverのストアドプロシージャで何を行う必要がありますか?

SQL Serverで何かできることはありません。パラメータを出力専用と定義する方法はわかりません。

+0

質問を編集してください。私は彼らが同じことを聞いたと感じるように私は最後の2つの質問をマージしました。あなたは今削除された質問を引用しました。 *どのような状況でパラメータがpdOutputとみなされるのですか?* SQL ServerのストアドプロシージャでDelphiで*のpdOutputパラメータを使用するにはどうしたらいいですか? –

+0

@DavidHeffernan私はもともと特殊なケースの質問を一般的な質問に転記することをあなたの決定とみなしたので、3番目の質問を追加しました。各質問には正反対の答えがあります。 ...元の質問について、私はあなたと編集戦争に入るつもりはない。それにもかかわらず、私は3番目の質問に答えを残すつもりです。 –

+0

明らかに私は編集戦争を望んでいません。私は私の推論を説明していた。私は2つの質問の違いを知ることはできません。出力パラメータを定義することは不可能であり、手動で作成することもできません。明らかに私は何かを理解していない。私はそれ以上の編集をしないで、あなたがそれをクリアできることを願っています。 –

関連する問題

 関連する問題