我正在尝试在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);
}
答案 0 :(得分:0)
对我来说,我传递的是错误的数据集名称,该名称在.rdl文件中提到。例如
"B2:F6"
根据我要添加的模型
<DataSet Name="TestAbc"> </DataSet>
您必须传递在.rdl文件中提到的相同名称,并将其作为数据源名称传递。