我正在使用 MVC4 和 Entity Framework 来开发 Intranet Web 应用程序,我必须创建用户可以下载的报告。事实上,我有 2 个报告模板(.rdlc 文件)。其中之一是通用模板,将为下一个模板复制和修改。这就是我对“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 是否已填充,但未填充。会不会是问题?