非常にバグの多い問題に直面しています。ASP.NETアプリケーションで同じレポートを何度も表示した後、次の例外が発生しました。
システム管理者が設定したレポート処理ジョブの最大数に達しました。
待って私はそこにたくさんの解決策があることを知っていますが、それらのすべては私と一緒に働いていません。
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
私は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
のPrintJobLimitレジストリを9999までも-1に編集し、それでも例外をスローします。
レポートを呼び出すコードスニペットを次に示します。
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
Close/dispose/gc.collectコードをそのアンロードプロセスの外に移動することをお勧めします。言い換えると:
私の推測では、レポートがクリーンアップされているとき、ビューアコントロールは完全に閉じられていません。
Crystalは、メモリを大量に消費するプロセスであり、非常に扱いにくいものです。
結局のところ、レポートインスタンスを破棄する必要があります。レポートを表示した後に破棄すると、「システム管理者が設定したレポート処理ジョブの最大数に達しました」というエラーが再び表示されることはありません。
Dim report1 As rptBill = clsBill.GetReport(billNumber)
rpt.Print()
'Cleanup the report after that!
rpt.Close()
rpt.Dispose()
Crystal ReportドキュメントはIDisposable
インターフェイスを実装します。したがって、レポートのインスタンスをusing
ステートメントで囲むだけで済みます。 using
ステートメントが完了すると、自動的に閉じて破棄されます。あなたはそのようなものを書くことができます:
using(var report = GetInvoiceReport())
{
// your logic here
}
または(コンテキストによって異なります):
using(var report = new ReportDocument())
{
// your logic here
}
挨拶私はそれに答えるのが遅すぎます、すべての返信は機能していて私は見ましたが、それでも同じ問題とエラーに直面している場合は、「windows」ディレクトリの下のTEMPフォルダに移動して、Crystalレポートのすべてのインスタンスを削除してください。上記のすべてのオプションは機能しますが、あなたはまだ最大限の範囲にいるので、最初にすべてのインスタンスを削除してから、上記のすべての提案を適用するため、これを言っています。ありがとう
私の場合、レポートには4つのサブレポートがありました...
私のために解決したのは、次のRegeditパスで「PrintJobLimit」の値を75から500に変更することでした。
\ HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer
\ HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\Server
レポートの表示にプッシュモデルを使用していることを確認してください。次に、サーバーのレジストリに1つの変更を加える必要があります。パスに従ってください:
"HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer"
「PrintJobLimit」という項目が表示され、そのデフォルト値が75であることがわかります。つまり、サーバーは一度に75のレポートしか処理できません。心配しないで、値を-1に変更してください
IISユーザーに、「c:/ windows/temp」フォルダにあるファイルを削除するための十分な権限があることを確認してください。).
そのフォルダーに書き込み権限を与えると、同じ問題に直面し、問題が解決しました。また、ファイルを生成した後でそのオブジェクトを破棄してください。
私はこのスレッドが古いことを知っていますが、たとえば1740分(デフォルト)ではなく180分でリサイクルするようにアプリプールの設定 "リサイクル..."を構成すると、必要なリソースが解放される可能性があります。
結局のところ、レポートインスタンスをDispose
する必要があります。レポートを表示した後でDispose
した場合、エラーは表示されません。
システム管理者によって構成されたレポート処理ジョブの最大数に達しました
コード:
Dim report1 As rptBill = clsBill.GetReport(billNumber)
rpt.Print()
'Cleanup the report after that!
rpt.Close()
rpt.Dispose()
ローカルレポートサーバーで作業していました。他のPCでWebアプリケーションをホストしています。そのようなエラーが発生したとき、私は[〜#〜] iisreset [〜#〜]を実行し、正常に動作しました。
これを試してください、これはあなたを助けるかもしれません。
最終的に、GC.Collectに加えてGC.WaitForPendingFinalizersを使用して、クローズして破棄しました。私のウェブページはおそらくゴミが適切に処理される前に、スレッドの処理を途中でアンロードして停止していたと思います(本当に?)
これはサーバー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