0

ローカルモードで実行されているレポートビューアがあります。オブジェクトのリストを表示するだけで、集計関数や複雑な計算はありません。

私たちのオブジェクトには 27 個の文字列プロパティがあり、データベースには約 250000 のレコードがあります - フィルタが適用される前です。したがって、reportViewer は OutOfMemoryException をスローします。

Linq の遅延読み込みは役に立ちません - レポートは最初の 50 レコードのみを読み込み、ページネーションのコントロールも表示しません

この問題を解決する方法はありますか? 選択肢は 1 つだけです。フィルタの 1 つを必須にすることで、結果のリストがはるかに少なくなります。

でも、他にもっと良い方法があるのではないでしょうか?

4

1 に答える 1

0

実際の例を書く時間はありませんが、考えられる解決策の要点を次に示します。

(1) ReportViewer をマークアップで実際に表示しないでください。ReportViewer が大きなレポートを作成する場合、おそらく全体がバイト配列としてメモリ内にあると思います。

(2) 動的に作成し、次のように render を呼び出します。

Viewer.LocalReport.Render(format, "", PageCountMode.Estimate, CreateStream, out warnings);

(3) CreateStream は次のようなデリゲートです。

 private Stream CreateStream(string name, string fileNameExtension, Encoding encoding,
                              string mimeType, bool willSeek)
        {
            Stream stream = new FileStream(name + "." + fileNameExtension, FileMode.Create);
            return stream;
        }

したがって、結果はストリーム内のファイルに書き込まれます。DataTable のサイズによっては、依然として OOM 例外が発生する可能性があるため、このタイプの ReportDataSource を使用して、DbDataReader を使用してデータを提供することをお勧めします。

public ReportDataSource(string name, IEnumerable dataSourceValue);

上記の提案のうち、DataTable から DataReader に切り替えるだけでよい可能性があります。

于 2012-11-16T19:36:22.630 に答える