我使用报告向导在VS 2012下创建了一个.rdlc-Report,并添加了数据源和数据集。 当我尝试使用下面的代码呈现报告时,我收到以下错误消息:
“无法为数据集'DataSet1'创建数据读取器。”
bytes = localReport.Render("PDF", sdeviceinfo, out smimetype, out sencoding, out sfilenameextension, out streamids, out myWarnings);
提前感谢任何建议!
答案 0 :(得分:61)
我遇到的问题是“无法为数据集'zzz创建数据阅读器'”
答案是ReportDataSource(字符串xxx,DataTable yyy)
您应该使用正确的名称。 xxx应该是zzz
答案 1 :(得分:12)
我的'问题'是DataSet与Dataset不同的发现。
(是的,我知道我实际上是在公共论坛上承认这一点,因为我希望其他任何人都可以避免这种愚蠢的错误)
答案 2 :(得分:3)
您无法创建ReportViewer并提供真正的数据集。由于参数提供技术,您可能会收到错误。 你可以尝试这样。我用这种方式解决了。
protected void btnPdf_Click(object sender, EventArgs e)
{
ReportViewer viwer = new ReportViewer();
ObjectDataSource ob = new ObjectDataSource("dataset.YourTableAdapter", "GetData");
dataset.YourTableAdapter ds = new dataset.YourTableAdapter();
string PDF = "PDF";
string ReportType = "ReportType";
Warning[] warnings = null;
string[] streamIds = null;
string mimeType = string.Empty;
string encoding = string.Empty;
string extension = string.Empty;
string filetype = string.Empty;
viwer.SizeToReportContent = true;
viwer.LocalReport.ReportPath = "reports/report/report.rdlc";
viwer.ProcessingMode = ProcessingMode.Local;
ob.SelectParameters.Clear();
ob.SelectParameters.Add(QueryStringEnum.CompanyID, CurrentCompanyID.ToString());
ReportDataSource rds = new ReportDataSource("datasetname", (object) ds.GetData((long?)CurrentCompanyID.ToInt64());
viwer.LocalReport.DataSources.Add(rds);
viwer.LocalReport.Refresh();
byte[] bytes = viwer.LocalReport.Render("PDF", null,
out mimeType, out encoding, out extension, out streamIds, out warnings);
}
答案 3 :(得分:1)
答案 4 :(得分:1)
我解决了这个问题 - 我的编码错误 - 我从SqlServerDataSource的aspx代码中省略了'正确的'参数值,如下所示......
注意参数名称=“p_CSV_VEHICLES”没有DefaultValue
AND(事实证明)两个参数(=“p_CSV_VGROUPS”和=“p_CSV_VEHICLES”)无法传递空字符串“”作为默认值 - 空字符串在这些选择上下文中无效两个参数。
在我添加DefaultValue并将DefaultValue(s)设置为每个参数的有效字符串值之后,报告在我的网页上的ReportViewer控件中完美显示。
这是原始(不工作)的aspx代码。
<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>
答案 5 :(得分:1)
请检查您的数据集名称是否正确。
lib.prodteaser = CONTENT
lib.prodteaser {
table = tt_content
select {
# Seiten-ID
pidInList = this
where = colPos=0
recursive = 1
orderBy = sorting
}
wrap = <section><div class="container"><div class="row prod-teaser">|</div></div></section>
renderObj = COA
renderObj { … }
}
答案 6 :(得分:0)
我也有同样的问题。根据我的观察,我发现,RDLC报告确实需要数据集,它应该在其中有一些记录或空对象(空对象将具有元数据)
因此,最佳做法始终是返回包含空对象(不是Null
或nothing
)或其中包含一些记录的数据集。
答案 7 :(得分:0)
reportviewer1.LocalReport.DataSources.Add(New ReportDataSource("DataSet1", ObjectDataSource1))
最好发布代码,将数据源设置为报告。
答案 8 :(得分:0)
显示错误无法为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;
}
}
答案 9 :(得分:0)
答案 10 :(得分:0)
请确保这两件事都可以:
1)在Report1.rdlc [设计]中(按Alt + Ctrl + D):
右键单击数据集并添加数据集,
在“数据集”属性表单中,选择名称:DataSet1
单击“数据源”组合框旁边的“新建...”按钮
点击对象
在您的项目中。选择yourList1或...
并完成。
现在选择组合框上的“数据源”和“可用数据集”。
重复这些步骤并创建DataSet2 ...
单击“确定”并关闭表单。
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);
}
答案 11 :(得分:0)
我无法分享源代码,但我想提交一个对我有帮助的答案。
我从现有代码库中复制了之前制作的报告。它已经在 Visual Studio 的“报告数据”视图中创建了数据集,因为我复制了一个现有的报告。 我需要这份现有报告的大部分内容;但是,我删除了其中一个数据集,并将其替换为我创建的一个新数据集,该新数据集包含新报告所需的新数据。
我在这里犯的一个大错误是,我以为我将新数据集重新命名为与旧数据集完全相同的名称。旧数据集被命名为“ReportDetail”。然而,我制作的新的名为“ReportDetails”,带有一个“s”。
我需要旧数据集中的一些数据字段;但是,我没有意识到那些旧字段仍在以旧数据集名称复制的报告中。所以在报告中有一个字段仍然被称为“ReportDetail.{fieldName}”。这就是最终的问题所在。
打开 .rdlc 报告的 XML 版本后,我可以清楚地看到旧的数据集名称仍在使用。由于旧数据集不再存在,因此抛出此错误。一旦我翻转字段以使用新的数据集名称,它就可以正常工作。