我有一个以本地模式运行的reportviewer。它只显示一个对象列表,没有聚合函数或模糊计算。
我们的对象有27个字符串属性,在应用任何过滤器之前,数据库中有大约250000条记录。 因此reportViewer会抛出OutOfMemoryException。
Linq延迟加载对我们没有帮助 - 报告仅加载前50条记录,甚至不显示分页控件
您对如何解决此问题有任何想法吗?我只有一个选项 - 需要一个过滤器,所以我们会得到一个小得多的结果列表。
但也许还有其他更好的方法?
答案 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。