如何在Crystal Report运行时中删除“加载报告失败”错误?

时间:2017-08-03 20:09:46

标签: c# .net winforms crystal-reports

我在客户端的PC上使用Crystal Reports Runtime 13.0.5在我的WinForms应用程序中进行帐单打印。在我的一些客户开始遇到问题之前,一切都很顺利。

在一整天的报告生成/打印后,在晚上,每次生成报告时,Crystal Reports都会开始显示错误“加载报告失败”。

我注意到我的客户端在一天内生成了数百个报告,CR运行时每次生成账单时都会在临时文件夹中生成临时文件。也许那些数百天的临时文件会对CR运行时造成负担并导致它在晚上发出此错误。

关闭应用程序并从文件夹中删除所有临时文件允许CR运行时再次开始工作。我还将Crystal Reports的最大作业限制从75增加到1000.

但是,我无法告诉所有客户关闭应用程序,删除所有临时文件,然后再次使用该应用程序。我需要一个解决这个问题的永久解决方案。

或者,如果没有任何永久解决方案,是否有办法在每次报告生成后删除临时文件?

修改 我试过处理报告但没有成功。我正在从主窗体显示报表对话框并在报表查看器窗体上设置数据源。如果我在显示报告查看器窗口之前处理我的报告,我会收到错误“对象引用未设置为对象的实例”。附加代码以便更好地理解。

在主要表单上:

if (str1 == "A4Printer")
{
     Frm_ReportViewer _objfrm_ReportViewer = new Frm_ReportViewer();
     DataTable dtDetailsReport = _objCommon.DataGridView2DataTable(dgv_SaleForm, "table");
     SendData _obj = new SendData(_objfrm_ReportViewer.ReceiveSalesDataA4);
     _obj(dtDetailsReport, txt_BillNo.Text, accno, txt_PaidAmount.Text, txt_Balence.Text, txt_TotalAmount.Text, txtdisc.Text);
     _objfrm_ReportViewer.ShowDialog();
     ClearSale();
     MasterClear();
     cmb_CustomerName.Select();
}

在报告查看器表单上

public void ReceiveSalesDataA4(DataTable dtDetail, string BillNO, string AccNo, string PaidAmount, string Balance, string TotalAmount, string Disc)
{
    CrystalReport.Crt_SaleBill _objReport = new CrystalReport.Crt_SaleBill();
    string CompanyMaster = "SELECT tbl_CompanyMaster.CompanyName, tbl_CompanyMaster.Addressline1, tbl_CompanyMaster.Addressline2, tbl_CompanyMaster.MobileNo1, tbl_CompanyMaster.MobileNo2, tbl_CompanyMaster.Landlineno, tbl_CompanyMaster.VatNo, tbl_CompanyMaster.Tinno FROM tbl_CompanyMaster";
    string CustomerMaster = "SELECT CustomerName,AccNo,Address,PhoneNo,Dat FROM tbl_CustomerMaster WHERE (AccNo = '" + AccNo + "')";

    DataTable dt_CustomerMaster = _objSQLHelper.GetDataTable(CustomerMaster);
    _objReport.Database.Tables["dt_registration"].SetDataSource(dt_registration);
    _objReport.Database.Tables["dt_SalesThermalReport"].SetDataSource(dtDetail);
    _objReport.Database.Tables["dt_CustomerMaster"].SetDataSource(dt_CustomerMaster);
    _objReport.SetParameterValue("BillNo", BillNO);
    _objReport.SetParameterValue("PaidAmount", PaidAmount);
    _objReport.SetParameterValue("Disc", Disc);
    _objReport.SetParameterValue("Balance", Balance);
    _objReport.SetParameterValue("TotalAmount", TotalAmount);

    _objReport.SetParameterValue("cdt", clsVariable.CDate);

    Crt_ReportViewer.ReportSource = _objReport;

}

如果我在_objReport.Dispose();之后加Crt_ReportViewer.ReportSource = _objReport;, 在主窗体_objfrm_ReportViewer.ShowDialog();上给出错误“对象引用未设置为对象的实例”。所以,我不能在这里处理它。我正在寻找另一种解决方案。我为任何错误道歉,我是Crystal Report的新手,这个问题对我公司来说太重要了,因为客户因“加载报告失败”错误而烦恼。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您不必删除任何临时文件来解决此问题。每次要使用它时都要创建报表的新实例并且不要将其丢弃,就会出现此问题。

请考虑以下代码:

private void button1_Click(object sender, EventArgs e)
{
    for (int i = 1; i <= 1000; i++)
    {
        CrystalReport1 myReport = new CrystalReport1();
        myReport.SetDataSource(MyDataSet);
    }
}

这很可能会导致&#34;加载报告失败&#34;一些迭代后出错。要解决此问题,只需在不再需要时处理报告。

private void button1_Click(object sender, EventArgs e)
{
    for (int i = 1; i <= 1000; i++)
    {
        CrystalReport1 myReport = new CrystalReport1();
        myReport.SetDataSource(MyDataSet);
        //
        //Some code here
        //
        myReport.Dispose();
    }
}

更好的解决方案是仅将报表变量声明一次。这也将使代码运行得更快。

private void button1_Click(object sender, EventArgs e)
{
    CrystalReport1 myReport = new CrystalReport1();

    for (int i = 1; i <= 1000; i++)
    {
        myReport.SetDataSource(MyDataSet);
    }

    myReport.Dispose();
}