Crystal Reports 錯誤:記憶體不足(0x80041004)

印象中,這個錯誤碰到好多次了,還是記錄一下吧。

錯誤訊息

System.Runtime.InteropServices.COMException (0x80041004):記憶體不足,無法進行作業。

除了上述訊息,使用者可能還會看到「0x800003E5:無法開啟報表。」的錯誤訊息。

原因分析

原本的報表程式是在 ASP.NET 網頁的 Init 事件中建立 ReportDocument 物件,並填入報表內容,但沒有關閉報表。此寫法會造成 Crystal Reports 的 ReportDocument 物件沒有盡快釋放。

解決方法

在 Page_Unload 事件中呼叫 ReportDocument 物件的 Close() 方法來釋放報表。例如,在網頁類別中宣告一個私有成員:
public partial class MyReport1 : System.Web.UI.Page
{
    private ReportDocument m_RptDoc;
    //....
}
然後在 Page_Init 事件中建立報表物件並處理報表內容:
protected void Page_Init(object sender, System.EventArgs e)
{
    m_RptDoc = new ReportDocument();
    m_RptDoc.Load("報表檔.rpt");
    // ....
    CrystalReportViewer1.ReportSource = m_RptDoc;
}
最後在 Page_Unload 事件中關閉並釋放報表:
protected void Page_Unload(object sender, System.EventArgs e) 
{
    m_RptDoc.Close();
    m_RptDoc.Dispose();
}

亦可參考 MSDN 線上文件的說明:使用 Close() 方法釋放報表

附註

保哥有一篇解決 ASP.NET 應用程式出現 System.OutOfMemoryException 的文章,若是 ASP.NET 應用程式(而非 Crystal Reports 報表)引發記憶體不足的錯誤,便可以試試看那篇文章的解法:調整 aspnet.config 參數。提醒一下:如果機器本身的記憶體容量並不算小(例如 4GB 以上),最好先看看自己的程式碼寫法有沒有問題,而不要第一個念頭就去調系統環境參數。如此反而容易將問題根源掩蓋,往往只撐得了一時。
Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor