Я использую MVC4 и Entity Framework для разработки веб-приложения для интрасети, и мне приходится создавать отчеты, которые могут быть загружены пользователями. На самом деле, у меня есть 2 шаблона отчетов (файлы .rdlc). Одним из них является общий шаблон, который будет скопирован и изменен для следующих шаблонов. Это то, что я сделал с моим шаблоном «PersonReport»: скопирован и изменен из общего.MVC 4 Reporting with Entity Framework
Моя проблема заключается в том, что с помощью шаблона 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");
}
И мой метод, чтобы создать 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
Спасибо за совет. На самом деле я был не прав, DataSet не проблема. Это пока я называю .Render(), что все идет не так. – Traffy
вам следует попробовать использовать другую версию или [Render] (http://msdn.microsoft.com/en-us/library/ms251837 (v = vs.100) .aspx), с большим количеством параметров, чтобы получить больше информации о ошибка. – tschmit007