您好我已经粘贴了一段代码,我正在显示一份报告。我正在使用Visual Studio 2008 Crystal Report引擎。它可以很好地处理这段代码
问题:每次运行报告时,它都会生成一个('。* tmp','。* rpt')文件,通常位于临时文件夹 c:\ windows \ temp < / strong>但是我们可以通过在应用程序池上设置回收来摆脱* .tmp文件,但需要一种方法来摆脱.rpt文件。
找到解决方案:在报表对象上调用关闭()和 Dispose()。我正在做的方式是crReportDoc.Close()然后crReportDoc.Dispose()
实际问题:如果调用 Dispose(),则报告会出现以下错误 '对象引用未设置为实例对象
如果其中一位同伴可以帮我解决问题,我将非常感激。因为我对编程很陌生。
由于
Dim crReportDoc = New CrystalDecisions.CrystalReports.Engine.ReportDocument
crReportDoc = Session("ReportDocument")
ReportViewer.DisplayToolbar = True
ReportViewer.EnableDrillDown = True
ReportViewer.DisplayGroupTree = False
ReportViewer.Visible = True
ReportViewer.DisplayToolbar = True
ReportViewer.ReportSource = crReportDoc
答案 0 :(得分:2)
有时即使您在ReportDocument
对象上调用dispose后跟GC.Collect()
,仍然会清除 Temp 文件夹中的.rpt
个文件。没有限制。在Temp文件夹中的.rpt
文件之后,CR停止执行进一步的报告请求。
奇怪的是,当你在一个函数或事件处理程序中声明ReportDocument对象时会发生这种情况。
但是,如果您在页面范围的全局上下文中声明ReportDocument,那么当您在Page_Unload()
事件中调用Dispose方法时,Crystal会很快清除temp .rpt文件!
答案 1 :(得分:1)
对于CRystal报告版本13及更高版本。清除临时文件。在CrystalReportViewer的Unload事件中调用dispose
protected void crReportViewer_Unload(object sender,EventArgs e) { CloseReport(); }
/// <summary>
/// This method is used to clear the temporary files created by Crystal Reports
/// </summary>
protected void CloseReport()
{
try
{
if(cryRpt != null)
{
Sections objSections = cryRpt.ReportDefinition.Sections;
foreach (Section objSection in objSections)
{
ReportObjects objReports = objSection.ReportObjects;
foreach(ReportObject rptObj in objReports)
{
if(rptObj.Kind.Equals(CrystalDecisions.Shared.ReportObjectKind.SubreportObject))
{
SubreportObject subreportObject = (SubreportObject)rptObj;
ReportDocument subReportDocument = subreportObject.OpenSubreport(subreportObject.SubreportName);
subReportDocument.Close();
}
}
}
cryRpt.Close();
cryRpt.Dispose();
}
if(crReportViewer != null)
{
crReportViewer.ReportSource = null;
crReportViewer.Dispose();
}
}
catch
{
}
}