現在、クエリは ExcuteReader を介して結果セットを返す必要があり、同時にパラメーターを出力したいのですが、最初はストアド プロシージャにエラーがあるのではないかと考え、出力パラメーターの値を取得できませんでした。クエリ アナライザーのテストは正しく、出力パラメーターの割り当ては実際に変更されました。
さらに不可解なのは、出力の強制的な型変換中に例外がスローされた後、実際に再度取得できることです。これは ado.net のバグですか。そのようなページを想像することは不可能です。私のコードは次のようなシナリオです:
try {
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) {
int val = (int)cmd.Parameters[1].Value; // 現時点ではまだ空です。
// もっと
}
}
catch(例外exp) {
throw new ApplicationException("出力パラメータ値: " + cmd.Parameters[1].Value, exp); // これで出力値を取得できるようになりました。
1 時間のデバッグと追跡の後、
最終
的に MSDN で答えを見つけました。
ストアド プロシージャで Command オブジェクトを使用する場合、Command オブジェクトの CommandType プロパティを StoredProcedure に設定できます。 CommandType が StoredProcedure の場合、コマンドの Parameters プロパティを使用して、入力パラメータと出力パラメータにアクセスし、値を返すことができます。どの Execute メソッドが呼び出されるかに関係なく、Parameters プロパティにアクセスできます。ただし、ExecuteReader が呼び出された場合、DataReader が閉じられるまで戻り値と出力パラメータにはアクセスできません。
参照: http://msdn2.microsoft.com/zh-CN/library/tyy0sz6b.aspx
ということで、また MS に騙されたような気がします。なぜ私は学習経験が浅いのでしょうか。すでにドキュメントを変更して、
そこに戻った場合でも、独自のコード環境を説明できます。
なぜなら、Exception をキャッチすると using スコープが飛び出し、DataReader が自動的にクローズされ、出力パラメータの値が自然に取得できるからです。
もちろん、try catch を using に設定しても、まだ using スコープ内にあり、DataReader が閉じられていないため、取得できません。
さらに、MSDN では、DataReader が閉じている場合にのみアクセスできると述べていますが、これは事実ではありません。
テスト後、次のように要約できます。
1. ExecuteReader の場合、出力パラメータと戻り値は結果セットとして DataReader に返され、結果セットは常に最後のものになります。
2. 1 によると、結果セットがある場合、出力パラメーターと戻り値にアクセスするには、出力パラメーターと戻り値に対応する結果セットの場所に NextResult を呼び出す必要があります。
3. 1 によると、Execute が結果セットを返さない場合は、直接アクセスできます (Read() を呼び出す必要がないことに注意してください)。
4.複数の結果セットが返される場合、NextResult を複数回呼び出す必要があることに特に注意してください。結果セットの数が動的である場合、nextResult() の戻り値は false になります。
5. ExecuteReader にオプション CommandBehavior.SingleResult が指定されている場合でも (単一の結果セットを返し、実際にはバッチの最初の結果セットを返します)、出力パラメーターは結果セットとして返されます。
6. DataReader を閉じる (Close()) と、出力パラメータが設定されるため、アクセス可能になります。
7. DataReader は読み取り専用であるため、DataReader を閉じる前に NextResult メソッドを通じて出力パラメータが取得されたとしても、以前の結果セットにはアクセスできなくなります (場合によっては、出力を通じて結果セットを動的に制御することもできます)パラメータを参照してください)。
8. 6の問題を解決するには、出力パラメータを使用せず、最初の結果として出力パラメータを直接返す(SELECT @parmname)必要
があります。上記は矛盾がないことを願っています。初心者に役立ちます。
参照:
http://www.bigcircleboy.net/583a194f-2c2c-4662-9036-4e2f0eb262396084313157728108.html