Ответ 1
У меня такая же проблема, что "Невозможно создать средство чтения данных для набора данных" zzz "
Ответ - ReportDataSource (строка xxx, DataTable yyy)
Вы должны использовать правильное имя. xxx должен быть zzz
Я создал .rdlc-Report в VS 2012, используя мастер отчетов и добавленный источник данных и набор данных. Когда я пытаюсь сделать отчет с использованием кода ниже, я получаю следующее сообщение об ошибке:
"Невозможно создать средство чтения данных для набора данных DataSet1."
bytes = localReport.Render("PDF", sdeviceinfo, out smimetype, out sencoding, out sfilenameextension, out streamids, out myWarnings);
Заранее благодарим за любые предложения!
У меня такая же проблема, что "Невозможно создать средство чтения данных для набора данных" zzz "
Ответ - ReportDataSource (строка xxx, DataTable yyy)
Вы должны использовать правильное имя. xxx должен быть zzz
My 'gotcha' было обнаружением, что DataSet не совпадает с DataSet.
(Да, я понимаю, что на самом деле я принимаю это на публичном форуме, так как надеюсь, что кто-то еще может избежать этой глупой ошибки)
Вы не можете создать 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);
}
1) Убедитесь, что вы работаете в режиме администратора, и у вас есть доступ к серверу SSRS.
2) Убедитесь, что вы установили правильное имя набора данных или если вы правильно загрузили и назначили его.
Пожалуйста, проверьте этот образец в MSDN.
Удачи!
Я решил проблему - моя ошибка кодирования - я опустил "правильные" значения параметров из кода aspx для SqlServerDataSource следующим образом:
Обратите внимание, что нет значения DefaultValue для параметра name= "p_CSV_VEHICLES"
И (оказалось), что два параметра (= "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>
Пожалуйста, проверьте правильность имени набора данных.
reportDataSource = new ReportDataSource
{
Name = "DataSet1",// Check This Line. Are You Sure DataSet Name is Correct?
Value = ListData
};
У меня также была та же проблема. После моих наблюдений я обнаружил, что в отчетах RDLC нужен набор данных, либо он должен иметь в себе некоторые записи, либо пустой объект (пустой объект будет иметь метаданные)
Поэтому наилучшей практикой всегда является возврат набора данных с пустым объектом (не Null
или nothing
) или с некоторыми записями в нем.
reportviewer1.LocalReport.DataSources.Add(New ReportDataSource("DataSet1", ObjectDataSource1))
лучше разместить свой код, как вы установите свой источник данных для отчета.
Показ ошибки не может создать средство чтения данных для набора данных набора данных1:
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;
}
}
Вы должны дать "DataSet1", иначе он не будет работать.
Убедитесь, что эти две вещи в порядке:
1) в Report1.rdlc [Дизайн] (нажмите Alt + Ctrl + D):
Щелкните правой кнопкой мыши на наборе данных и добавьте набор данных,
в форме свойств набора данных выберите имя: DataSet1
нажмите кнопку Создать... рядом с комбинированным списком источников данных
нажмите на объект
на вашем проекте. выберите ваш список1 или...
и Готово.
Теперь выберите источник данных и Доступные наборы данных в выпадающих списках.
повторите эти шаги и создайте DataSet2...
нажмите OK и закройте форму.
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);
}