应该使用常规报表还是缓存报表?

如果计划使用 Crystal Reports SDK 来构建应用程序,需要考虑的最重要的问题之一就是应该使用常规报表,还是缓存报表。通过学习有关报表缓存的 SDK 基础知识,将有助于选择最佳的 Crystal Reports for Visual Studio 项目结构。

什么是缓存报表?

缓存报表是指已存储在 ASP.NET Cache 对象中(以提高性能和可伸缩性)的报表对象。Crystal Reports 提供了特定的框架,用于将 ReportDocument 实例放到 Cache 中。该框架自动缓存所有实现 ICachedReport 接口的报表。

什么是 ASP.NET Cache 对象?

出于以下两个原因,在 ASP 和 ASP.NET 中,报表对象都放在 Web 服务器上的 Session 或 Application 中:

  1. 为了在页重新加载过程中保持报表对象的状态。
  2. 通过将较大、加载较慢的报表放入服务器内存以提高可伸缩性和性能。

在 ASP.NET 中,引入了 Application 对象的一个带参数的变体,名为 Cache。与 Application 相同,Cache 仍保持报表对象的单个实例,供所有用户共享。但是,Cache 增加了用于查找基于文件、基于密钥或基于时间的依赖项的智能机制。这些依赖项可以自动使 Cache 中的报表对象过期,甚至自动将其刷新,使 Cache 中的内容保持最新。

Note注意

虽然本文中交替使用了术语“Cache 对象”和“Cache”(类似于术语“Session 对象”和“Session”或“Application 对象”和“Application”),但它们表示同一个东西。术语“对象”强调它们是在 Web 服务器上的 .NET Framework 内存空间内运行的持久对象。

如何将报表对象放到 ASP.NET Cache 对象中?

可以通过以下两种方式将报表对象放到 ASP.NET Cache 对象中:

  • 使用与将报表对象赋给 Session 或 Application(显式赋值)相同的语法将报表对象赋给 Cache。
  • 将实现 ICachedReport 接口的报表的某个版本进行实例化。报表引擎会查找实现该接口的报表对象,并自动将该报表对象放到 Cache 中(隐式赋值)。

什么是 ICachedReport 接口?

ICachedReport 接口将标记所有启用 ICachedReport 以使用 Crystal Reports 高速缓存框架的报表类。这个自定义框架将在 ASP.NET Cache 对象上提供一层,以满足报表高速缓存的特定需要。

ICachedReport 接口带有一些方法签名,在报表类中实现这些方法签名后,它们会通知框架如何高速缓存该特定类。

将报表嵌入到 Visual Studio 项目时提供哪些报表缓存功能?

在 Visual Studio 项目中创建或导入报表时,该报表将嵌入到项目中并自动生成两个类:

  • 一个报表包装类(名称与报表相同)。
这个包装类在项目中代表该报表,它继承自 ReportDocument。有关更多信息,请参见[“应该使用嵌入式报表还是非嵌入式报表?”](ms225520\(v=vs.90\).md)。
  • 一个高速缓存管理实用程序类(名称为 Cached[ReportName] 类)。
这个高速缓存管理实用程序类通过使用 ASP.NET Cache 对象和 Crystal Reports SDK 的内置高速缓存框架处理该嵌入式报表的高速缓存。

下表显示了将“层次分组”报表(位于“示例报表目录”中)添加到一个 Crystal Reports for Visual Studio 项目后所生成的项:

名称
说明
Hierarchical Grouping.rpt
报表
Hierarchical_Grouping 类
报表包装类
CachedHierarchical_Grouping 类
高速缓存管理实用程序类用于管理报表包装类的高速缓存

报表包装类和高速缓存管理实用程序类有各自的任务:

  • 报表包装类继承自 ReportDocument,因此可以访问完整的 ReportDocument 对象模型。要与报表进行交互,需对这个核心类进行编程。
  • 高速缓存管理实用程序类管理报表包装类的实例,并将其存储到 ASP.NET Cache 对象中。它可以识别报表包装类的不同实例,并防止那些实例在 Cache 中相互覆盖。例如,它可以识别因更改了参数和登录信息而产生的差异。为此,它为报表包装类的每个唯一实例均分配一个唯一密钥。
  • 为了向 Crystal Reports .NET Framework 的高速缓存功能标识它自己,高速缓存管理实用程序类实现 ICachedReport 接口。

报表包装类和高速缓存管理实用程序类都在同一个类文件中生成。若要查看这两个类,请在解决方案资源管理器中右击报表类文件,然后选择“查看代码”。该文件打开后,您会看到报表包装类的代码位于该文件的上部,而高速缓存实用程序类则位于下半部分。

Note注意

若要了解如何将 CrystalReportViewer 控件绑定到此缓存管理实用程序类,请参见“ 绑定到缓存的嵌入式报表类 ”。若要创建自己的缓存管理实用程序类以绑定到非嵌入式报表,请参见“绑定到已加载到缓存管理实用程序类的非嵌入式报表”

何时应缓存报表?

只应将少量报表对象放入 ASP .NET Cache 对象。大多数报表对象的可共享性都较低(也就是说,它们不用作其它对象的共享资源)。因此,它们使用 Cache 的效率较低。如果要求对象具有持久性,请将报表对象放到用户的 Session 对象中。

只有在报表的可共享性较高时,才应将其放入 ASP.NET Cache。如果报表对象非常大,或具有非常复杂的查询,需要花几分钟时间来检索数据,这一点尤其重要。

请参见