ReportViewer中的OutOfMemoryException

时间:2012-09-19 18:31:37

标签: asp.net rdlc

我有一个以本地模式运行的reportviewer。它只显示一个对象列表,没有聚合函数或模糊计算。

我们的对象有27个字符串属性,在应用任何过滤器之前,数据库中有大约250000条记录。 因此reportViewer会抛出OutOfMemoryException。

Linq延迟加载对我们没有帮助 - 报告仅加载前50条记录,甚至不显示分页控件

您对如何解决此问题有任何想法吗?我只有一个选项 - 需要一个过滤器,所以我们会得到一个小得多的结果列表。

但也许还有其他更好的方法?

1 个答案:

答案 0 :(得分:0)

我没时间写一个有效的例子,但这是一个可能的解决方案的要点。

(1)实际上并没有在标记中显示ReportViewer。我认为当ReportViewer创建一个大型报表时,整个事情可能在内存中作为一个字节数组。

(2)动态创建它,然后像这样调用渲染:

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异常,因此您可能希望使用DbDataReader提供数据,使用此类型的ReportDataSource

public ReportDataSource(string name, IEnumerable dataSourceValue);

以上建议可能只需要从DataTable切换到DataReader。