印象中,這個錯誤碰到好多次了,還是記錄一下吧。
錯誤訊息
System.Runtime.InteropServices.COMException (0x80041004):記憶體不足,無法進行作業。
除了上述訊息,使用者可能還會看到「0x800003E5:無法開啟報表。」的錯誤訊息。
原因分析
原本的報表程式是在 ASP.NET 網頁的 Init 事件中建立 ReportDocument 物件,並填入報表內容,但沒有關閉報表。此寫法會造成 Crystal Reports 的 ReportDocument 物件沒有盡快釋放。
解決方法
在 Page_Unload 事件中呼叫 ReportDocument 物件的 Close() 方法來釋放報表。例如,在網頁類別中宣告一個私有成員:
亦可參考 MSDN 線上文件的說明:使用 Close() 方法釋放報表。
附註
保哥有一篇解決 ASP.NET 應用程式出現 System.OutOfMemoryException 的文章,若是 ASP.NET 應用程式(而非 Crystal Reports 報表)引發記憶體不足的錯誤,便可以試試看那篇文章的解法:調整 aspnet.config 參數。提醒一下:如果機器本身的記憶體容量並不算小(例如 4GB 以上),最好先看看自己的程式碼寫法有沒有問題,而不要第一個念頭就去調系統環境參數。如此反而容易將問題根源掩蓋,往往只撐得了一時。
錯誤訊息
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(); }
附註
保哥有一篇解決 ASP.NET 應用程式出現 System.OutOfMemoryException 的文章,若是 ASP.NET 應用程式(而非 Crystal Reports 報表)引發記憶體不足的錯誤,便可以試試看那篇文章的解法:調整 aspnet.config 參數。提醒一下:如果機器本身的記憶體容量並不算小(例如 4GB 以上),最好先看看自己的程式碼寫法有沒有問題,而不要第一個念頭就去調系統環境參數。如此反而容易將問題根源掩蓋,往往只撐得了一時。
沒有留言: