水晶报表--小结

  1:PULL模式和PUSH模式的选择

PULL执行效率高,开发简单,适用于WinForm程序,用户不是很多的系统。
但是多了一个数据库连接,而且这个链接的占用时间还比较长,所以不适合用户多的系统。
有一种特例,就是数据量特别大的情况,我推荐用PULL。

PUSH则很灵活,可以承接任何数据源。比如不是从数据库里直接出来的数据,或者是来自于WebService等其他应用的数据接口。


2:WebForm开发的一个重要技巧:小代码,大作用

在前面的文章中,我一直是用WebForm演示的,主要是因为 HTTP是无状态的,在此链接的操作,不会带到下一连接中。
所以我们经常会遇到这样的情况,当前显示好的,在翻页、导出、打印等动作的时候,出出现无数据,或者需要重新登陆数据库的提示。
这是因为这些动作都重新触发了页面,导致我们前一次的操作丢失了。
所以之前的代码,我一直是写在Page_load里的,但是这样一是不能解决所有的问题,特别是涉及到有参数传递等情况。
二是可能会多次请求数据库,导致资源的消耗。

前面说到 既然是状态丢失,那么我们可以用.Net里的session,cache或viewstate来进行保持状态

这里我用session做一个范例,场景是这样的:
一个PUSH模式的报表,带一个参数p1.
界面上有一个Button,点击后展现报表。然后报表可以进行翻页、打印和导出(这些是工具条实现的,不进行编码实现)而不会出现错误提示。

其实只要改造两处地方即可,注意红色的部分

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
  //使用Session保持ReportDocument对像
//每次页面更新时,不再需要重新走数据库
//注意:如果是VS2008,这段代码要放到Page_Init事件中

  If (Session["myRpt"]!=null) then
{
CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"];
}


  }

  //点击按钮后,报表进行第一次呈现
  protected void Button1_Click(object sender, EventArgs e)
  {
  //连接字串
  String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";
  OleDbDataAdapter da = new OleDbDataAdapter();
  OleDbConnection cn = new OleDbConnection(connstr);
   
  da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);
  DataSet2 dt1 = new DataSet2();
  da.Fill(dt1, "RPT_CR_TEST1");
  ReportDocument myReport = new ReportDocument();
  string reportPath = Server.MapPath("crystalreport1.rpt");
  myReport.Load(reportPath);

  //绑定数据集,注意,一个报表用一个数据集。
  myReport.SetDataSource(dt1.Tables[0]);
  myReport.SetParameterValue("p1","参数测试");
  CrystalReportViewer1.ReportSource = myReport;
   
  //保存到Session
 
  Session["myRpt"]=myReport;
   
  }
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值