2
我使用MVC4和實體框架來開發Intranet Web應用程序,並且我必須創建可由用戶下載的報告。事實上,我有2個報告模板(.rdlc文件)。其中一個是通用模板,將被複制和修改爲下一個模板。這就是我對我的「PersonReport」模板所做的:從泛型中複製和修改。MVC 4使用實體框架報告
我的問題是,與genereic模板(和下面的代碼),一切都很好。但是,當我使用我的個性化模板時,它不起作用。我試圖調試我的代碼,我發現問題在哪裏(當我使用.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;
}
UPDATE :我想檢查我的DataSet是否被填充,而不是。這可能是問題嗎?
你的意思是你的數據集是什麼問題?同樣爲了代碼整潔的原因,看看FileResult而不是搞亂響應頭。 – yasth 2013-04-08 13:21:56
感謝您的建議。事實上,我並不正確,DataSet不是問題所在。當我打電話給.Render()的時候,一切都出錯了。 – Traffy 2013-04-08 13:32:57
您應該嘗試使用其他版本或[Render](http://msdn.microsoft.com/zh-cn/library/ms251837(v = vs.100).aspx),並使用更多參數來獲取更多關於錯誤。 – tschmit007 2013-04-08 14:04:19