65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 .NET 的 CrystalReports 推送模型

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009 年 4 月 23 日

CPOL

3分钟阅读

viewsIcon

19032

如何使用推送模型和 .NET 为 CrystalReports 引擎创建自定义数据源

引言

我找不到关于如何在 VS2005 或其他地方使用 CrystalReports 推送模型的适当描述,所以本文包含了我三个星期努力的所有发现。

背景

CrystalReports 支持两种数据模型:推送和拉取。第二种非常简单:您在设计时定义一个连接字符串,CRE(CrystalReports 引擎)使用它来根据您的模板生成报告。

人们也可以在运行报告之前提供自定义连接字符串,但无论如何 CRE 直接处理表。

但是,如果需要使用存储过程而不是表,并且需要预先缓存一些数据或使用 CRE 未知的数据源,该怎么办?那么应该使用推送模型。

不幸的是,关于如何实际实现这些推送机制的信息非常少,尤其是对于 .NET 的 CRE,除了一个在 VS2005 中如何使用推送模型创建报告的良好而简单的例子,但没有任何自定义数据适配器:“使用 C# 和数据集创建 Crystal Reports”。但是,在我的情况下,报告非常复杂,应该保持完整,并且文章中提出的解决方案根本不合适:需要自己编写太多代码,而 Visual Studio 向导几乎(几乎)涵盖了一切。

Using the Code

代码本身非常少,因为 VS 几乎自动生成一切。

首先,需要一个报告模板(自己准备/获取一个)。

I. 使用 Visual Studio 界面生成数据源,其中包括

  1. 数据 → 添加新数据源
  2. 数据库
  3. 新连接
  4. 等等。

II. 获取向导创建的任何内容,并基于标准代码创建自定义数据源

注意:更改会影响自动生成的适配器类(在我的例子中,每个表一个)。

我只是复制粘贴了生成的代码,删除了硬编码的值,例如从应用程序配置文件中提取连接字符串,并将其替换为我自定义的获取数据库连接的方法(变量名为 _connection,我在 InitConnection() 中将其设置为 null)。

您还可以在 InitCommandCollection 中更新用于从数据库中提取数据的 SqlCommand 对象。

注意:每个表的每个适配器类都有自己的连接和命令集合。

更改 Fill 方法以使用您的自定义连接和您希望提供的任何参数(在我的例子中是存储过程参数)。

注意:Fill 方法的末尾有一个实际调用,即 this.Adapter.Fill(dataTable)。问题是 InitCommandCollection 在内部被调用,如果您通过 Fill 提供一些存储过程参数,则将它们存储在内部变量中并在初始化期间提供。

III. 用法

  1. 创建您的自定义数据集,例如 CustomDataSet ds = new CustomDataSet()
  2. 根据需要创建尽可能多的适配器
  3. 使用您想要的任何参数调用每个适配器的 Fill 方法(前提是方法的接口已修改)
  4. 由于 Fill 方法的第一个参数是一个数据集对象(或对象集合),因此在所有 Fill 方法完成后,您将获得一个填充了所有请求数据的数据集
  5. 使用生成的数据集提供您的报告对象

关注点

花费这么多时间来解决这样一个相对较小的问题真是令人惊讶,因为没有关于做什么的解释。

历史

© . All rights reserved.