2

Я использую 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, а это не так. Это может быть проблема?

+0

Что вы имеете в виду ваш набор данных является проблемой? Кроме того, для соображений аккуратности кода смотрите FileResult вместо того, чтобы возиться с заголовками ответов. – yasth

+0

Спасибо за совет. На самом деле я был не прав, DataSet не проблема. Это пока я называю .Render(), что все идет не так. – Traffy

+0

вам следует попробовать использовать другую версию или [Render] (http://msdn.microsoft.com/en-us/library/ms251837 (v = vs.100) .aspx), с большим количеством параметров, чтобы получить больше информации о ошибка. – tschmit007

ответ

0

Я думаю, вы должны попробовать добавить больше параметров рендеринге перегрузки():

private Warning[] warnings; 
    private string[] streams; 
    private string mimeType; 
    private string encoding; 
    private string extension; 

    byte[] byteArray = personReportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streams, out warnings);