使用 .NET 的 CrystalReports 推送模型





0/5 (0投票)
如何使用推送模型和 .NET 为 CrystalReports 引擎创建自定义数据源
引言
我找不到关于如何在 VS2005 或其他地方使用 CrystalReports 推送模型的适当描述,所以本文包含了我三个星期努力的所有发现。
背景
CrystalReports 支持两种数据模型:推送和拉取。第二种非常简单:您在设计时定义一个连接字符串,CRE(CrystalReports 引擎)使用它来根据您的模板生成报告。
人们也可以在运行报告之前提供自定义连接字符串,但无论如何 CRE 直接处理表。
但是,如果需要使用存储过程而不是表,并且需要预先缓存一些数据或使用 CRE 未知的数据源,该怎么办?那么应该使用推送模型。
不幸的是,关于如何实际实现这些推送机制的信息非常少,尤其是对于 .NET 的 CRE,除了一个在 VS2005 中如何使用推送模型创建报告的良好而简单的例子,但没有任何自定义数据适配器:“使用 C# 和数据集创建 Crystal Reports”。但是,在我的情况下,报告非常复杂,应该保持完整,并且文章中提出的解决方案根本不合适:需要自己编写太多代码,而 Visual Studio 向导几乎(几乎)涵盖了一切。
Using the Code
代码本身非常少,因为 VS 几乎自动生成一切。
首先,需要一个报告模板(自己准备/获取一个)。
I. 使用 Visual Studio 界面生成数据源,其中包括
- 数据 → 添加新数据源
- 数据库
- 新连接
- 等等。
II. 获取向导创建的任何内容,并基于标准代码创建自定义数据源
注意:更改会影响自动生成的适配器类(在我的例子中,每个表一个)。
我只是复制粘贴了生成的代码,删除了硬编码的值,例如从应用程序配置文件中提取连接字符串,并将其替换为我自定义的获取数据库连接的方法(变量名为 _connection
,我在 InitConnection()
中将其设置为 null
)。
您还可以在 InitCommandCollection
中更新用于从数据库中提取数据的 SqlCommand
对象。
注意:每个表的每个适配器类都有自己的连接和命令集合。
更改 Fill
方法以使用您的自定义连接和您希望提供的任何参数(在我的例子中是存储过程参数)。
注意:在 Fill
方法的末尾有一个实际调用,即 this.Adapter.Fill(dataTable)
。问题是 InitCommandCollection
在内部被调用,如果您通过 Fill
提供一些存储过程参数,则将它们存储在内部变量中并在初始化期间提供。
III. 用法
- 创建您的自定义数据集,例如
CustomDataSet ds = new CustomDataSet()
- 根据需要创建尽可能多的适配器
- 使用您想要的任何参数调用每个适配器的
Fill
方法(前提是方法的接口已修改) - 由于
Fill
方法的第一个参数是一个数据集对象(或对象集合),因此在所有Fill
方法完成后,您将获得一个填充了所有请求数据的数据集 - 使用生成的数据集提供您的报告对象
关注点
花费这么多时间来解决这样一个相对较小的问题真是令人惊讶,因为没有关于做什么的解释。
历史
- 2009-04-23 RM 的初始版本
- 2009-04-27 进行了细微的格式更新,并包含了一个指向“使用 C# 和数据集创建 Crystal Reports” CodeProject 文章的链接 - RM