.rdlc报告 - 无法为数据集'DataSet1'创建数据读取器

时间:2013-03-12 15:46:58

标签: c# .net reporting-services visual-studio-2012 report

我使用报告向导在VS 2012下创建了一个.rdlc-Report,并添加了数据源和数据集。 当我尝试使用下面的代码呈现报告时,我收到以下错误消息:

  

“无法为数据集'DataSet1'创建数据读取器。”

bytes = localReport.Render("PDF", sdeviceinfo, out smimetype, out sencoding, out sfilenameextension, out streamids, out myWarnings);

提前感谢任何建议!

12 个答案:

答案 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)

1)确保您在管理员模式下运行,并且您可以访问SSRS服务器。

2)验证您是否设置了正确的数据集名称,或者是否正确加载和分配它。

请在MSDN上查看this示例。

祝你好运!

答案 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报告确实需要数据集,它应该在其中有一些记录或空对象(空对象将具有元数据)

因此,最佳做法始终是返回包含空对象(不是Nullnothing)或其中包含一些记录的数据集。

答案 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)

enter image description here

enter image description here

您必须提供“ DataSet1”,否则它将不起作用。

答案 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 版本后,我可以清楚地看到旧的数据集名称仍在使用。由于旧数据集不再存在,因此抛出此错误。一旦我翻转字段以使用新的数据集名称,它就可以正常工作。