Я пытаюсь создать метод на C#, чтобы заставить SSRS Reportviewer генерировать вывод PDF.
По этому предмету много информации, так что это казалось легкой задачей.
Проблема возникает, когда мой источник данных поступает с URL-адреса XML.
Это мой метод:
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-данные в отчет.
Ошибка всегда одна и та же:
Cannot create a data reader for dataset (the name of the first dataset on the report)
Запрос набора данных выглядит так:
<Query>
<ElementPath IgnoreNamespaces='true'>
Object1 {
Element1,
Element2
}
</ElementPath>
</Query>
Пожалуйста помоги!!
РЕШЕНИЕ:
Я решил эту проблему и хочу поделиться своим решением, чтобы вы не тратили на это так много времени.
Проблема была создана элементом управления Report Viewer Control, поскольку он не имеет возможности «Запрос».
Затем я решил создать набор данных с точными данными, необходимыми для отчета.
XML был загружен классом C#. Данные были собраны, отфильтрованы и отправлены в 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);
}
Для меня я передавал неправильное имя набора данных, которое было упомянуто в файле .rdl. Например
<DataSet Name = "TestAbc"> </DataSet>
из модели, которую я добавлял
new ReportDataSource("Abc", listOfModel),
Вы должны передать то же имя, которое вы указали в файле .rdl и которое вы передаете в качестве имени источника данных.