4

誰でも助けることができますか?このコードを書いて実行すると。プログラムに、「このコマンドに関連付けられた開いている DataReader が既に存在するため、最初に閉じる必要があります」というエラーが表示されます。

これは私のコードです。

Parallel.For(0, MthRange, i => {
    PSUpfrontFeeForMonth[i] = CommissionSummary
        .Where(s => s.TransDate == oReportCommonFilter.fromDate.AddMonths(i))
        .Sum(s => s.PSUpfrontFee);

    if (!PSUpfrontFeeForMonth[i].HasValue)
    {
        PSUpfrontFeeForMonth[i] = 0;
    }
});

ありがとう。

よろしく、ジェーン

4

3 に答える 3

4

データベース クエリの並列化は、次の理由から完全に間違っています。

  1. 各プロセッサから sql に対してクエリが発行されるため、複数のデータ リーダーが開かれます -> 'エラー'
  2. パフォーマンスの向上は達成されません。実際、各プロセッサがデータベースに接続しようとするためプログラムが遅くなり、すべてのクエリ処理が sql で行われるため、実際には並列処理は行われません! したがって、この場合、通常のシリアル クエリの方が高速です。
于 2010-11-26T07:21:14.260 に答える
1

複数のデータベース接続を同時に開く必要がある場合 (他の人が必ずしも良い考えではないと述べているように)、通常は接続文字列でこれが必要であることを指定できます。

私がこれを使用した典型的なシナリオは、DataReader を使用してデータベース テーブルから行をストリーミングし (事前に必要な行数がわからないため)、他のデータベース テーブルに対して追加のクエリを作成する必要がある場合です。複数の複雑な結合が必要になるため、単一のクエリではなくこれを実行し、アプリにはデータベースへのクエリを減らすための適切なキャッシュレイヤーがあります。

Microsoft SQL Server の場合はMultipleActiveResultSets=True;、接続文字列に追加します

于 2010-11-26T08:17:11.883 に答える
0

私の推測では、データ リーダーを使用して PSUpfrontFeeForMonth が内部でどのように機能するかに関係があると思います。

それがどのように機能するのかわからないので、最初に試みることは、ループ内で PSUpfrontFeeForMonth を初期化することです。多分それは各反復のための専用のデータリーダーを保証します.

于 2010-11-26T07:40:44.300 に答える