作成日: 2014/12/08 最終更新日: 2017/01/17
文書種別
不具合
状況
修正済み
詳細
ReportViewerの実行時に作成されるreportService.ashxにてNullReferenceExceptionが発生する場合があります。
エラーの発生箇所は次のコードです。
◎サンプルコード (reportService.ashx)
このエラーは下記コードのようにレポートの作成タスクを設定した後にReportNameを設定した場合に発生致します。
◎サンプルコード (VB)
◎サンプルコード (C#)
エラーの発生箇所は次のコードです。
◎サンプルコード (reportService.ashx)
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
このエラーは下記コードのようにレポートの作成タスクを設定した後にReportNameを設定した場合に発生致します。
◎サンプルコード (VB)
Protected Sub Page_Load(sender As Object, e As EventArgs)
…
' リスト出力
C1ReportViewer.RegisterDocument("ReportTasks", AddressOf CreateReport)
C1ReportViewer1.FileName = "FileName"
C1ReportViewer1.ReportName = "ReportName"
' メモリ内ドキュメントの削除
C1ReportViewer.UnRegisterDocument("ReportTasks")
End Sub
Private Function CreateReport() As C1PrintDocument
Dim rep As C1Report = C1ReportViewer.CreateC1Report()
rep.Load("ReportTemplate", "ReportName")
rep.Render()
Return rep.C1Document
End Function
…
' リスト出力
C1ReportViewer.RegisterDocument("ReportTasks", AddressOf CreateReport)
C1ReportViewer1.FileName = "FileName"
C1ReportViewer1.ReportName = "ReportName"
' メモリ内ドキュメントの削除
C1ReportViewer.UnRegisterDocument("ReportTasks")
End Sub
Private Function CreateReport() As C1PrintDocument
Dim rep As C1Report = C1ReportViewer.CreateC1Report()
rep.Load("ReportTemplate", "ReportName")
rep.Render()
Return rep.C1Document
End Function
◎サンプルコード (C#)
protected void Page_Load(object sender, EventArgs e)
{
…
// リスト出力
C1ReportViewer.RegisterDocument("ReportTasks", CreateReport);
C1ReportViewer1.FileName = "FileName";
C1ReportViewer1.ReportName = "ReportName";
// メモリ内ドキュメントの削除
C1ReportViewer.UnRegisterDocument("ReportTasks");
}
private C1PrintDocument CreateReport()
{
C1Report rep = C1ReportViewer.CreateC1Report();
rep.Load("ReportTemplate", "ReportName");
rep.Render();
return rep.C1Document;
}
{
…
// リスト出力
C1ReportViewer.RegisterDocument("ReportTasks", CreateReport);
C1ReportViewer1.FileName = "FileName";
C1ReportViewer1.ReportName = "ReportName";
// メモリ内ドキュメントの削除
C1ReportViewer.UnRegisterDocument("ReportTasks");
}
private C1PrintDocument CreateReport()
{
C1Report rep = C1ReportViewer.CreateC1Report();
rep.Load("ReportTemplate", "ReportName");
rep.Render();
return rep.C1Document;
}
回避方法
ガベージコレクトにてレポートが開放されないようにコードを組む必要があります。
下記コードはグローバル変数にレポートを格納することでガベージコレクトにて開放されないようにした場合の一例です。
◎サンプルコード (VB)
◎サンプルコード (C#)
下記コードはグローバル変数にレポートを格納することでガベージコレクトにて開放されないようにした場合の一例です。
◎サンプルコード (VB)
Private Const DocName As String = "ReportTasks"
Private ReadOnly _reportName As String = DocName + DateTime.Now.Ticks
Private ReadOnly _dic As IDictionary(Of String, C1Report) = New Dictionary(Of String, C1Report)()
Protected Sub Page_Load(sender As Object, e As EventArgs)
…
' 以前のドキュメントをアンレジストする
C1ReportViewer.UnRegisterDocument(DocName)
If _dic.ContainsKey(_reportName) Then
_dic.Remove(_reportName)
End If
' リスト出力
C1ReportViewer.RegisterDocument(DocName, AddressOf CreateReport)
C1ReportViewer1.FileName = DocName
C1ReportViewer1.ReportName = _reportName
End Sub
Private Function CreateReport() As C1PrintDocument
Dim rep = C1ReportViewer.CreateC1Report()
rep.Load("FileName", "ReportName")
rep.Render()
' GC.Collect による開放防止のため、グローバル変数に格納
_dic(_reportName) = rep
Return rep.C1Document
End Function
Private ReadOnly _reportName As String = DocName + DateTime.Now.Ticks
Private ReadOnly _dic As IDictionary(Of String, C1Report) = New Dictionary(Of String, C1Report)()
Protected Sub Page_Load(sender As Object, e As EventArgs)
…
' 以前のドキュメントをアンレジストする
C1ReportViewer.UnRegisterDocument(DocName)
If _dic.ContainsKey(_reportName) Then
_dic.Remove(_reportName)
End If
' リスト出力
C1ReportViewer.RegisterDocument(DocName, AddressOf CreateReport)
C1ReportViewer1.FileName = DocName
C1ReportViewer1.ReportName = _reportName
End Sub
Private Function CreateReport() As C1PrintDocument
Dim rep = C1ReportViewer.CreateC1Report()
rep.Load("FileName", "ReportName")
rep.Render()
' GC.Collect による開放防止のため、グローバル変数に格納
_dic(_reportName) = rep
Return rep.C1Document
End Function
◎サンプルコード (C#)
private const string DocName = "ReportTasks";
private readonly string _reportName = DocName + DateTime.Now.Ticks;
private readonly IDictionary _dic = new Dictionary();
protected void Page_Load(object sender, EventArgs e)
{
…
// 以前のドキュメントをアンレジストする
C1ReportViewer.UnRegisterDocument(DocName);
if (_dic.ContainsKey(_reportName)) _dic.Remove(_reportName);
// リスト出力
C1ReportViewer.RegisterDocument(DocName, CreateReport);
C1ReportViewer1.FileName = DocName;
C1ReportViewer1.ReportName = _reportName;
}
private C1PrintDocument CreateReport()
{
var rep = C1ReportViewer.CreateC1Report();
rep.Load("FileName", "ReportName");
rep.Render();
// GC.Collect による開放防止のため、グローバル変数に格納
_dic[_reportName] = rep;
return rep.C1Document;
}
private readonly string _reportName = DocName + DateTime.Now.Ticks;
private readonly IDictionary
protected void Page_Load(object sender, EventArgs e)
{
…
// 以前のドキュメントをアンレジストする
C1ReportViewer.UnRegisterDocument(DocName);
if (_dic.ContainsKey(_reportName)) _dic.Remove(_reportName);
// リスト出力
C1ReportViewer.RegisterDocument(DocName, CreateReport);
C1ReportViewer1.FileName = DocName;
C1ReportViewer1.ReportName = _reportName;
}
private C1PrintDocument CreateReport()
{
var rep = C1ReportViewer.CreateC1Report();
rep.Load("FileName", "ReportName");
rep.Render();
// GC.Collect による開放防止のため、グローバル変数に格納
_dic[_reportName] = rep;
return rep.C1Document;
}
旧文書番号
81091