2009-07-26 437 views
12

我有一個使用Crystal Report 2008的Windows應用程序項目(C#和.NET 2.0)。但是我在加載報告時有時會出錯(它似乎意外)。那個錯誤是:CrystalReport加載報告失敗

CrystalDecisions.Shared.CrystalReportsException: Load report failed. 
System.Runtime.InteropServices.COMException (0x8000020D): Unable to load report. 
    at CrystalDecisions.ReportAppServer.ClientDoc.ReportClientDocumentClass.Open(Object& DocumentPath, Int32 Options) 
    at CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.Open(Object& DocumentPath, Int32 Options) 
    at CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.EnsureDocumentIsOpened() 
    --- End of inner exception stack trace --- 
    at CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.EnsureDocumentIsOpened() 
    at CrystalDecisions.CrystalReports.Engine.ReportDocument.Load(String filename, OpenReportMethod openMethod, Int16 parentJob) 
    at CrystalDecisions.CrystalReports.Engine.ReportDocument.Load(String filename) 
at SIA.DataTransfer.Forms.frmReport.GetStateReport(Int32 transferType) 

請指導我。我怎麼解決這個問題?

+0

計算這是否會發生在開發機器上?或者只是生產機器? – mattruma 2009-07-26 11:25:38

+0

這隻發生在生產機器上。我確定報告路徑是正確的。 – mSafdel 2009-07-27 05:00:10

+0

我遇到這個問題之前...我會做的第一件事是檢查以確保報告路徑是正確的。 – mattruma 2013-09-04 18:00:35

回答

0

互聯網還建議在您嘗試打開報告的機器上重新安裝水晶報表運行時間(確保所有位置具有相同版本)。

+0

thanx SeanJA。我應該測試這個解決方案。 – mSafdel 2009-07-27 05:00:46

16

如果您的應用程序是獨立的可執行文件,則會生成此錯誤,因爲您在完成該操作時沒有正確關閉報告對象。您可能會看到此錯誤將您的應用程序作爲ASP.NET應用程序運行,並且很多用戶同時訪問您的網站。

您可能會導致錯誤通過調整此註冊表項更快地出現:

HKEY_LOCAL_MACHINE\SOFTWARE\CRYSTAL DECISIONS\10.0\REPORT APPLICATION SERVER\SERVER\PrintJobLimit 

它通常默認爲75.爲了調試,你可以將其設置爲較小的值,並導致錯誤出現越早。

當您完成使用報表對象時,請調用清除所使用的非託管資源的.Close()方法。

有些提到將設置更改爲-1。這是一個錯誤,它只會對長時間運行的應用程序造成其他問題。這個過程最終會耗盡資源,並且會以難以排除故障的方式開始失敗。

+2

我在這裏閱讀http://devlibrary.businessobjects.com/businessobjectsxir2/en/en/CrystalReports_dotNET_SDK/crsdk_net_doc/doc/crsdk_net_doc/html/crconsdkfundamentalsscalabilityclosemethod.htm調用Close()方法的正確時間是在Page_Unload事件期間。 – 2012-01-16 15:25:35

0

僅供參考,我剛剛針對類似問題驗證了此解決方案。 ReportDocument.Load方法在使用映射網絡共享或UNC路徑時失敗,並在文件服務器上安裝水晶報表VS運行時解決了問題。

2

我已驗證John Dyer's解決方案,above,在所有情況下都不起作用。

我也證實重新安裝Crystal Runtime對這個特定的錯誤沒有好處。

對於我的應用程序,這隻發生在獨立.exe的Citrix安裝中,嵌入報告。按照John的說明,在使用Crystal Report Viewer之前,我需要確保清除了以前在查看器中加載的任何報告。所以,我寫的東西(在VB中)看起來像

Public Function ShowRpt(...) As Boolean 
    .... 
    CleanOutViewer() 
    .... 
End Function 

其中CleanOutViewer是:

Private Sub CleanOutViewer() 
    If Not Me.CrystalReportViewer1.ReportSource() Is Nothing Then 
     CType(Me.CrystalReportViewer1.ReportSource(), CrystalDecisions.CrystalReports.Engine.ReportDocument).Close() 
     CType(Me.CrystalReportViewer1.ReportSource(), CrystalDecisions.CrystalReports.Engine.ReportDocument).Dispose() 
     Me.CrystalReportViewer1.ReportSource() = Nothing 
     GC.Collect() 
    End If 
End Sub 

的來電之後.Close()也沒有效果(並加入作爲備用嘗試嘗試強制Crystal發佈資源)。

4

增加CurrentJobLimit是解決不了問題;如果計數器未被重置,則會達到此號碼。
爲了避免工作計數器增加,您需要關閉水晶報表文件(ReportSource.Close())編程。

protected void Page_Unload(object sender, EventArgs e) 
{ 
    CrystalReportViewer1.ReportSource.Close(); 
} 

這是爲了避免繼續打開的報告中提高的唯一途徑,由CurrentJobLimit

相關問題