2013-04-05 1 views
1

J'utilise MVC4 et Entity Framework pour développer une application Web intranet. L'une des conditions est que l'application puisse créer des rapports. Donc j'utilise Reporting Service pour le faire.MVC 4 - Service de rapports et procédures stockées

Dans mon fichier de rapport (.rdlc), j'ai une table qui est censée contenir tous les enregistrements que j'ai dans ma table "Personnes". J'ai créé une procédure stockée qui obtient toutes les personnes de ma base de données et une action pour permettre le téléchargement du rapport. Ce qui est, je n'ai aucune idée sur la façon de dire à mon action que ma source de données est ma procédure stockée.

Voici mon action:

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

Et voici ma procédure stockée:

ALTER PROCEDURE dbo.GetAllPersons 

AS 

BEGIN 

    SET NOCOUNT ON 

    SELECT * FROM bm_Persons; 

END 

Toute idée sur la façon de le faire? Merci beaucoup.

+1

Pouvez-vous expliquer «indiquer à mon action que ma source de données est ma procédure stockée» parce que cela n'a aucun sens pour moi? – Liam

+0

En fait, lorsque je lance l'application et que je clique sur le lien qui est lié à mon action, elle renvoie une erreur qui me dit qu'il n'y a pas de source pour remplir ma table. – Traffy

Répondre

3

Vous devez exécuter la procédure et transmettre le résultat à ReportViewer.
Mais comment vous faire qu'il n'est pas possible de répondre pour le moment. Utilisez-vous ADO.NET pour vous connecter à votre base de données, ou Entity Framework, ou NHibernate etc ...

Votre procédure stockée renverra une collection de résultats, donc je l'attribuerais à une variable et la transmettrais à le ReportViewer. Ou avoir une méthode GetAllPersons qui renvoie un Array ou IList<T> ou un autre type approprié et vous pouvez l'utiliser en dehors de la portée de votre méthode.

Étant donné que vous utilisez EF alors afin d'obtenir un ensemble de résultats de votre procédure stockée que vous auriez besoin d'une méthode similaire à ce que j'ai pris 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

Oui désolé, j'ai oublié de dire que j'utilise Entity Framework. – Traffy

+2

habituellement vous avez un dbContext disponible que vous utiliseriez pour invoquer votre procédure. Il y a ceci: http://msdn.microsoft.com/en-us/data/gg699321.aspx qui pourrait aider –

+1

Aussi ceci: http://stackoverflow.com/a/10254855/96505 –

3

Je pense que vous avez besoin Pour configurer 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

Merci pour votre réponse. De toute façon, il y a un problème pour moi quand j'essaye de faire comme vous pour le 'thisConnectionString, il y a une erreur et VS me propose de générer le talon de la propriété. – Traffy

+0

Fixé.Cela devrait être une chaîne - juste une chaîne de connexion à votre base de données. –

+0

Il semble que la question suivante décrit un problème similaire: http://stackoverflow.com/questions/8802707/setting-the-datasource-for-a-local-report-net-report-viewer –