4

GetReader を使用して呼び出す 2 つのレコードセットを返すストアド プロシージャがあります。最初を繰り返し、IDataReader.NextResult() を呼び出し、次に 2 番目を繰り返します。

sp の出力パラメーターに値を割り当てますが、リーダーで終了した後に値を確認すると、出力パラメーターは null です。バグのように見えます。私はファッジが好きではないので、選択を使用したくありません。いくつかのスニペット...

...

sp.Command.AddParameter("@SelectedTabID", selectedTabID, DbType.Int32);
sp.Command.AddParameter("@CurrentTabID", 0, DbType.Int32, ParameterDirection.Output);
sp.Command.AddParameter("@TypeID", 0, DbType.Int32, ParameterDirection.Output);

(この方法または AddOutputParameter() を使用しても同じ結果が得られることに注意してください)

...

using(IDataReader reader = sp.GetReader())
{
  while (reader.Read()) {...}
  if (reader.NextResult()) {while (reader.Read()) {...}}

}

...

int one = (int)sp.OutputValues[0]; //null expected an int
int two = (int)sp.OutputValues[1]; //null expected an int

いくつかの知恵の宝石を楽しみにしています:)

4

5 に答える 5

5

You need to close the reader first and then retrieve the output parameter. Output params return null when the reader is open.

More info can be found here http://amilagm.com/2010/11/output-variable-values-not-returned-from-sql-server-sp-in-c-sharp/

Hope this helps.

于 2010-11-16T05:19:12.293 に答える
4

出力パラメーターを取得する最も簡単な方法は、インスタンス化された変数を使用することです。つまり、パラメーターへの参照を保持し、sproc を実行すると、次のように検査できます。

SqlCommand cmd = new SqlCommand();
cmd.Connection = ConfigurationManager.ConnectionStrings["MyCon"].ToString();
cmd.CommandText = "MySproc";

SqlParameter parmOut = new SqlParameter("@StuffIWant", SqlDbType.Int);
parmOut.Direction=ParameterDirection.Output; 

cmd.Parameters.Add(parmOut);
cmd.ExecuteNonQuery();

string theThingIWant = parmOut.Value.ToString();

これはデータリーダーを使用していない可能性がありますが、これを使用して正しい答えを見つけることができる場合があります。幸運を。

于 2009-06-10T20:14:16.517 に答える
0

これは亜音速の失敗であり、沼地の標準 SQLConnection/Command として正常に動作します

于 2009-05-06T12:30:24.930 に答える
0

答えは、出力パラメーターにアクセスする前にリーダーを閉じる必要があるということです。

差出人:このページ

  • 最初にレコードセットを cmd.ExecuteReader() 経由で SqlDataReader として取得してください。すべてのレコードセットを処理してから...
  • 出力パラメーターを取得する前に、reader.Close() を介してレコードセットまたは SqlDataReader を必ず CLOSE してください。
于 2009-11-17T03:04:40.133 に答える
0

ここで少し混乱しています...スカラー値またはある種のレコードセットの出力を期待していますか? Get Reader は、たとえば、カーソルが out パラメータとして戻ってくる場合にのみ意味があります...

コマンドで「ExecuteNonQuery()」を呼び出し、CommandType が正しく設定されていることを確認することができます (CommandType.StoredProcedure)。

于 2009-05-06T12:31:58.517 に答える