2

2 つの整数出力パラメーターを含むストアド プロシージャを実行する SqlCommand があります。SqlCommand が実行される直前に、出力パラメーターが正しい値に設定されていることがわかりますが、コマンドが実際に実行されると、パラメーターの設定に関係なく、パラメーター 1 に NULL が使用され、パラメーター 2 (SQL プロファイラーを使用して検証されます) に 0 が使用されます。 .

コードの簡略化されたバージョンは次のとおりです。

foreach (KeyValuePair<string, object> parameter in outputParameters)
{
    SqlParameter param = new SqlParameter(parameter.Key, parameter.Value);
    param.Direction = ParameterDirection.Output;
    command.Parameters.Add(param);
}

command.ExecuteNonQuery();

私はここで2つの異なることに混乱しています:

1) パラメータの値を使用しないのはなぜですか? 直前にブレークポイントを配置command.ExecuteNonQuery()して、command.Parameters リストに出力パラメーターが正しく設定されていることを確認できますが、クエリが実行されると、SQL プロファイラー トレースには異なるパラメーターが含まれます。

2) 両方のパラメータは整数であり、まったく同じ方法で定義されています - なぜ一方が NULL に設定され、もう一方が 0 に設定されているのですか??

4

2 に答える 2

4

方向を出力ではなく InputOutput (オペレーション編集ごと) に変更したい。

出力パラメーターを参照すると、値がコードからではなく実際のストアド プロシージャから返される必要があることをコードに伝えます。コードに値が含まれていても、実際には、出力パラメーターを指定したときにそれらの値が何であるかは気にしません。

それがどうあるべきかは次のとおりです。

foreach (KeyValuePair<string, object> parameter in outputParameters)
{
    SqlParameter param = new SqlParameter(parameter.Key, parameter.Value);
    param.Direction = ParameterDirection.InputOutput;
    command.Parameters.Add(param);
}

command.ExecuteNonQuery();
于 2010-08-03T14:21:23.420 に答える
3

それらは出力パラメーターです-つまり、値はストアドプロシージャから取得されることを意図しています...論理的には、入力に値がありませんクライアントからの値をストアド プロシージャで使用する場合は、方向がInputOutput.

編集: コメントへの応答 -単なる出力Outputを意味します。入力のみを意味します。双方向という意味です。両方の方法が必要なように聞こえるので、を使用してください。InputInputOutputInputOutput

一方が null で、もう一方が null ではない理由については、正直なところわかりません。

于 2010-08-03T14:21:02.213 に答える