web-dev-qa-db-ja.com

ローカルレポートのデータソースの設定-.NETおよびレポートビューアー

カスタムコントロール(レポートビューアー付きのWindowsフォーム)を作成しました。ローカルレポートを読み込む次のコードがあります。

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フォームが表示されますbut次のメッセージが表示されます。

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

データソースの設定方法がよくわかりません。必要なデータはリモートデータベースに保存されています...この接続をセットアップするにはどうすればよいですか?

10
user559142

ReportDataSource を作成し、そのValueプロパティを設定する必要があります。 DataTableおよびIEnumerablesは サポートされているソース

例として、レポートが必要とする列に一致する単一のDataTableを使用して DataSet を返すメソッドが存在すると仮定します。

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

リソース文字列には、リソース(アセンブリを含む)の完全修飾名を含める必要があることに注意してください。

17
StuartLC

私のキーは上記のようにStuartLCによって答えられました...彼がそれを「RDLCのDataSourceと一致しなければならない」と言ったときにそれをさらに明確にしました。それは実際には「DataSetName」要素値re:_<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();
        }
_
8
Anthony Griggs

データセットの代わりにデータテーブルを使用できる場合があります。これを変える:

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;
0
Shane.A