一、 水晶报表数据模式(资料收集)
1. 推模式(push)
就是数据库将数据"推(Push)"给水晶报表,这个推的关系需要你自己写代码来实现。当然,推模式之前也需要先制作模板, 这个时候我们就可以使用字段定义的方式或ADO.Net(XML)等的方式,将报表与数据库连接上。
字段定义的方式是生成一个字段定义文件,这个文件模式成一个表结构映射给水晶报表,然后在程序中组合或获取数据到Recordset,将这个Recordset推入到水晶报表。而Ado.Net则是以一个Xml文件做为字段定义文件,在程序中组合或获取数据到DataSet来填充报表数据。
1.2编写连接代码
使用推模式我们还要在程序中加入数据绑定的代码。示例代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OracleClient;
using CrystalDecisions.CrystalReports.Engine; //添加的关于水晶报表类的引用。
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//CrystalDecisions.CrystalReports.Engine.ReportDocument cryperort = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
//cryperort.FileName = "C://Documents and Settings//Administrator//My Documents//Visual Studio 2005//WebSites//WebSite7//CrystalReport.rpt";
ReportDocument cryperort = new ReportDocument();
string Orclconnection = "Data Source=ServerName;User ID=ServerID;Password=ServerPasword;Unicode=True";
OracleConnection orclCon = new OracleConnection(Orclconnection);
DataSet ds = new DataSet();
orclCon.Open();
string Orclcmd = "Select DBNAME from DBMENT";
OracleDataAdapter OrclDA = new OracleDataAdapter(Orclcmd,orclCon);
OrclDA.Fill(ds,"EQUIPMENT");
cryperort.Load("C://Documents and Settings//Administrator//My Documents//Visual Studio 2005//WebSites//WebSite7//CReport.rpt"); //路径为制作好的报表存储位置。
cryperort.SetDataSource(ds); //绑定到报表的数据源。
CrystalReportViewer1.ReportSource = cryperort;
CrystalReportViewer1.DataBind();
CrystalReportViewer1.RefreshReport();
}
}
使用代码绑定数据后,就只要在页面添加CrystalReportView就可以了。
1.3自动登陆
关于报表在加载后显示登陆界面问题,我是参考网络的教程。
在这给出原文地址http://weiqinma.spaces.msn.com/blog/cns!D891C371DC9E6BF6!137.entry。
1.3.1
在Web.config文件里添加登陆的信息。
<add key="MyserverName" value="serverName" />
<add key="MyserverID" value="serverID" />
<add key="MyserverPw" value="serverPassword" />
1.3.2
建立判断登陆过程。
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace check
{
/// <summary>
/// Class1 的摘要说明
/// </summary>
public class LoginCrystalReport
{
public void LoginCrystalR(CrystalDecisions.CrystalReports.Engine.ReportDocument repotrd)
{
//
// TODO: 在此处添加构造函数逻辑
//
string servername = ConfigurationManager.AppSettings["MyserverName"];
string serverid = ConfigurationManager.AppSettings["MyserverID"];
string serverpw = ConfigurationManager.AppSettings["MyserverPw"];
foreach (CrystalDecisions.Shared.IConnectionInfo con in repotrd.DataSourceConnections)
{
if (con.ServerName == servername)
{
con.SetLogon(serverid, serverpw);
}
}
foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument subrep in repotrd.Subreports)
{
foreach (CrystalDecisions.Shared.IConnectionInfo con in repotrd.DataSourceConnections)
{
if (con.ServerName == servername)
{
con.SetLogon(serverid, serverpw);
}
}
}
}
}
}
1.3.3
调用登陆。
protected void CrystalReportPartsViewer1_Init1(object sender, EventArgs e)
{
base.OnInit(e);
check.LoginCrystalReport log = new check.LoginCrystalReport();
log.LoginCrystalR(this.CrystalReportSource2.ReportDocument);
}
2. 拉模式
就是水晶报表直接从数据库(数据源)中获取数据,就是水晶报表去拉(Pull),也叫提取。比如我们在选取数据源的时候选的Access/Excel、ODBC、OLEDB。这样基本上不需要编写什么代码,做好模板就可以了,到时候直接调模板就可以了。但是在部署或数据库等发生变动时就比较麻烦了。
对于拉模式,这两天研究不多,只好给出一段代码供大家参考学习。
/// <summary>
/// 使用Engine.Database填充CrystalReport,为oleDB,odbc使用,此例子为sqlserver,拉模式
/// </summary>
/// <param name="SeverName">服务器名称</param>
/// <param name="DatabaseName">数据库名称</param>
/// <param name="UserID">用户id</param>
/// <param name="Password">用户密码</param>
/// <param name="sender">水晶报表CrystalReport对象</param>
/*注意:使用Engine.Database填充必须先在水晶报表中设置相关数据字段*/
public void cryDBFill(string SeverName,string DatabaseName,string UserID,string Password,ReportClass sender)
{
TableLogOnInfo crTableLogOnInfo = new TableLogOnInfo();
ConnectionInfo crConnectionInfo = new ConnectionInfo();
CrystalDecisions.CrystalReports.Engine.Database crDatabase;
CrystalDecisions.CrystalReports.Engine.Tables crTables;
// CrystalDecisions.CrystalReports.Engine.Table crTable;
//对象定义
crConnectionInfo.ServerName = SeverName;
crConnectionInfo.DatabaseName = DatabaseName;
crConnectionInfo.UserID = UserID;
crConnectionInfo.Password = Password;
crDatabase = sender.Database;
crTables = crDatabase.Tables;
//水晶报表与数据库连接
foreach(CrystalDecisions.CrystalReports.Engine.Table crTable in crTables)
{
crTableLogOnInfo = crTable.LogOnInfo;
crTableLogOnInfo.ConnectionInfo = crConnectionInfo;
crTable.ApplyLogOnInfo(crTableLogOnInfo);
}
//循环表并进行填充
}
/// <summary>
/// 使用dataset填充CrystalReport和ReportDocument,为sqlserver专用,推模式,可以多次填充使用不同的表名在一个数据集中
/// </summary>
/// <param name="sqlText">数据库查询字段</param>
/// <param name="cnString">数据库连接字段</param>
/// <param name="DataTableName">虚拟数据集名称</param>
public void crySetFill(string sqlText,string cnString,string DataTableName)
{
// 建立数据集合(局部变量)
System.Data.SqlClient.SqlConnection connection1=new System.Data.SqlClient.SqlConnection(cnString);
System.Data.SqlClient.SqlDataAdapter Com=new System.Data.SqlClient.SqlDataAdapter (sqlText,connection1);
//给数据对象分配内存空间
//给数据集合分配内存空间
Com.Fill(Set1,DataTableName);
}
/// <summary>
/// 实现多个数据集设定填充CrystalReport
/// </summary>
/// <param name="sender">水晶报表CrystalReport对象</param>
public void rptReportClassFill(ReportClass sender)
{
//数据填充
sender.SetDataSource(Set1);
//首先使用crySetFill
//print1.cryDSetFill("select * from Customers","server=localhost;uid=sa;pwd=sa;database=Northwind","Customers");
// 申明公共类型,例如:
//public printClass print1=new printClass();
//public CrystalReport2 Rep1=new CrystalReport2();
//然后调用
//rptReportClassFill(Rep1);
//CrystalReportViewer1.ReportSource = Rep1;
//CrystalReportViewer1.DataBind();
// string sqlText="select * from customers";
// string cnString="server=localhost;uid=sa;pwd=sa;database=northwind;";
/*注意:使用dataset填充必须先建立一个可视的dataset.xsd,在其中添加element,并在水晶报表中显示相关数据字段*/
}
/// <summary>
/// 实现多个数据集设定填充CrystalReport
/// </summary>
/// <param name="sender">水晶报表ReportDocument对象</param>
public void rptReportDocumentFill(ReportDocument sender)
{
//数据填充
sender.SetDataSource(Set1);
//首先使用crySetFill
//print1.cryDSetFill("select * from Customers","server=localhost;uid=sa;pwd=sa;database=Northwind","Customers");
// 申明公共类型,例如:
//public printClass print1=new printClass();
//public ReportDocument RD1= new ReportDocument();
//然后调用
//rptReportDocumentFill(RD1);
//CrystalReportViewer1.ReportSource = RD1;
//CrystalReportViewer1.DataBind();
// string sqlText="select * from customers";
// string cnString="server=localhost;uid=sa;pwd=sa;database=northwind;";
/*注意:使用dataset填充必须先建立一个可视的dataset.xsd,在其中添加element,并在水晶报表中显示相关数据字段*/
}