我有一个报表查看器,在本地模式下运行。它只显示对象列表,没有聚合函数或硬计算。
我们的对象有 27 个字符串属性,数据库中大约有 250000 条记录 - 在应用任何过滤器之前。所以reportViewer 会抛出OutOfMemoryException。
Linq 延迟加载对我们没有帮助 - 报告仅加载前 50 条记录,甚至不显示分页控件
您对如何解决此问题有任何想法吗?我只有一个选择 - 需要一个过滤器,所以我们的结果列表会小得多。
但也许还有其他更好的方法?
我没有时间写一个工作示例,但这里是一个可能的解决方案的要点。
(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 异常,因此您可能希望使用 DbDataReader 提供数据,使用这种类型的 ReportDataSource
public ReportDataSource(string name, IEnumerable dataSourceValue);
有可能上述建议中,您只需要从 DataTable 切换到 DataReader 即可。