2013-04-08 88 views
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是否被填充,而不是。这可能是问题吗?

+0

你的意思是你的数据集是什么问题?同样为了代码整洁的原因,看看FileResult而不是搞乱响应头。 – yasth 2013-04-08 13:21:56

+0

感谢您的建议。事实上,我并不正确,DataSet不是问题所在。当我打电话给.Render()的时候,一切都出错了。 – Traffy 2013-04-08 13:32:57

+0

您应该尝试使用其他版本或[Render](http://msdn.microsoft.com/zh-cn/library/ms251837(v = vs.100).aspx),并使用更多参数来获取更多关于错误。 – tschmit007 2013-04-08 14:04:19

回答

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);