web-dev-qa-db-fra.com

Définition de la source de données pour un rapport local - .NET & Report Viewer

J'ai créé un contrôle personnalisé (un formulaire Windows avec un visualiseur de rapports). J'ai le code suivant pour charger un rapport local:

contenu dans la classe CustomReportViewer

//Load local report 
this.reportViewer1.ProcessingMode = ProcessingMode.Local;         
//enable loading of external images          
this.reportViewer1.LocalReport.EnableExternalImages = true;
//pass the report to the viewer
using (FileStream stream = new FileStream(filename, FileMode.Open))
{
   this.reportViewer1.LocalReport.LoadReportDefinition(stream);
}

J'appelle cela en utilisant:

CustomReportViewer reportViewer = new CustomReportViewer();

Cela fonctionne très bien et un formulaire Windows apparaît contenant le contrôle de la visionneuse de rapports mais Je reçois le message suivant:

A data source instance has not been supplied for the data source "ReportData"

Je ne sais pas exactement comment configurer la source de données? Les données dont j'ai besoin sont stockées dans une base de données distante ... que dois-je faire pour établir cette connexion?

10
user559142

Vous devez créer un ReportDataSource , et définir sa propriété Value - par exemple DataTable et IEnumerables sont sources prises en charge

Par exemple, et en supposant qu'une méthode existe pour renvoyer un DataSet , avec un seul DataTable correspondant aux colonnes nécessaires à votre rapport:

DataSet ds = SomeMethodToRetrieveDataSet(); // e.g. via DataAdapter
// If your report needs parameters, they need to be set ...
ReportParameter[] parameters = new ReportParameter[...];

ReportDataSource reportDataSource = new ReportDataSource();
// Must match the DataSource in the RDLC
reportDataSource.Name = "ReportData"; 
reportDataSource.Value = ds.Tables[0];

// Add any parameters to the collection
reportViewer1.LocalReport.SetParameters(parameters); 
reportViewer1.LocalReport.DataSources.Add(reportDataSource);
reportViewer1.DataBind();

Notez qu'il est souvent plus facile d'incorporer simplement le RDLC dans votre assembly, plutôt que d'avoir à conserver des fichiers RDLC séparés. Pour ce faire, sélectionnez le Build Action sur le RDLC en tant que Embedded Resource, puis vous pouvez définir la propriété ReportEmbeddedResource:

reportViewer1.LocalReport.ReportEmbeddedResource = 
                         "MyOrganisation.MyAssembly.NameSpace.MyReportName.rdlc";

Notez que la chaîne de ressource doit inclure le nom complet de la ressource (y compris l'assembly).

17
StuartLC

La clé pour moi était la réponse de StuartLC comme ci-dessus ... avec une clarification supplémentaire en ce qu'il a dit qu'il "devait correspondre à la DataSource dans le RDLC" .. il s'est avéré en fait être la valeur de l'élément "DataSetName" re: <DataSetName>DataSet1</DataSetName>

J'ai tourné en rond parce qu'il s'appelle "DataSource", j'ai donc continué à utiliser le nom de l'élément DataSource mais apparemment dans le fichier rdl et rdlc cela signifie vraiment le DataSetName. Donc, en gardant cela à l'esprit, voici le code emprunté à Stuart ci-dessus avec le mien. Notez la valeur de l'élément DataSetName:

        using (SqlConnection sqlConn = new SqlConnection(rvConnection))
        using (SqlDataAdapter da = new SqlDataAdapter(rvSQL, rvConnection))
        {
            DataSet ds = new DataSet();
            da.Fill(ds);
            DataTable dt = ds.Tables[0];

            this.reportViewer1.Reset();
            this.reportViewer1.ProcessingMode = ProcessingMode.Local; 
            this.reportViewer1.LocalReport.ReportPath = AppDomain.CurrentDomain.BaseDirectory + "ssrsExport.rdlc";
            ReportDataSource reportDataSource = new ReportDataSource();
            // Must match the DataSet in the RDLC
            reportDataSource.Name = "DataSet1"; 
            reportDataSource.Value = ds.Tables[0];
            this.reportViewer1.LocalReport.DataSources.Add(reportDataSource);   
            this.reportViewer1.RefreshReport();
        }
8
Anthony Griggs

vous pourrez peut-être simplement utiliser une table de données au lieu d'un ensemble de données. change ça:

DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];

pour ça:

DataTable dt = new DataTable();
da.Fill(dt);

et ça:

reportDataSource.Value = ds.Tables[0];

pour ça

reportDataSource.Value = dt;
0
Shane.A