Page tree
Skip to end of metadata
Go to start of metadata

前文介绍的各种数据源,都是明确知道从哪个数据库取数的。实际项目中,存在一种设计报表时无法明确知道从哪个数据库中取数的情况。例如,根据查看报表的用户身份不同,所要取数的数据库也不同。在这种场景中,就需要用到动态数据源。

所谓动态数据源,就是连接字串为表达式形式的数据源。通过在表达式中使用报表参数,实现不同用户访问不同数据库的效果。

所谓动态数据集,就是SQL语句为表达式形式的数据集。通过在表达式中使用报表参数,实现不同用户访问不同数据库表或视图的效果。

创建一个动态数据源的思路如下:

(1)先设计好静态的数据源连接字串和数据集。这是为了获得数据集的字段列表,以便设置表格、图表等报表元素的数据字段绑定。

(2)添加报表参数。

(3)修改数据源,将连接字串设置为表达式,表达式中引用报表参数,从而实现具体数据源随参数不同而变化的"动态"效果。

下面举例说明具体的设计方法。

设计静态的数据源

启动报表设计器,新建一个RDL类型的报表。

添加一个SQL Server数据源,连接字串如下:

data source=(local);password=123;initial catalog=ArsDemo;user id=user1;

如下图:

添加一个数据集,SQL语句如下:

select * from 产品

字段列表如下:

拖放一个表格到设计区,绑定数据集的字段,如下图:

预览效果如下图:

到目前为止,一个静态数据源的报表就设计完成了。

添加报表参数

添加报表参数是为实现动态数据源做准备。添加报表参数的步骤如下:

(1)右键单击报表资源管理器的【参数】节点,再点击【添加参数】,如下图:

(2)设置参数名称等信息,如下图:

(3)点击【确定】按钮。

此时会看到报表资源管理器的【参数】节点下面多了一个DbName参数,如下图:

修改数据源设置

定义好报表参数之后,就可以重新设置数据源,使之变成动态数据源了。方法如下:

(1)右键单击数据源,再单击【修改】,如下图:

(2)在数据源设置对话框中,切换到【连接字符串】选项卡,再单击代表表达式的fx图标,如下图:

(3)在表达式编辑器窗口中,将原来的连接字串改为表达式。

具体包括:

(a)在连接字串之前加上等号和双引号(=")

(b)删除连接字串中末尾的数据库名称ArsDemo。

(c)在连接字串末尾加上双引号、空格、&符,如下图:

(d)在左侧的表达式元素列表树中,展开【参数】,选中之前定义好的DbName参数,单击【插入】按钮。

此时,连接字串变成下面这样的表达式:

="data source=(local);user id=user1;password=123;initial catalog=" & Parameters!DbName.Value

(e)点击【确定】按钮,完成表达式的编辑,返回数据源设置对话框。如下图:

此时,数据源的连接字串就变成一个表达式的形式了。

(4)点击【确定】按钮,保存数据源。

(5)点击【预览】查看报表效果。此时将出现一个报表参数栏,需要先输入DbName参数,再点击【查看报表】按钮,才能看到报表内容,如下图:

图中输入的数据库名为ArsDemo,如果输入另有一个数据库名,报表系统将连接到那个数据库执行查询,以获取数据集的数据。这就是动态数据源的效果。


注意

如果预览报表时报错,请尝试为DbName参数设置一个默认值,就是让报表在开始生成时至少有一个可以连接的数据库。

动态数据集的实现

同样的,数据集的SQL语句也支持表达式,因此用同样方法,也可以实现参数化的动态数据集。具体步骤如下:

(1)定义一个TableName参数,如下图:


(2)在数据集的设置对话框中,点击fx图标,打开表达式编辑器,如下图:

(3)通过插入TableName参数,将SQL语句修改位如下表达式:

="select * from " & Parameters!TableName.Value

如下图:

(4)此时预览报表,将需要输入两个参数,分别代表数据库名和表名,如下图:

除了数据库名,数据源连接字串的其他部分也可以设计成参数化的动态表达式,比如数据库用户名。

同样,除了表名,数据集的SQL语句中,其他构成部分(例如where条件或其中某个and子句)也可以根据参数设计成动态表达式。

一个典型的应用场景是:如果一个参数有值,那么就按这个参数值过滤某个字段的数据,否则就不要将这个参数作为过滤条件。

例如:

="select * from user where 1=1 " & IIF( Parameters!p1.Value = "", "", " and username like '%" & Parameters!p1.Value & "%'")

以上表达式的含义就是:如果用户没有输入p1参数,则SQL将为:

Select * from user where 1=1

否则,如果用户输入了p1参数,则SQL语句将变成:

Select * from user where 1=1 and username like %p1参数值%


  • No labels