mSafdel
mSafdel

Reputation: 1495

CrystalReport Load report failed

I have a windows application project (C# and .NET 2.0) that used Crystal Report 2008. But I get error sometimes (it seems accidentally) in loading report. That error is:

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)

please guide me. How can I solve this problem?

Upvotes: 13

Views: 76191

Answers (7)

spm
spm

Reputation: 1

The ReportDocument.Load method was failing when using a mapped network share or UNC path and installing the crystal reports VS runtime on the file server fixed the problem.

Upvotes: 0

Muhammad Ashhar Hasan
Muhammad Ashhar Hasan

Reputation: 299

Go to report properties and set "buildAction" to "Content".

Upvotes: 0

John Dyer
John Dyer

Reputation: 2358

If your application is a standalone executable then this error is generated because you are not closing your report object properly when you are done with whatever you do. You might see this error running in your application as an ASP.NET app with a lot of users accessing your site simultaneously.

You can cause the error to appear sooner by tweaking this registry key:

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

It normally is defaulted to 75. For debugging you can set it to a smaller value and cause the error to appear sooner.

When you are done using a report object, call the .Close() method which will clean up the un-managed resources used.

There are those that mention to change the setting to -1. This is a mistake, it will only cause other problems for an application that is long running. The process will eventually run out of resources and start to fail in ways that will be even more difficult to troubleshoot.

Upvotes: 19

Emanuele Greco
Emanuele Greco

Reputation: 12721

Increasing CurrentJobLimit is not the solution; this number will be reached if the counter is not reset.
To avoid Job counter increase, you need to close the Crystal Report Document (ReportSource.Close()) programmatically.

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

This is the only way to avoid continue increasing of opened report, that are counted by CurrentJobLimit

Upvotes: 4

Pilo
Pilo

Reputation: 1250

Crystal Report Document needs to be manually disposed.

You should control the lifetime of all Reports in your application and call their Dispose before reaching the 75 limit.

There is a good approach on how to achieve this in this link:

http://geekswithblogs.net/technetbytes/archive/2007/07/17/114008.aspx

Upvotes: 2

David T. Macknet
David T. Macknet

Reputation: 3162

I have verified John Dyer's solution, above, does not work in all cases.

I have also verified that reinstalling Crystal Runtime did no good for this particular error.

For my app this was only happening on Citrix installs of a stand-alone .exe, with embedded reports. Before using the Crystal Report Viewer, I need to make sure that I've cleared out any report previously loaded in the viewer, as per John's instructions. So, I'll wrote something (in VB) which looks like

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

where CleanOutViewer is:

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

The calls after .Close() also had no effect (and were added as an alternate attempt to try to force the Crystal to release resources).

Upvotes: 3

SeanJA
SeanJA

Reputation: 10344

The internet also suggests reinstalling the crystal report runtimes on the machines you are trying to open the report on (making sure that all locations have the same version).

Upvotes: 0

Related Questions