SQLストアドプロシージャを実行していて、いくつかのテーブル結果を送信しているサーバー側のコードです。IEnumerableの結果を返す関数を呼び出す方法は?
ここにFixNullParams関数があります。 、私はこのように、この関数を呼び出す
private void FixNullParams(SqlParameter[] parameters)
{
foreach (SqlParameter p in parameters) if (p.Value == null) p.Value = DBNull.Value;
}
、
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@AgencyFilter", "CountyPool"));
IEnumerable<IDataRecord> dataFromDB = salesTax.SomeFuncToCallDB("[Data].[uspSomeSQLProc]", parameters.ToArray());
は、私は次の例外を取得します。
"SqlParameterは、すでに別のSqlParameterCollectionに含まれています。"
これはラインcmd.Parameters.AddRangeで起こります。
私は
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@AgencyFilter", "CountyPool"));
//IEnumerable<IDataRecord> dataFromDB = salesTax.SomeFuncToCallDB("[Data].[uspAgenciesSelect]", parameters.ToArray());
foreach (IDataRecord eachRec in salesTax.SomeFuncToCallDB("[Data].[uspSomeSQLProc]", parameters.ToArray()))
{
int x = eachRec.FieldCount;
}
、このように同じ関数を呼び出した場合は、同時に、そして、それが正常に働いて、各レコードをループ。
ここに私の質問があります。
- この手順をどのように呼び出すのが適切ですか?
- 後の呼び出しでどうして失敗しないのですが、元の呼び出しで失敗しますか?
- 私はこの機能のためのユニットテストを記述する必要がある場合、私はちょうどIEnumerableを取得し、レコード数を主張したいです。しかし、このような例外のために、私はこの種のテストを行うことはできません。では、この関数を単体テストするための正しい方法は何ですか?
ここで 'parameters'はどこに作成しますか?すでに他の場所で既に使用されているパラメータを使用していると思われます。あなたの質問を明確にし、コードセクションを編集して、できるだけわかりやすくなるようにしてください。 –
コンパイル時に、列挙可能なメソッドがステートマシンを生成します。私はあなたに細かい細部を伝えることはできませんが、それはそれと関係があると思います。誰かがそれを知っているなら、それはジョン・スケートです。 – Crowcoder
@JonSkeet私はあなたが正しいと信じています、OPは問題が含まれている彼のコードの部分を記述していません、エラーがキャッチされた場所。 SQLパラメータクラスインスタンスの場所と使用方法を説明する必要があります。 OPがSQLパラメータを再利用しています。おそらく、あなたが使用している "FixNull"メソッドは、同じ "空の"パラメータを返すか、返すものでシステムを混乱させるでしょう。正直なところ、あなたが提供したコードでエラーの原因を特定することはできません。 –