Establecer el origen de datos para un informe local – .NET y visor de informes

Creé un control personalizado (un formulario de Windows con un visor de informes). Tengo el siguiente código para cargar un informe local:

Contenido en la clase 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); } 

Yo llamo esto usando:

 CustomReportViewer reportViewer = new CustomReportViewer(); 

Esto funciona bien y aparece un formulario de Windows que contiene el control del visor de informes pero recibo el siguiente mensaje:

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

No estoy del todo seguro de cómo configurar la fuente de datos? Los datos que necesito se almacenan en una base de datos remota … ¿qué debo hacer para configurar esta conexión?

Necesita crear un ReportDataSource y establecer su propiedad Value ; por ejemplo, DataTable e IEnumerable s son fonts compatibles.

Como ejemplo, y suponiendo que existe un método para devolver un DataSet , con una sola DataTable coincida con las columnas que necesita su informe:

 DataSet ds = SomeMethodToRetrieveDataSet(); // eg 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(); 

Tenga en cuenta que a menudo es más fácil simplemente integrar el RDLC en su ensamblaje, en lugar de tener que guardar archivos RDLC separados. Haga esto seleccionando Build Action en el RDLC como Embedded Resource , y luego puede establecer la propiedad ReportEmbeddedResource :

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

Tenga en cuenta que la cadena de recursos debe incluir el nombre completo del recurso (incluida la Asamblea).

La clave para mí fue como StuartLC me contestó como arriba … con más aclaraciones en cuanto a que cuando dijo “debe coincidir con DataSource en el RDLC” … en realidad resultó ser el valor del elemento “DataSetName” re: DataSet1

Di vueltas y vueltas porque se llama “DataSource”, así que seguí usando el nombre del elemento DataSource, pero aparentemente en el archivo rdl y rdlc esto realmente significa DataSetName. Así que teniendo esto en cuenta aquí está el código como prestado de Stuart arriba con el mío. Tenga en cuenta el valor del elemento 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(); }