6.2 报表数据源方案
水晶报表主要用来显示数据,但无论多么强大的工具,没有数据源提供数据还是无用武之地的,因此为了能够充分利用报表的强大功能,数据源就显得非常重要。本节将介绍几种常见的报表数据源。
6.2.1 Excel数据源设计
Excel是一个可以实现数据排列和加减等运算的表格软件。它是一个完全开放的软件,除了能够满足用户的基本需求外,还能在已有的功能基础上开发出更适合需求的软件系统,所以Excel是在日常办公中经常用到的软件。
1.方案分析
Microsoft Excel早已被各行各业广泛使用,这意味着,有许许多多公司的财物、会计与各类数据皆使用Excel工作簿存储。因此在开发Web应用程序报表时,用户有时会要求以Excel工作簿作为报表的数据源。将Excel工作簿作为报表的数据源是非常重要的。
2.实施过程
实例位置:光盘\mr\06\6.2\6.2.1\01
开发库存管理系统时,因为需要做大量的关于库存信息资料的整理,包括商品库存信息、产品资料和销售记录管理等,使用Excel整理这些资料,就使得工作变简单。所以在开发报表时选择Excel作为数据源,图6.22为库存管理系统中的图书库存信息。

图6.22 Excel数据源设计效果
Excel数据源设计实施步骤如下:
(1)首先需要添加一个“Crystal报表”项。在“解决方案资源管理器”窗口中,选中当前网站,单击鼠标右键,在弹出的快捷菜单中选择“添加新项”命令,在弹出的“添加新项”对话框中选择“Crystal报表”项,并在“名称”文本框中输入报表名称“CrystalExport.rpt”,如图6.23所示。



图6.23 “添加新项”对话框
(2)单击【添加】按钮,弹出“Crystal Reports库”对话框,如图6.24所示,在该对话框中设置报表的属性。选择“作为空白报表”单选按钮,并选择“选择专家”区域中的“标准”选项。

图6.24 “Crystal Report库”对话框
(3)单击【确定】按钮,打开“报表设计器”对话框,如图6.25所示。

图6.25 “报表设计器”对话框
(4)在报表设计区域的任意空白处单击鼠标右键,在弹出的快捷菜单中选择“数据库/数据库专家”命令,弹出“数据库专家”对话框,如图6.26所示。

图6.26 “数据库专家”对话框
(5)单击“创建新连接”项左侧的加号(+),在展开项中,双击“OLE DB(ADO)”项下的“建立新连接”,弹出“OLE DB (ADO)提供程序”对话框,选择“Microsoft Jet 4.0 OLE DB Provider”Excel数据源“提供程序”,如图6.27所示。

图6.27 OLE DB 提供程序对话框
(6)单击【下一步】按钮,弹出“OLE DB(ADO)连接信息”对话框,单击“数据库名称”文本框旁边的【
】按钮,选择Excel文件的位置;在“数据库类型”下拉列表框中选择“Excel 8.0”,如图6.28所示。

图6.28 连接Excel数据文件
(7)单击【完成】按钮,返回“数据库专家”对话框,从“可用数据源”列表中将“图书库存”工作薄添加至“选定的表”列表中,如图6.29所示。

图6.29 “数据库专家”对话框
(8)单击【确定】按钮,返回报表设计器,打开“字段资源管理器”,将报表中所需的字段拖放至报表节中设计,报表如图6.30所示。

图6.30 报表设计器
(9)从“工具箱/Crystal Reports”中拖放一个CrystalReportViewer控件到要显示报表数据的页面中,单击控件右上角的【
】按钮,弹出快捷菜单,在“选择报表源”下拉列表框中选择“<新建报表源…>”项,如图6.31所示。弹出“创建报表源”对话框,如图6.32所示,在对话框中为CrystalReportSource控件指定(ID)名称和报表(CrystalReport.rpt),单击【确定】按钮。最后运行报表显示页查看效果。

图6.31 CrystalReportViewer快捷菜单 图6.32“创建报表源”对话框
3.补充说明
访问Excel工作薄中的数据必须特别注意,可以将工作薄中的每一个工作表(Sheet)当作一个数据表来使用,而工作表的名称就好比是数据表的名称。
6.2.2 Access数据源设计
Access是微软公司推出的基于Windows的桌面关系数据库管理系统(RDBMS),是Office系列应用软件之一。本节将介绍如何在报表中使用Access作为数据源。
1.方案分析
Access提供了表、查询、窗体、报表、页、宏、模块7种用来建立数据库系统的对象;提供了多种向导、生成器、模板,把数据存储、数据查询、界面设计、报表生成等操作规范化;为建立功能完善的数据库管理系统提供了方便,也使得普通用户不必编写代码,就可以完成大部分数据管理的任务,极大地提高了开发人员的工作效率,使得建立数据库、创建表、设计用户界面、设计数据查询、报表打印等可以方便有序地进行。
因此在中小型企业网站中,Access数据库的使用是比较广泛的,它以方便简洁而受到开发人员的青睐。在报表开发过程中,Access数据库是提供水晶报表数据源的主要方式之一。
2.实施过程
l 实施方案一 使用Access作为报表数据源
实例位置:光盘\ mr\06\6.2\6.2.2\01
开发新城校友录应用程序时,考虑到项目开发周期和开发效率等方面因素时,选择Access作为开发数据库。在打印学生信息时,选择水晶报表来完成。报表的数据源选择Access作为数据源,图6.33为新城校友录中同学信息的打印效果。

图6.33 Access数据源设计效果
Access数据库作为数据源实施步骤如下:
(1)首先需要添加一个“Crystal报表”项。在“解决方案资源管理器”窗口中,选中当前网站,单击鼠标右键,在弹出的快捷菜单中选择“添加新项”命令,在弹出的“添加新项”对话框中选择“Crystal报表”项,并在“名称”文本框中输入报表名称“CrystalExport.rpt”,如图6.34所示。



图6.34 “添加新项”对话框
(2)单击【添加】按钮,弹出“Crystal Reports库”对话框,如图6.35所示,在该对话框中设置报表的属性。选择“作为空白报表”单选按钮,并选择“选择专家”区域中的“标准”选项。

图6.35 “Crystal Report库”对话框
(3)单击【确定】按钮,打开“报表设计器”对话框,如图6.36所示。

图6.36 “报表设计器”对话框
(4)在报表设计区域的任意空白处单击鼠标右键,在弹出的快捷菜单中选择“数据库/数据库专家”命令,弹出“数据库专家”对话框,如图6.37所示。

图6.37 “数据库专家”对话框
(5)单击“创建新连接”项左侧的加号(+),在展开项中,双击“OLE DB(ADO)”项下的“建立新连接”,弹出“OLE DB (ADO)提供程序”对话框,选择“Microsoft Jet 4.0 OLE DB Provider”Access数据源“提供程序”,如图6.38所示。

图6.38 OLE DB 提供程序对话框
(6)单击【下一步】按钮,弹出“OLE DB(ADO)连接信息”对话框,单击“数据库名称”文本框旁边的【
】按钮,选择Access数据库文件的位置;在“数据库类型”下拉列表框中选择“Access”,如图6.39所示。

图6.39 连接Access数据库文件
(7)单击【完成】按钮,返回“数据库专家”对话框,从“可用数据源”列表中将“Tb_07”同学信息表添加至“选定的表”列表中,如图6.40所示。

图6.40 “数据库专家”对话框
(8)单击【确定】按钮,返回报表设计器,打开“字段资源管理器”,将报表中所需的字段拖放至报表节中设计,报表如图6.41所示。

图6.41 “报表设计器”对话框
(9)从“工具箱/Crystal Reports”中拖放一个CrystalReportViewer控件放置到要显示报表数据的页面中,单击控件右上角的【
】按钮,弹出快捷菜单,在“选择报表源”下拉列表框中选择<新建报表源…>项,如图6.42所示。弹出“创建报表源”对话框,如图6.43所示,在对话框中为CrystalReportSource控件指定(ID)名称和报表(CrystalReport.rpt),单击【确定】按钮。最后运行报表显示页查看效果。

图6.42 CrystalReportViewer快捷菜单 图6.43 “创建报表源”对话框
l 实施方案二 推入模式访问Access数据源设计
实例位置:光盘\ mr\06\6.2\6.2.2\02
在“商品销售管理系统”中的“商品汇总报表”模块中,该模块用于查询公司累计入库商品和库存商品等信息。在报表模块中根据用户要求,使用商品名称来查询数据动态的产生报表,此报表数据源选择推入模式访问Access数据库作为数据源。
当用户从下拉列表中选择要查看的商品信息,然后单击【载入报表】按钮动态生成商品信息报表,如图6.44所示。

图6.44 推入模式访问Access数据源设计效果
推入模式访问Access数据源设计实施方案步骤如下:
(1)打开欲设置其数据源的报表,打开Crystal Report Designer设计器。
(2)在报表设计区域的任意空白处单击鼠标右键,在弹出的快捷菜单中选择“数据库/数据库专家”命令,弹出“数据库专家”对话框。
(3)在“数据库专家”对话框中,单击“创建新连接”项左侧的加号(+),在展开项中,双击“Access/Excel(DAO)”项下的“建立新连接”,弹出“Access/Excel(DAO)”对话框,单击“数据库名称”文本框旁边的【
】按钮,选择要连接的Access数据库文件位置。在“数据库类型”下拉列表框中选择“Access”。如图6.45所示。

图6.45 Access/Excel(DAO)对话框
(4)单击【完成】按钮,返回“数据库专家”对话框,从“可用数据源”列表中将“Tb_08”商品信息表添加至“选定的表”列表中,如图6.46所示。

图6.46 “数据库专家”对话框
(5)单击【确定】按钮,返回报表设计器,打开“字段资源管理器”,将报表中所需的字段拖放至报表节中并设计报表。
(6)从“工具箱/Crystal Reports”中拖放CrystalReportViewer控件、一个DropDownList控件、一个Button控件、一个Lable控件放置到要显示报表数据的页面,页面设计如图6.47所示。

图6.47 加载报表页面设计
(7)在页面的加载事件中,将商品信息表中的商品名称字段绑定到DropDownList控件中。主要代码如下。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|db_schoolcomputer.mdb;");
con.Open();
string strSql = "select 商品名称 from tb_08";
OleDbDataAdapter myAdapter = new OleDbDataAdapter(strSql, con);
DataSet ds = new DataSet();
myAdapter.Fill(ds, "tb_08");
DropDownList1.DataSource = ds;
DropDownList1.DataTextField = "商品名称";
DropDownList1.DataBind();
}
}
注意:实现此段代码功能必须引用System.Data.OleDb命名空间。
(8)在【载入报表】按钮的单击事件中,将数据填入ADO.NET数据集并传递给报表对象,主要代码如下。
protected void Button1_Click(object sender, EventArgs e)
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|db_schoolcomputer.mdb;");
con.Open();
string strSql = "select * from tb_08 where 商品名称='"+DropDownList1.SelectedValue.ToString()+"'";
OleDbDataAdapter myAdapter = new OleDbDataAdapter(strSql, con);
DataSet ds = new DataSet();
myAdapter.Fill(ds, "tb_08");
ReportDocument studentsReport = new ReportDocument();//定义ReportDocument类对象
studentsReport.Load(Server.MapPath("CrystalReport.rpt"));//加载报表
studentsReport.SetDataSource(ds);//加载数据源
CrystalReportViewer1.ReportSource = studentsReport;//为CrystalReportViewer控件指定报表
}
注意:实现此段代码功能必须引用CrystalDecisions.CrystalReports.Engine;
3.补充说明
请不要在同一应用程序中交互使用两种对象模型,也就是说,不应该在同一时间同时使用两种对象模型的属性与方法。举例来说,设置Crystal Reports Engine对象模型中的参数字段时,就不应该在同一个报表中使用Windows Form viewer或Web Form Viewer对象模型去设置参数字段。应该根据本身的需求来决定要使用哪一个对象模型的各个类去进行控制报表。
6.2.3 SQL Server数据源设计
SQL Server数据库适用于各种类型的数据库系统,具有系统稳定、界面友好、扩张性强、成本较低、易于维护等特点。在开发大中小企业Web应用程序是是很好的选择。将SQL Server数据库作为报表的数据源是非常重要的。
1.方案分析
SQL Server引进并加强了对XML的支持,成为大型Web站点的最好的数据库管理系统之一。该数据库对硬件配置要求很低,且支持的操作系统相当广泛。具有完善强大的数据处理功能,正确的配置和管理SQL Server可以支持企业级数据库,而无需高配置的硬件环境,减少了项目开发的成本,其简单、友好的操作方式,包含一整套的管理和开发工具,如企业管理器和查询分析器,这些工具与Windows的紧密结合,在提供强大功能的同时又易于使用,用户可以把更多的精力放在自已的业务问题上,而不是考虑如何使用数据库系统。
对于需要持续运行且对数据访问与维护各个方面皆严格要求的应用系统而言,SQL Server数据库可说是最佳选择,因此在大中小型企业网站开发中,通常用到的数据存储工具主要是SQL Server数据库。如何通过提取模式和推入模式来使用SQL Server数据库是开发人员不能忽视的课题。
2.实施过程
l 方案实施一 通过提取模式来便用SQL Server 数据源
实例位置:光盘\ mr\06\6.2\6.2.3\01
在开发“网上书店系统”时,后台数据库采用SQL Server。在报表打印图书信息时,报表数据源采用提取模式来使用SQL Server 数据库。图6.48为网上书店系统中图书库存信息。

图6.48 SQL Serve数据源设计效果
通过提取模式来使用SQL Server数据源设计实施方案步骤如下:
(1)打开欲设置其数据源的报表,打开Crystal Report Designer设计器。
(2)在报表设计区域的任意空白处单击鼠标右键,在弹出的快捷菜单中选择“数据库/数据库专家”命令,弹出“数据库专家”对话框。
(3)在“数据库专家”对话框中,单击“创建新连接”项左侧的加号(+),在展开项中,双击“OLE DB(ADO)”项下的“建立新连接”,弹出“OLE DB (ADO)提供程序”对话框,选择“Microsoft OLE DB Provider for SQL Server” SQL Server数据源“提供程序”,如图6.49所示。

图6.49 OLE DB 提供程序对话框
(4)单击【下一步】按钮,弹出“OLE DB(ADO)连接信息”对话框,在对话框中依次进行下列设置:
l 在“服务器”下拉列表中输入或选取所要链接的SQL Server服务器名称。
l 接下来必须决定要采用哪一种安全性验证模式来登录SQL Server。如果要采用“Windows账户验证模式”,请勾选复选框“集成安全”;反之,如果要采用“SQL Server账户验证模式”,请不要勾选复选框“集成安全”。
l 如果已勾选单选框“集成安全”,则请直接从“数据库”下拉列表框中选择所要链接的SQL Server数据库。如未勾选复选框“集成安全”,请分别在“用户ID”与“密码”文本框中输入用来登录SQL Server用户识别码与密码,然后再从“数据库”下拉列表框中选取要链接的SQL Server数据库。
本实例设置效果如图6.50所示。

图6.50 连接SQL数据库文件
(5)单击【完成】按钮,返回“数据库专家”对话框,从“可用数据源”列表中将“tab_xsb”图书信息表添加至“选定的表”列表中,如图6.51所示。

图6.51 “数据库专家”对话框
(6)单击【确定】按钮,返回报表设计器,打开“字段资源管理器”,将报表中所需的字段从数据表中拖放至报表节中设计报表。然后从“工具箱/Crystal Reports”中拖放CrystalReportViewer控件放置到要显示报表数据的页面,设置CrystalReportSource控件指定(ID)名称和报表(CrystalReport.rpt),最后运行报表显示页查看效果。
l 方案实施二 通过推入模式来便用SQL Serve数据源
实例位置:光盘\ mr\06\6.2\6.2.3\02
在开发“计量中心管理系统”,员工工资报表打印模块时,根据用户需求,要求根据每月发放工资时间,查询打印员工工资信息。因此用推入模式来使用SQL Serve数据库作为报表数据源,使用ADO.NET数据集动态的控件报表结构。在员工工资报表模块中,用户从下拉列表中选取工资发放时间,然后单击【载入报表】按钮,动态生成员工当月工资信息报表,如图6.52所示。

图6.52 SQL Server数据源设计效果
通过推入模式来使用SQL Serve数据源设计实施方案步骤如下:
(1)打开欲设置其数据源的报表,打开Crystal Report Designer设计器。
(2)在报表设计区域的任意空白处单击鼠标右键,在弹出的快捷菜单中选择“数据库/数据库专家”命令,弹出“数据库专家”对话框。
(3)在“数据库专家”对话框中,单击“创建新连接”项左侧的加号(+),在展开项中,双击“OLE DB(ADO)”项下的“建立新连接”,弹出“OLE DB (ADO)提供程序”对话框,选择“Microsoft OLE DB Provider for SQL Server”SQL Server数据源提供程序,如图6.53所示。

图6.53 OLE DB 提供程序对话框
(4)单击【下一步】按钮,弹出“OLE DB(ADO)连接信息”对话框,在对话框中依次进行下列设置:
l 在“服务器”下拉列表框中输入或选取所要链接的SQL Server服务器名称。
l 接下来必须决定要采用哪一种安全性验证模式来登录SQL Server。如果要采用“Windows账户验证模式”,请勾选复选框“集成安全”;反之,如果要采用“SQL Server账户验证模式”,请不要勾选复选框“集成安全”。
l 如果已勾选复选框“集成安全”,则请直接从“数据库”下拉列表框中选择所要链接的SQL Server数据库。如未勾选复选框“集成安全”,请分别在“用户ID”与“密码”文本框中输入用来登录SQL Server的用户识别码与密码,然后再从“数据库”下拉列表框中选取要链接的SQL Server数据库。
本实例设置效果如图6.54所示。

图6.54 连接SQL数据库文件
(5)单击【完成】按钮,返回“数据库专家”对话框,从“可用数据源”列表中将“tb_worke”图书信息表添加至“选定的表”列表中,如图6.55所示。

图6.55 “数据库专家”对话框
(6)单击【确定】按钮,返回报表设计器,打开“字段资源管理器”,将报表中所需的字段从各个数据表拖放至报表节中设计报表。
(7)从“工具箱/Crystal Reports”中拖放CrystalReportViewer控件、一个DropDownList控件、一个Button控件、两个Lable控件放置到要显示报表数据的页面,页面设计如图6.56所示。

图6.56 报表显示页面设计
(8)在页面的加载事件中,调用FilLDropDownList()方法将工资发放时间绑定到DropDownList控件中。同时将所有员工工资信息加载到报表中显示在页面。主要代码如下。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
FilLDropDownList();//填冲DropDownList控件
SqlConnection con = new SqlConnection("server=(local);uid=sa;pwd=;database=db_06");
con.Open();
string strSql = "select * from tb_worke";
SqlDataAdapter da = new SqlDataAdapter(strSql,con);
DataSet ds = new DataSet();
da.Fill(ds,"tb_worke");
con.Close();
ReportDocument studentsReport = new ReportDocument();//定义ReportDocument类对象
studentsReport.Load(Server.MapPath("CrystalReport.rpt"));//加载报表
studentsReport.SetDataSource(ds);//加载数据源
this.CrystalReportViewer1.ReportSource = studentsReport;//为CrystalReportViewer控件指定报表
}
}
注意:实现此段代码功能必须引用System.Data.SqlClient和CrystalDecisions.CrystalReports.Engine命名空间。
自定义FilLDropDownList()方法,此方法功能是将员工的工资信息表中工资发放日期字段绑定到DropDownList控件中,主要代码如下。
public void FilLDropDownList()//填冲DropDownList控件
{
SqlConnection con = new SqlConnection("server=(local);uid=sa;pwd=;database=db_06");
con.Open();
string strSql = "select distinct 月份 from tb_worke";
SqlCommand com = new SqlCommand(strSql, con);
SqlDataReader dr = com.ExecuteReader();
while (dr.Read())
{
DateTime dat = Convert.ToDateTime(dr[0].ToString());
DropDownList1.Items.Add(dat.ToShortDateString());
}
dr.Close();
con.Close();
}
(9)在【载入报表】按钮的单击事件中,将根据用户选择条件查询出来的数据填入ADO.NET数据集并传递给报表对象,主要代码如下。
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("server=(local);uid=sa;pwd=;database=db_06");
con.Open();
string strSql = "select * from tb_worke where 月份='" + DropDownList1.SelectedValue.ToString() + "'";
SqlDataAdapter da = new SqlDataAdapter(strSql, con);
DataSet ds = new DataSet();
da.Fill(ds, "tb_worke");
con.Close();
ReportDocument studentsReport = new ReportDocument();//定义ReportDocument类对象
studentsReport.Load(Server.MapPath("CrystalReport.rpt"));//加载报表
studentsReport.SetDataSource(ds);//加载数据源
this.CrystalReportViewer1.ReportSource = studentsReport;//为CrystalReportViewer控件指定报表
}
注意:实现此段代码功能必须引用CrystalDecisions.CrystalReports.Engine;
3.补充说明
对SQL Server而言,除了使用图表之外,还可以使用存储过程作为ADO.NET数据集的数据源。只需调用存储过程并传递参数,返回符合条件的数据记录集而大大提升效率。由于存储过程已事先编译好并存储于SQL Server中,因此运行速度也比较快。将以上实例代码稍微修改如下。
(1)在SQL Server创建存储过程ProWorke,此存储过程用来根据条件果询数据,代码如下。
create procedure ProWorke
@monthMonye smalldatetime
as
begin
select * from tb_worke where 月份=@monthMonye
end
(2)在【载入报表】按钮的单击事件中,将根据用户选择条件查询出来的数据填入ADO.NET数据集并传递给报表对象,主要代码如下。
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("server=(local);uid=sa;pwd=;database=db_06");
con.Open();
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandText = "ProWorke";
com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add("@monthMonye", SqlDbType.SmallDateTime).Value = DropDownList1.SelectedValue.ToString();
SqlDataAdapter da = new SqlDataAdapter(com);
DataSet ds = new DataSet();
da.Fill(ds, "tb_worke");
con.Close();
ReportDocument studentsReport = new ReportDocument();//定义ReportDocument类对象
studentsReport.Load(Server.MapPath("CrystalReport.rpt"));//加载报表
studentsReport.SetDataSource(ds);//加载数据源
this.CrystalReportViewer1.ReportSource = studentsReport;//为CrystalReportViewer控件指定报表
}






