2013-04-05 6 views
1

Я использую MVC4 и Entity Framework для разработки веб-приложения для интрасети, и одним из требований является то, что приложение сможет создавать отчеты. Поэтому я использую 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

+0

Фактически, когда я запускаю приложение и нажимаю ссылку, связанную с моим действием, она возвращает ошибку, которая говорит мне, что нет источника для заполнения моей таблицы. – Traffy

ответ

3

Вам необходимо запустить процедуру и передать результат ReportViewer.
Но как вы,, не можете ответить в данный момент. Вы используете простой старый ADO.NET для подключения к вашей базе данных, или Entity Framework, или NHibernate и т. Д.

Ваша хранимая процедура вернет коллекцию результатов, поэтому я бы присвоил ее переменной и передал ее в ReportViewer. Или используйте метод GetAllPersons, который возвращает Array или IList<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

Да, извините, я забыл сказать, что я использую Entity Framework. – Traffy

+2

обычно у вас есть доступный dbContext, который вы использовали бы для вызова вашей процедуры. Вот что: http://msdn.microsoft.com/en-us/data/gg699321.aspx, которые могут помочь –

+1

Также это: http://stackoverflow.com/a/10254855/96505 –

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

+0

Исправлено.Он должен быть строкой - просто строка подключения к вашей базе данных. –

+0

Кажется, что следующий вопрос описывает аналогичную проблему: http://stackoverflow.com/questions/8802707/setting-the-datasource-for-a-local-report-net-report-viewer –

Смежные вопросы