2012-03-06 1 views
10

У меня возникла проблема с ошибкой в ​​приложении ASP.NET после просмотра одного и того же отчета много раз одновременно. Я получил это исключение:Исключение Crystal Reports: достигнут максимальный максимальный размер задания на обработку отчетов, заданный вашим системным администратором

The maximum report processing jobs limit configured by your system administrator has been reached.

Подождите, я знаю, что есть множество решений, но все они не работают со мной.

  1. Я положил ReportDocument.Close(); ReportDocument.Dispose(); в событии CrystalReportViewer_Unload и по-прежнему выдавать исключение.

    Private Sub CrystalReportViewer1_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Unload reportFile.Close() reportFile.Dispose() GC.Collect() End Sub

  2. отредактировать реестр PrintJobLimit в HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer и HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\Server -1 даже до 9999, и до сих пор бросить исключение.

Вот фрагмент кода, где я называю свой доклад:

Table_Infos = New TableLogOnInfos() 
       Table_Info = New TableLogOnInfo() 
       Con_Info = New ConnectionInfo() 

       With Con_Info 
        .ServerName = ConfigurationManager.AppSettings("server_name") 
        .DatabaseName = ConfigurationManager.AppSettings("DB") 
        .UserID = user_name 
        .Password = pass_word 
        .Type = ConnectionInfoType.SQL 
        .IntegratedSecurity = False 
       End With 

       Table_Info.ConnectionInfo = Con_Info 

       If Session("recpt_lang") = "Arabic" Then 
        reportFile.Load(Server.MapPath("/Reports/") & "collectrecpt_new_ar.rpt") 
       ElseIf Session("recpt_lang") = "English" Then 
        reportFile.Load(Server.MapPath("/Reports/") & "collectrecpt_new.rpt") 
       End If 

       For Each mytable In reportFile.Database.Tables 

        mytable.ApplyLogOnInfo(Table_Info) 

       Next 

       CrystalReportViewer1.ReportSource = reportFile 
       CrystalReportViewer1.SelectionFormula = Session("SelectionForumla") 
       CrystalReportViewer1 = Nothing 

ответ

8

Я рекомендовал бы двигая закрыть/распоряжаться код/​​GC.Collect вне этого процесса разгрузки. Другими словами:

  1. отчета Load
  2. Присвоить Viewer Control
  3. Показать отчет в окне просмотра Control
  4. Закройте окно просмотра и управления Unload (полностью)
  5. Затем закрыть/распоряжаться/GC.Collect снаружи от любого управляющего кода зрителя

Моя догадка - контроль зрителя не полностью закрыт, когда отчет очищается.

Crystal - очень интенсивный процесс с интенсивной памятью и очень тонкий.

+0

Я также пытаюсь сделать то же самое, используя ... но который показывает исключение ссылочного типа объекта, поэтому я должен использовать метод разгрузки, который не выглядит хорошо. –

11

Вы должны удалить экземпляр своего отчета в конце концов. Если вы удалите отчет после его показа, вы никогда не увидите сообщение об ошибке «Максимальное количество заданий на обработку отчетов, настроенное вашим системным администратором».

Dim report1 As rptBill = clsBill.GetReport(billNumber) 

    rpt.Print() 

    'Cleanup the report after that! 
    rpt.Close() 
    rpt.Dispose() 
0

Убедитесь, что используете модель PUSH для отображения отчетов. Далее вы должны сделать одно изменение в реестре вашего сервера: Следуйте по пути:

"HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer" 

и вы увидите пункт «PrintJobLimit», и вы увидите, что его значение по умолчанию равно 75. что означает, что сервер может обрабатывать только 75 отчетов за раз. Dont беспокоиться о том, что и просто изменить значение -1

+0

Пожалуйста, @Mansoor проверить мой вопрос, я написал, что я уже сделал это. –

+0

Вы по существу делаете задания печати неограниченными. это очень плохая практика. Можете также сказать им перезапустить IIS каждый раз, когда это произойдет, и с вами все будет в порядке. – oppassum

2

Привет, я слишком поздно, чтобы ответить на него, все ответ работают и я видел, но в случае, если до сих пор вы столкнулись с той же проблемой и ошибок, пожалуйста, один раз зайдите в папку TEMP в директории «windows» и удалите все экземпляры хрустального отчета. Я говорю это, потому что все вышеперечисленные опции будут работать, но вы по-прежнему находитесь в максимальном доступе, прежде всего, удалите все экземпляры, а затем примените все приведенное выше предложение. спасибо

1

Я работал над локальным сервером отчетов. Я разместил мое веб-приложение на другом ПК. Когда я получил такую ​​ошибку, я только что сделал IISRESET и теперь отлично работает.

Попробуйте это, это может вам помочь.

+0

Кто имеет downvoted? Дайте причину – pedram

2

Документ Crystal Report реализует интерфейс IDisposable. Итак, все, что вам нужно сделать, - это приложить экземпляр отчета с помощью инструкции using. Он будет автоматически закрыт и будет удален после завершения задания using. Вы можете написать что-то вроде этого:

using(var report = GetInvoiceReport()) 
{ 
    // your logic here 
} 

или (в зависимости от контекста):

using(var report = new ReportDocument()) 
{ 
    // your logic here 
} 
-1

Я закончил с использованием GC.WaitForPendingFinalizers в дополнение к GC.Collect, близко и распоряжения. Я считаю, что мой веб-страницы, возможно, разгрузка и остановка обработки нити преждевременно до того, как мусор был правильно обработан

Это на Server 2012, SQL 2012, CR 13.0.2000.0

Вот мой код (на самом деле?):

#Region "Cleanup" 

Private Sub crCleanup(Optional blnForce As Boolean = False) 
    Try 
     ' Crystal(code Is Not managed, i.e.it) 's COM interop => you have to manually 
     ' release any objects instantiated. Make sure you set the ref to nothing and 
     ' also call the dispose method if it has one. 

     ' under some conditions, we don't want to destroy the ReportDocument (e.g. report page-to-page navigation) 
     If blnForce OrElse Me.blnPageHasFatalError OrElse (Not Me.CrystalUseCache) Then ' do not release when using cache! (unless forced) 
      If Not crReportDocument Is Nothing Then Me.crReportDocument.Close() 
      If Not crReportDocument Is Nothing Then Me.crReportDocument.Dispose() 
      If Not thisWebAppUser Is Nothing Then Me.thisWebAppUser.Dispose() 
      Me.thisWebAppUser.ClearReportCache() ' we are using HttpContext.Current.Cache.Item instead of sessions to save CR document 
     End If 

     ' the rest of the items, we'll always want to clean up 
     If Not crParameterFieldDefinitions Is Nothing Then crParameterFieldDefinitions.Dispose() 
     If Not crParameterFieldDefinition Is Nothing Then crParameterFieldDefinition.Dispose() 

     crParameterFields = Nothing 
     crParameterField = Nothing 
     crParameterFieldName = Nothing 
     crParameterValues = Nothing 
     crParameterDiscreteValue = Nothing 
     crParameterDefaultValue = Nothing 
     crParameterRangeValue = Nothing 

     ' 
     If Not crSections Is Nothing Then crSections.Dispose() 
     If Not crSection Is Nothing Then crSection.Dispose() 
     If Not crReportObjects Is Nothing Then crReportObjects.Dispose() 
     If Not crReportObject Is Nothing Then crReportObject.Dispose() 
     If Not crSubreportObject Is Nothing Then crSubreportObject.Dispose() 
     If Not crDatabase Is Nothing Then crDatabase.Dispose() 
     If Not crTables Is Nothing Then crTables.Dispose() 
     If Not crTable Is Nothing Then crTable.Dispose() 
     crLogOnInfo = Nothing 
     crConnInfo = Nothing 

     crDiskFileDestinationOptions = Nothing 
     ConnParam = Nothing 

     If Not subRepDoc Is Nothing Then subRepDoc.Dispose() 
    Catch ex As Exception 
     Me.thisWebAppUser.SendSysAdminMessage("Failed CR cleanup", ex.ToString) 
    End Try 


    ' yes, use of the GC.Collect (and even more the GC.WaitForPendingFinalizers) is highly controversial 
    ' 
    ' the reality is that rendering crystal reports is rather slow compared to most web operations 
    ' so it is expected that waiting for GC will have relatively little performance impact 
    ' and will in fact, help tremendously with memory management. 
    ' 
    ' try setting these values to 1 and confirm for yourself by instantiating multiple crDocuments in different browsers if you don't believe it: 
    ' 
    ' HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer 
    ' HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\Server 
    ' 
    ' or google this error: The maximum report processing jobs limit configured by your system administrator has been reached 
    ' 
    ' I believe the problem is that on very fast servers, the page unloads and stops processing code to properly cleanup the Crystal Report objects 
    ' 
    ' This is done in 3 places: 
    ' Report Viewer (Page_Unload and CrystalReportViewer1_Unload) rendering a report will of course always using a processing job 
    ' Report Parameter Selector (Page_Unload) loading a crDocument without rendering a report still counts towards CR processing job limit. 
    ' Custom Control crReportParameterSelectionTable (Public Overrides Sub dispose()) 

    GC.Collect() 
    GC.WaitForPendingFinalizers() 

End Sub 
'*********************************************************************************************************************************** 
' 
'*********************************************************************************************************************************** 
Private Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Unload 
    'If Me.IsCallback Then Exit Sub ' the menutree causes callbacks, but we are not interested 

    crCleanup() 
    ' response object not available here, so cannot redirect (such as in the case of XLS opeing in a separate window) 

    ' if for some crazy reason there is STILL a crReportDocument, set it to nothing 
    '  If Not crReportDocument Is Nothing Then Me.crReportDocument = Nothing 
    '  Me.CrystalReportViewer1 = Nothing 
End Sub 

Private Sub CrystalReportViewer1_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Unload 
    'If Me.IsCallback Then Exit Sub ' the menutree causes callbacks, but we are not interested 

    crCleanup() 
End Sub 

Конец области

+0

напоминание о том, что данные наложения в crRoportDocument должны встречаться в Page_Init, а не Page_Load. См. [Https://scn.sap.com/thread/1070812](https://scn.sap.com/thread/1070812) – gojimmypi

1

Вы должны Dispose свой экземпляр отчета после того, как все. Если вы Dispose отчет после показа его, вы никогда не увидите сообщение об ошибке:

The maximum report processing jobs limit configured by your system administrator has been reached

Код:

Dim report1 As rptBill = clsBill.GetReport(billNumber) 

rpt.Print() 

'Cleanup the report after that! 
rpt.Close() 
rpt.Dispose() 
0

Убедитесь пользователь IIS имеют достаточное разрешение на удаление файлов представить в «C:/Windows/temp ".

сталкиваюсь тот же вопрос, когда я предоставить разрешение на запись в эту папку, то он решил мой issue.Also убедиться отчуждать этот объект после создания файла

Смежные вопросы