イントラネット Web アプリを開発するために MVC4 と Entity Framework を使用しており、ユーザーがダウンロードできるレポートを作成する必要があります。実際、2 つのレポート テンプレート (.rdlc ファイル) があります。それらの 1 つは、次のテンプレート用にコピーおよび変更される汎用テンプレートです。それが、「PersonReport」テンプレートで行ったことです。ジェネリックからコピーして変更しました。
私の問題は、一般的なテンプレート (および以下のコード) ではすべて問題ないことです。ただし、個人用のテンプレートを使用している場合、機能しません。私は自分のコードをデバッグしようとしましたが、どこに問題があるかを見つけました (.Render() を使用してフォーマットを指定している場合)。私のエラーメッセージがあります:
An error occurred during local report processing.
これが私の行動です:
public ActionResult PersonReport()
{
ReportViewer personReportViewer = new ReportViewer();
//Parameters
ReportParameter[] reportParameters = new ReportParameter[3];
reportParameters[0] = new ReportParameter("Title", "Test", true);
reportParameters[1] = new ReportParameter("Address", "Avenue de Tervuren, 268", true);
reportParameters[2] = new ReportParameter("PostalCode", "B-1150 Brussels", true);
//Report Template
personReportViewer.ProcessingMode = ProcessingMode.Local;
personReportViewer.LocalReport.ReportPath = HttpContext.Server.MapPath("..") + "\\Reporting\\Templates\\" + "AllPersonsReport.rdlc";
//Source
DataSet ds = BuSIMaterial.Utils.Services.ExecuteStoredProcedure(db, "GetAllPersons", null);
ReportDataSource dataSource = new ReportDataSource("personDataSource", ds.Tables[0]);
personReportViewer.LocalReport.DataSources.Clear();
personReportViewer.LocalReport.DataSources.Add(dataSource);
//Report type
personReportViewer.LocalReport.SetParameters(reportParameters);
byte[] byteArray = personReportViewer.LocalReport.Render("PDF"); //Here's the failure
//Downloading
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment; Filename=\"" + DateTime.Now + "_Title_.pdf" + "\"");
Response.AddHeader("Content-Transfer-Encoding", "Binary");
Response.BinaryWrite((byte[])byteArray);
Response.Flush();
Response.End();
return RedirectToAction("Index");
}
そして、単純な select * ストアド プロシージャから DataSet を作成する私の方法:
public static DataSet ExecuteStoredProcedure(ObjectContext db,
string storedProcedureName,
IEnumerable<SqlParameter> parameters)
{
var connectionString =
((EntityConnection)db.Connection).StoreConnection.ConnectionString;
var ds = new DataSet();
using (var conn = new SqlConnection(connectionString))
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = storedProcedureName;
cmd.CommandType = CommandType.StoredProcedure;
if (parameters != null)
{
foreach (var parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
}
using (var adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(ds);
}
}
}
return ds;
}
更新: DataSet がいっぱいになっているかどうかを確認したかったのですが、そうではありません。それが問題でしょうか?