on 02-24-2009 4:18 AM
はじめまして
Crystal Report 2008 の「レポートのロードに失敗しました」について
似たような質問がありましたが、現象が若干異なるため、質問させて頂きます。
-
<動作環境>
OS : Windows Server 2003 R2
: Microsoft Internet Information Services (IIS) 6.0
Microsoft .NET Framework Version 2.0 (Version 2.0.50727)
Microsoft .NET Framework 2.0 日本語 Language Pack (x86)
開発 : Microsoft Windows XP SP3
Microsoft Visual C# 2005 (Version 8.0 50727-7600 SP.050727-7600)
にて ASP.NET Webアプリケーション を作成
Business Objects Crystal Report 2008 Version 12.0.0.0
帳票出力先 : Adobe Acrobat (PDF)
WebForm に CrystalReportViewer と CrystalReportSource オブジェクト、
[表示ボタン]、パラメータ用のドロップダウンリストやテキストボックスを貼り付けています。
WebForm を最初に表示させたとき、あるいは [表示ボタン]を押した際に、
最新のパラメータを取得して、SQL Server 2005 から DataSet経由でデータを取得して、
CrystalReportViewer に帳票のプレビュー画面を表示します。
5~6台の各クライアントから、何度か(少なくとも100回以上)プレビュー画面を表示させると、
CrystalDecisions.CrystalReports.Engine から
「レポートのロードに失敗しました。」 というエラーが発生してしまいます。
(印刷ボタンを押してPDFファイルをエクスポートする時にエラーは発生していません)
エラー発生箇所は、u2193の Page_Init()内です。
なお、[表示ボタン]を押すと、
Page_Init() u21D2 Button_Click() u21D2 CrystalReportViewer_Unload()
の順序で実行されます。
具体的なソースコードを以下に示します。(一部のコードは省略しています)
/// <summary>
/// ページが初期化されたときに発生するイベント
/// </summary>
/// <param name="sender">イベントのソース</param>
/// <param name="e">イベントデータを格納しているオブジェクト</param>
protected void Page_Init(object sender, EventArgs e)
{
// 帳票オブジェクトを作成
crystalReport = new CrystalReport();
// 最新のパラメータを取得して、帳票オブジェクトに渡す
crystalReport.SetParameterValue("パラメータ", parameter);
// 帳票プレビュー ※(u2193ここで、エラーが発生しているようです。)
crystalReportViewer.ReportSource = crystalReport;
}
/// <summary>
/// ページがアンロードされたときに発生するイベント
/// </summary>
/// <param name="sender">イベントのソース</param>
/// <param name="e">イベントデータを格納しているオブジェクト</param>
protected void CrystalReportViewer_Unload(object sender, EventArgs e)
{
// 帳票オブジェクトを閉じる
crystalReport.Close();
}
/// <summary>
/// [表示ボタン]が押されたときに発生するイベント
/// </summary>
/// <param name="sender">イベントのソース</param>
/// <param name="e">イベントデータを格納しているオブジェクト</param>
protected void Button_Click(object sender, EventArgs e)
{
// 最新のパラメータを取得して、帳票オブジェクトに渡す
crystalReport.SetParameterValue("パラメータ", parameter);
// プレビュー
crystalReportViewer.ReportSource = crystalReport;
}
エラーの回避方法がありましたら、お知恵をお貸し下さい。
よろしくお願い致します。
-
さらに補足説明です。
レポートオブジェクトを明示的にClose()しているにも関わらず、レポートオブジェクトが消費している
メモリを解放できていないため、いつの間にか「システム管理者が設定したレポート処理ジョブの最大数」
を超えていたことが原因でした。
試しに、レジストリ
HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects\Suite 12.0\Report Application Server\Server
"PrintJobLimit" の値 を 75 u21D2 5 に変更したところ、
5回レポートを表示させたらエラーが出ました。
よって、全くレポートオブジェクトが解放されていないようです。
CrystalReportViewerを使用しているため、
・CrystalReportViewer_Unload(object sender, EventArgs e)
このイベント内でClose()処理をしていましたが、
・Page_Unload(object sender, EventArgs e)
このイベント内でClose()処理をしても、状況は変わらずでした。
確実に、レポートオブジェクトの消費しているメモリを解放するにはどのようにすればよろしいでしょうか?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
自己解決しました。
ブレークポイントをかけて追っかけていったところ、なぜか帳票オブジェクトを2個作成していました。
Close()によって、1個しか破棄していたため、結果として帳票オブジェクトがたくさん作られていました。
【修正前】
protected void Page_Init(object sender, EventArgs e)
{
if (IsPostBack == false)
{
// 帳票オブジェクトを作成
crystalReport = new CrystalReport();
}
}
【修正後】
protected void Page_Init(object sender, EventArgs e)
{
if (IsPostBack == false)
{
if (crystalReport == null)
{
// 帳票オブジェクトを作成
crystalReport = new CrystalReport();
}
}
}
以上です。
補足説明をさせて頂きます。
1台のクライアントのみから、連続して帳票のプレビュー画面を表示させても
おおよそ50~60回ほど連続して表示させると「レポートのロードに失敗しました。」
のエラーが発生することが確認されました。
一度、このエラーが発生してしまうと、サービスを再起動するまでエラーが出続けます。
以上です。
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.