Crystal Reports是一个强大的报告生成工具,它支持两种数据模型:推送(push)和拉取(pull)。拉取模型相对简单,设计时定义一个连接字符串,CrystalReports引擎(CRE)会根据模板生成报告。用户可以在运行报告前提供自定义的连接字符串,但无论如何,CRE都是直接与表格打交道的。
但如果有需求使用存储过程而不是表格,或者需要预先缓存一些数据,或者使用CRE未知的数据源,那么就需要采用推送模型。不幸的是,关于如何在.NET环境下实现这些推送机制的信息非常有限,除了一个简单的例子,展示了如何在VS2005中创建一个使用推送模型的报告,但没有使用自定义数据适配器。
由于Visual Studio自动生成了大部分代码,所以实际需要编写的代码非常少。首先,需要一个报告模板(自行准备或获取)。
包括:
注意:更改将自动影响自动生成的适配器类(每个表格一个)。
复制粘贴了生成的代码,移除了硬编码值,比如从应用程序配置文件中提取连接字符串,并用自定义方法获取数据库连接(变量名为_connection
),并在InitConnection()
中将其设置为null
。
也可以在InitCommandCollection
中更新SqlCommand
对象,这些对象用于从数据库提取数据。
注意:每个表格的适配器类都有自己的连接和命令集合。
更改Fill
方法以使用自定义连接和任何希望提供的参数(在例子中是存储过程参数)。
注意:Fill
方法的末尾有一个实际的调用,即this.Adapter.Fill(dataTable)
。关键是InitCommandCollection
是内部调用的,如果通过Fill
提供了一些参数,比如存储过程参数,那么请将它们存储在内部变量中,并在初始化时提供。
创建自定义数据集,例如:
CustomDataSet ds = new CustomDataSet();
创建所需的适配器数量。
为每个适配器调用Fill
方法,并提供任何想要提供的参数(前提是方法的接口已经被修改)。
由于Fill
方法的第一个参数是一个数据集对象(或对象集合),所以在所有Fill
方法完成后,将得到一个填充了所有请求数据的数据集。