0

我有一个报表查看器,在本地模式下运行。它只显示对象列表,没有聚合函数或硬计算。

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

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

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

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

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

public ReportDataSource(string name, IEnumerable dataSourceValue);

有可能上述建议中,您只需要从 DataTable 切换到 DataReader 即可。

于 2012-11-16T19:36:22.630 回答