最近搞水晶报表,发现N多问题,最大问题莫过于并发数量了,在网上查到可以通过修改注册表。VS2005默认为5个并发数量,好像是这样的。
因为我建立了3个报表,当我打开多次后,就出现错误,提示数量受管理员限制。
当你打开这个报表,然后关闭这个报表,那么5个位置,还剩5个位置,除非你5个一起都打开了。
不过一般没人会这么做!
还有一种做法,释放资源!!!!
我建立的程式,只不过有3个报表,为什么还提示呢?不是可以有5个吗?
后来考虑到,原来是我打开报表的时候没有释放掉这个报表使用的资源,所以服务器就认为你还在使用中^_^很郁闷吧&……
怎么解决这个问题呢?OK,我们开始!
在报表页面中,也就是CrystalReportViewer控件所在的页面,当你执行到CrystalReportViewer1.ReportSource =doc;这里时,后面的工作就是释放资源了。
这一句程式,大家应该明白吧?好吧,我贴上来部分代码,看一下。
//创建报表文档对象
ReportDocument doc;
private void initAQXXZBRB()
{
//获取报表数据,这里如果不明白,可以看我以前写的关于报表的文章(http://hi.baidu.com/theonlyonelove/blog/item/68c98402f0088b084bfb5183.html)
SqlDataReader dr = AnQuanXinXiGL.getAQXXZBRB(ddlyear.Text, ddlmon.Text, ddlday.Text);
//创建报表强类型数据集
AQXXZBRBDS ds = new AQXXZBRBDS();
//填充数据集
ds.Load(dr, LoadOption.OverwriteChanges, ds.Tables[0]);
//实例化报表文档对象
doc = new ReportDocument();
//加载报表文件
doc.Load(Server.MapPath("../ReportFile/AQXXZBRB.rpt"));
//设置数据源
doc.SetDataSource(ds.Tables[0]);
//给予显示控件文档对象
CrystalReportViewer1.ReportSource = doc;
//不显示组树
CrystalReportViewer1.DisplayGroupTree = false;
//不显示徽标
CrystalReportViewer1.HasCrystalLogo = false;
//释放使用的资源
dr.Close();
ds.Dispose();
}
好了,大家看到没?这里的dr一定要关闭哦,你应该明白这点。
ds为强类型数据集,推模型中必须要用到的。这里也要释放一下。
这些够了吗?不够,还差的远呢,还需要释放70%的资源,才能让你的服务器承受的住。
在报表页面中添加如下程式:
protected void Page_UnLoad(object sender, EventArgs e)
{
//建立完页面时,释放报表文档资源
doc.Close();
this.Dispose();
this.ClearChildState();
}
UnLoad到底是什么时候执行的呢?有人说是关闭页面时?哈哈……你自己试试!!!
doc为报表文档对象,就因为这个的存在,所以才会老出毛病,doc+doc+++等于限制数量了,你就OVER了。
this.Dispose();其实这一句,垃圾回收器会自己去释放的,不过我建议还是自己DIS一下。
this.ClearChildState();经过我的测试,证明这一句程式是很重要的,他释放了服务器控件所占用的状态信息。由此我想到,报表占用的状态信息应该是很大的。
好了,我的程序还在调试当中,上面所说的应该可能不太准确,希望不要拍我~~~~
-=-------------------------------------------------------------------
2008-12-03
今天忽然想起来一件很重要的问题。
ASP.NET缓存释放问题。
不信你做水晶报表时,你看看虚拟内存的使用?我等了好几分钟都没有释放掉。
这又是一个新的话题。