Подтвердить что ты не робот

Не удалось загрузить отчет CrystalReport

У меня есть проект приложений Windows (С# и .NET 2.0), который использовал Crystal Report 2008. Но иногда я получаю ошибку (кажется, случайно) в отчете о загрузке. Эта ошибка:

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)

пожалуйста, направляйте меня. Как я могу решить эту проблему?

4b9b3361

Ответ 1

Если ваше приложение является автономным исполняемым файлом, эта ошибка генерируется, потому что вы не закрываете свой объект отчета, когда закончите с ним. Вы можете увидеть, что эта ошибка запускает приложение как приложение ASP.NET с большим количеством пользователей, обращающихся к вашему сайту одновременно.

Вы можете заставить ошибку появиться раньше, изменив этот раздел реестра:

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

Обычно по умолчанию используется значение 75. Для отладки вы можете установить его на меньшее значение и привести к появлению ошибки раньше.

Когда вы закончите использовать объект отчета, вызовите метод .Close(), который очистит неиспользуемые ресурсы.

Есть те, которые упоминают, чтобы изменить параметр на -1. Это ошибка, это вызовет другие проблемы для приложения, которое работает в течение длительного времени. Процесс в конечном итоге закончится из-за нехватки ресурсов и начнется с ошибкой, что будет еще труднее устранить.

Ответ 2

Увеличение CurrentJobLimit не является решением; это число будет достигнуто, если счетчик не reset.
Чтобы избежать увеличения счетчика работы, вам необходимо закрыть документ Crystal Report (ReportSource.Close()).

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

Это единственный способ избежать продолжения увеличения открытого отчета, который подсчитывается CurrentJobLimit

Ответ 3

Я подтвердил решение, выше.

Я также подтвердил, что переустановка Crystal Runtime не помогла этой конкретной ошибке.

Для моего приложения это происходило только при установке Citrix автономного .exe со встроенными отчетами. Перед использованием 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

Документ Crystal Report должен быть удален вручную.

Вы должны контролировать срок службы всех отчетов в своем приложении и вызывать их Dispose до достижения предела 75.

Существует хороший подход к тому, как достичь этого в этой ссылке:

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

Ответ 5

Интернет также предлагает переустановить время выполнения хрустальных отчетов на машинах, на которых вы пытаетесь открыть отчет (убедитесь, что все местоположения имеют одну и ту же версию).

Ответ 6

FYI, я только что проверил это решение для аналогичной проблемы. Метод ReportDocument.Load не срабатывал при использовании сопоставленного сетевого общего или UNC-пути и установки отчетов о кристаллах VS runtime на файловом сервере устраняла проблему.