首先描述一下问题:因为客户的需要,把所有对于数据库的操作做成了存储过程,同时也存在带有输入参数的存储过程.客户要求将所有的信息都可以用水晶报表显示.我们都知道,要使用水晶报表我们就要使用数据源的.在这里,我们使用的数据源自然而然也就是存储过程了.当然,我们也是知道的,在ADO.NET的连接模式下,要给水晶报表设置数据源我们需要用到数据集文件,同时,也免去了我们设计水晶报表的时间.在使用数据集文件作为水晶报表的数据源时存在了这样一种情况,我们使用没有带输入参数的存储过程是很简单的,可是一旦我们要往存储过程里面传入参数,就出现了问题,我们不能像在winform当中那样给水晶报表实例化,原因是在ASP.NET 2005中水晶报表是一个文件,它没有附带的.cs文件.那么,我们如何解决这个问题呢?
解析:参照以前在winform里面设计的模式,我们可以想到,在winform中水晶报表可以实例化,数据集文件也是可以实例化的,可是在上述问题中是不能实现的,也就不能按照winform中的写法去写这些代码了.我们可以回想一下在ASP.NET下所用到的东西:aspx文件,aspx.cs文件,水晶报表,报表阅读器,报表源,数据集文件,存储过程.可见,报表源这个控件是在winform写法中没有的东西,所以我们可以利用它来实现我们的功能.
解决问题:首先,我们创建数据集文件,在创建时会出现创建向导,我们要选择"已存在的存储过程",然后选择我们要使用到的存储过程,完成数据集文件的创建.第二,创建水晶报表,按照向导指示,选择新建ADO.NET连接,浏览到我们刚刚创建好的数据集文件,根据需要文成水晶报表的设计.第三,创建页面文件,添加报表阅览器控件,这时软件会给出提示,没有设置报表源,我们不用管它,而是自己添加一个报表源控件.接下来的操作就是在页面文件中通过报表源控件给存储过程传入数值了.见代码:
string strsql1 = "exec USP_REP_Customer_Normal_By_Organization '" + Session["msg"].ToString() + "'";
DataSet dt=DBHelper.getDataSet(strsql1,"4sShopRegisterList");
//添加报表
CrystalReportSource1.ReportDocument.Load(Server.MapPath("../rtp/4SShopRegisterList.rpt"));
//设置数据源
CrystalReportSource1.ReportDocument.SetDataSource(dt.Tables["4sShopRegisterList"]);
//绑定数据源
CrystalReportSource1.DataBind();
CrystalReportSource1.ReportDocument.Load(Server.MapPath("../rtp/4SShopRegisterList.rpt"));
//设置数据源
CrystalReportSource1.ReportDocument.SetDataSource(dt.Tables["4sShopRegisterList"]);
//绑定数据源
CrystalReportSource1.DataBind();
//给浏览控件设置报表源
CrystalReportViewer.ReportSource=CrystalReportSource1;
//绑定
CrystalReportViewer.DataBind();
CrystalReportViewer.ReportSource=CrystalReportSource1;
//绑定
CrystalReportViewer.DataBind();
这样问题就解决了,要注意的是数据源文件不支持带有虚拟表的存储过程.