2013-04-08 120 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);