RDLC XML数据源给出错误:“无法为数据集<数据集名称>创建数据读取器”

时间:2018-09-11 23:40:16

标签: c# xml reporting-services rdlc

我正在尝试在C#中构建一种方法,以使SSRS Reportviewer生成PDF输出。

关于该主题的信息很多,所以这似乎很容易。

当我的数据源来自XML URL时,就会出现此问题。

这是我的方法:

private void GetPDF(Stream RDL)
{
    Warning[] warnings = null;
    string[] streamIds = null;
    string mimeType = string.Empty;
    string encoding = string.Empty;
    string extension = string.Empty;
    string filetype = string.Empty;

    ReportViewer RPT = new ReportViewer();
    RPT.ProcessingMode = ProcessingMode.Local;
    RPT.LocalReport.LoadReportDefinition(RDL);
    RPT.LocalReport.Refresh();

    byte[] Bytes = RPT.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);

    using (FileStream PDF = new FileStream("test.PDF", FileMode.Create))
    {
        PDF.Write(Bytes, 0, Bytes.Length);
    } 
}

该报告在ReportBuilder桌面应用程序中正常运行。如您所见,我删除了所有动态内容(报告URL,参数等),以简化和检测问题根源。

无奈之下,我还尝试将XML数据嵌入到报表中。

错误始终相同:

  

无法为数据集(报告中第一个数据集的名称)创建数据读取器

数据集查询如下:

<Query>
<ElementPath IgnoreNamespaces='true'>
Object1 {
    Element1,
    Element2
}
</ElementPath>
</Query>

请帮助!

解决方案:

我解决了这个问题,我想分享我的解决方案,这样您就不会在同一时间上花费太多时间。

该问题是由报表查看器控件产生的,因为它没有“查询”功能。

然后,我的解决方案是使用报告中所需的确切数据来构建数据集。

XML是由te C#Class下载的。数据被收集,过滤并作为数据集发送到RDL。

最终方法如下:

private MemoryStream RenderPDFFromXML(Stream RDL, Stream XML)
{
    Warning[] warnings = null;
    string[] streamIds = null;
    string mimeType = string.Empty;
    string encoding = string.Empty;
    string extension = string.Empty;
    string filetype = string.Empty;

    ReportViewer RPT = new ReportViewer();
    RPT.ProcessingMode = ProcessingMode.Local;
    RPT.LocalReport.LoadReportDefinition(RDL);

    DataSet DS = new DataSet();
    XML.Position = 0;
    DS.ReadXml(XML);    
    ReportDataSource RDS;
    foreach (DataTable DT in DS.Tables)
    {
        RDS = new ReportDataSource(DT.TableName, DT);
        RPT.LocalReport.DataSources.Add(RDS);
    }
    RPT.LocalReport.Refresh();
    byte[] Bytes = RPT.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
    return new MemoryStream(Bytes);
}

1 个答案:

答案 0 :(得分:0)

对我来说,我传递的是错误的数据集名称,该名称在.rdl文件中提到。例如

"B2:F6"

根据我要添加的模型

<DataSet Name="TestAbc"> </DataSet>

您必须传递在.rdl文件中提到的相同名称,并将其作为数据源名称传递。