Настройка источника данных для локального отчета - .NET & Report Viewer - PullRequest
10 голосов
/ 10 января 2012

Я создал пользовательский элемент управления (форму окна с программой просмотра отчетов).У меня есть следующий код для загрузки локального отчета:

Содержится в классе 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);
}

Я вызываю это используя:

CustomReportViewer reportViewer = new CustomReportViewer();

Это работает нормально, и появляется форма Windows, содержащая элемент управления средства просмотра отчетов , но Я получаю следующее сообщение:

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

Я не совсем уверен, как настроить источник данных?Данные, которые мне нужны, хранятся в удаленной базе данных ... что мне нужно сделать, чтобы установить это соединение?

Ответы [ 3 ]

17 голосов
/ 10 января 2012

Вам необходимо создать ReportDataSource и установить его свойство Value - например, DataTable и IEnumerable s являются поддерживаемыми источниками

Какпример, и предполагается, что существует метод для возврата DataSet , с одним DataTable, соответствующим столбцам, необходимым для вашего отчета:

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();

Обратите внимание, что часто проще простовстроить RDLC в вашу сборку, вместо того, чтобы сохранять отдельные файлы RDLC.Сделайте это, выбрав Build Action в RDLC как Embedded Resource, а затем вы можете установить свойство ReportEmbeddedResource:

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

Обратите внимание, что строка ресурса должна включать полное имя ресурса(включая сборку).

8 голосов
/ 27 апреля 2014

Ключ для меня был таким же, как отвечал StuartLC, как указано выше ... с дополнительным пояснением в том, что когда он сказал, что он "должен соответствовать источнику данных в RDLC" ... это фактически оказалось значением элемента "DataSetName": <DataSetName>DataSet1</DataSetName>

Я обошел все вокруг, потому что он называется «DataSource», поэтому я продолжал использовать имя элемента DataSource, но, очевидно, в файлах rdl и rdlc это действительно означает DataSetName.Таким образом, помня об этом, код, заимствованный у Стюарта выше, у меня.Обратите внимание на значение элемента 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();
        }
0 голосов
/ 08 марта 2019

вы можете просто использовать набор данных вместо набора данных.измените это:

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

на это:

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

и это:

reportDataSource.Value = ds.Tables[0];

на это

reportDataSource.Value = dt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...