2013-04-05 58 views
1

我正在使用MVC4和Entity Framework來開發Intranet Web應用程序,其中一個要求是應用程序將能夠創建報告。所以我使用Reporting Service來做到這一點。MVC 4 - 報告服務和存儲過程

在我的報告文件(.rdlc)中,我有一個表應該包含我在表格「人員」中的所有記錄。我創建了一個存儲過程,可以從我的數據庫獲取所有人員,並執行一項操作以允許下載報告。

事情是,我不知道如何告訴我的行動,我的數據源是我的存儲過程。

這裏是我的操作:

public ActionResult PersonReport() 
{ 

    ReportViewer personReportViewer = new ReportViewer(); 

    List<ReportParameter> reportParameters = new List<ReportParameter>(); 

    reportParameters.Add(new ReportParameter("Title", "Test")); 

    personReportViewer.LocalReport.SetParameters(reportParameters); 

    personReportViewer.ProcessingMode = ProcessingMode.Local; 
    personReportViewer.LocalReport.ReportEmbeddedResource = 
     HttpContext.Server.MapPath(".") + "\\Reporting\\Templates\\" 
     + "PersonReport.rdlc"; 

    byte[] byteArray = personReportViewer.LocalReport.Render("PDF"); 

    Response.ClearHeaders(); 
    Response.AddHeader("Content-Disposition", 
     "attachment; Filename=\"" + DateTime.Now + "_Title_" + "\""); 
    Response.AddHeader("Content-Transfer-Encoding", "Binary"); 
    Response.BinaryWrite(byteArray); 
    Response.Flush(); 
    Response.End(); 

    return RedirectToAction("Index"); 
} 

,這裏是我的存儲過程:

ALTER PROCEDURE dbo.GetAllPersons 

AS 

BEGIN 

    SET NOCOUNT ON 

    SELECT * FROM bm_Persons; 

END 

有關如何做到這一點任何想法?非常感謝。

+1

你能否解釋一下「告訴我的行動,我的數據源是我的存儲過程」,因爲這是沒有意義的我嗎? – Liam 2013-04-05 13:22:42

+0

事實上,當我啓動應用程序並單擊與我的操作相關的鏈接時,它會返回一個錯誤,告訴我沒有來源填充我的表格。 – Traffy 2013-04-05 13:24:47

回答

3

您需要運行該過程並將結果傳遞給ReportViewer。
但如何這樣做,目前是不可能回答的。您是否使用普通的舊ADO.NET連接到您的數據庫,或實體框架,或NHibernate等...

您的存儲過程將返回結果的集合,所以我將它分配給一個變量,並將其傳遞到ReportViewer。或者有一個方法GetAllPersons,它會返回ArrayIList<T>或其他合適的類型,然後您可以使用該方法以外的方法。

假設你使用EF那麼爲了得到一組從您的存儲過程的結果,你會需要一個類似的方法,我已經從the answer I referred to in my comment採取:

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; 
      foreach (var parameter in parameters) 
      { 
       cmd.Parameters.Add(parameter); 
      } 

      using (var adapter = new SqlDataAdapter(cmd)) 
      { 
       adapter.Fill(ds); 
      } 
     } 
    } 

    return ds; 
} 
+0

對不起,我忘記告訴我正在使用實體框架。 – Traffy 2013-04-05 13:27:58

+2

通常你可以使用dbContext來調用你的過程。有這樣的:http://msdn.microsoft.com/en-us/data/gg699321.aspx可能會幫助 – 2013-04-05 13:32:25

+1

此外:http://stackoverflow.com/a/10254855/96505 – 2013-04-05 13:34:35

3

我想你需要設置ReportViewer1.LocalReport.DataSources

SqlCommand cmd = new SqlCommand(); 

cmd.Parameters.Add(new SqlParameter("@StartDate", startDate)); 
cmd.Parameters.Add(new SqlParameter("@EndDate", endDate)); 

var thisConnectionString = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString; 

SqlConnection thisConnection = new SqlConnection(thisConnectionString); 

cmd.Connection = thisConnection; 

cmd.CommandText = string.Format("[dbo].[StoredProcedureName]"); 
cmd.CommandType = CommandType.StoredProcedure; 
SqlDataAdapter da = new SqlDataAdapter(cmd); 

System.Data.DataSet thisDataSet = new System.Data.DataSet(); 

da.Fill(thisDataSet); 


//////////// 
/// HERE /// 
//////////// 
ReportDataSource datasource = new ReportDataSource(rptName, thisDataSet.Tables[0]); 

ReportViewer1.LocalReport.DataSources.Clear(); 
ReportViewer1.LocalReport.DataSources.Add(datasource); 

.................... 

ReportViewer1.LocalReport.Refresh(); 
+0

感謝您的回答。任何方式,當我試圖像'thisConnectionString'那樣做時,對我有一個問題,有一個錯誤,VS建議我生成屬性存根。 – Traffy 2013-04-05 13:34:39

+0

固定。它應該是字符串 - 只是連接字符串到您的數據庫。 – 2013-04-05 13:35:46

+0

似乎下面的問題描述了類似的問題:http://stackoverflow.com/questions/8802707/setting-the-datasource-for-a-local-report-net-report-viewer – 2013-04-05 13:36:56