水晶报表相关资料

一、           水晶报表数据模式(资料收集)

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/ExcelODBCOLEDB。这样基本上不需要编写什么代码,做好模板就可以了,到时候直接调模板就可以了。但是在部署或数据库等发生变动时就比较麻烦了。

对于拉模式,这两天研究不多,只好给出一段代码供大家参考学习。

 /// <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填充CrystalReportReportDocument,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,并在水晶报表中显示相关数据字段*/
  }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值