レポートウィザードを使用してVS 2012で.rdlc-Reportを作成し、データソースとデータセットを追加しました。以下のコードを使用してレポートを表示しようとすると、次のエラーメッセージが表示されます。
「データセット 'DataSet1'のデータリーダーを作成できません。」
bytes = localReport.Render("PDF", sdeviceinfo, out smimetype, out sencoding, out sfilenameextension, out streamids, out myWarnings);
提案を事前にありがとう!
1)管理者モードで実行しており、SSRSサーバーにアクセスできることを確認してください。
2)正しいデータセット名を設定したか、それを正しくロードして割り当てているかを確認します。
MSDNの this サンプルを確認してください。
幸運を!
私は問題を解決しました-コーディングエラー-次のようにSqlServerDataSourceのaspxコードから「適切な」パラメーター値を省略しました...
Parameter-name = "p_CSV_VEHICLES"にはDefaultValueがないことに注意してください。
AND(判明しました)2つのパラメーター(= "p_CSV_VGROUPS"および= "p_CSV_VEHICLES")は、空の文字列 ""をデフォルト値として渡すことができませんでした-空の文字列は、これら2つのパラメーターの選択コンテキストでは無効です。
DefaultValueを追加し、DefaultValue(s)を各パラメータの有効な文字列値に設定した後、レポートはWebページのReportViewerコントロールに完全に表示されました。
これが元の(動作しない)aspx-codeです。
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:FCI_WebMainConnectionString %>"
SelectCommand="uspRPT_CostDetailFleet" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter DefaultValue="5" Name="p_UID_DIVISION" Type="Int32" />
<asp:Parameter DefaultValue="85" Name="p_UID_CUSTOMER" Type="Int32" />
<asp:Parameter DefaultValue="FCIFLEETGRP" Name="p_SORT_ORDER" Type="String" />
<asp:Parameter DefaultValue="" Name="p_CSV_VGROUPS" Type="String" />
<asp:Parameter Name="p_CSV_VEHICLES" Type="String" />
<asp:Parameter DbType="Date" DefaultValue="#01/01/2013#" Name="p_dtStart0" />
<asp:Parameter DbType="Date" DefaultValue="#12/31/2013#" Name="p_dtEnd0" />
</SelectParameters>
</asp:SqlDataSource>
エラーを表示すると、dataset1のデータセットのデータリーダーを作成できません:
private void frm_report_Load(object sender, EventArgs e)
{
this.reportViewer1.RefreshReport();
reportViewer1.LocalReport.Refresh();
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.ReportEmbeddedResource = "cruds_reports.Report1.rdlc";
SqlCommand cmd = new SqlCommand("select * from tbl_info",con);
SqlDataAdapter da = new SqlDataAdapter();
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = new DataTable();
dt = ds.Tables[0];
if (dt.Rows.Count>0)
{
rds = new ReportDataSource("DataSet1", dt);
reportViewer1.LocalReport.DataSources.Add(rds);
rds.Value = dt;
reportViewer1.LocalReport.Refresh();
reportViewer1.RefreshReport();
}
else
{
return;
}
}
次の2つが問題ないことを確認してください。
1)Report1.rdlc [Design]で(Alt + Ctrl + Dを押す):
データセットを右クリックしてデータセットを追加し、
データセットプロパティフォームで、名前:DataSet1を選択します。
dataSource combocoxの横にあるNew ...ボタンをクリックします。
オブジェクトをクリックします
プロジェクトで。 yourList1または...
そして仕上げ。
次に、コンボボックスでデータソースと使用可能なデータセットを選択します。
これらの手順を繰り返し、DataSet2を作成します...
[OK]をクリックしてフォームを閉じます。
2)yourFormPrintコード:
private void frmPrint_Load(object sender, EventArgs e)
{
CreateReport1();
System.Drawing.Printing.PageSettings ps = new
System.Drawing.Printing.PageSettings();
ps.Margins.Top = CentimeterToPixel(0.9);
ps.Margins.Left = CentimeterToPixel(0.9);
ps.Margins.Right = CentimeterToPixel(0.9);
ps.Margins.Bottom = CentimeterToPixel(0.9);
ps.Landscape = false;
ps.PaperSize =new PaperSize ("A4", 827, 1169);
ps.PaperSize.RawKind = (Int32)(System.Drawing.Printing.PaperKind.A4);
//psize.RawKind = (int)PaperKind.A4;
//ps.PaperSize = psize;
reportViewer1.SetPageSettings(ps);
this.reportViewer1.RefreshReport();
this.reportViewer1.SetDisplayMode(DisplayMode.PrintLayout);
WindowState = FormWindowState.Maximized;
}
private int CentimeterToPixel(double Centimeter)
{
int pixel = -1;
using (Graphics g = this.CreateGraphics())
{
pixel =Convert.ToInt32 ( Centimeter * (g.DpiY / 2.54));
}
return pixel;
}
private void CreateReport1()
{
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.ProcessingMode =
Microsoft.Reporting.WinForms.ProcessingMode.Local;
reportViewer1.LocalReport.ReportEmbeddedResource =
"yourProjectName.Report1.rdlc";
ReportDataSource RDS = new ReportDataSource();
RDS.Name = "DataSet1";
RDS.Value = yourPublicList1;
reportViewer1.LocalReport.DataSources.Add(RDS);
ReportDataSource RDS2 = new ReportDataSource();
RDS2.Name = "DataSet2";
RDS2.Value = yourPublicList2;
reportViewer1.LocalReport.DataSources.Add(RDS2);
}
私も同じ問題を抱えていました。私が観察したところ、RDLCレポートにはデータセットが必要です。これには、レコードが含まれている必要があります。または、空のオブジェクト(空のオブジェクトにはメタデータが含まれます)
したがって、ベストプラクティスは常に、空のオブジェクト(Null
またはnothing
ではない)またはいくつかのレコードを含むデータセットを返すことです。
reportviewer1.LocalReport.DataSources.Add(New ReportDataSource("DataSet1", ObjectDataSource1))
データソースをレポートに設定する方法をコードに投稿することをお勧めします。