报告处理期间发生错误。 ASP.NET MVC中的-RLDC报告
我有这个行动来生成报告:
public ActionResult Report(string id) { LocalReport lr = new LocalReport(); string path = Path.Combine(Server.MapPath("~/Report"), "Person.rdlc"); if (System.IO.File.Exists(path)) { lr.ReportPath = path; } else { return View("Index"); } List<Person> cm = new List<Person>(); var viewModel = new PersonIndexData(); viewModel.People= db.Person .Include(k => k.Groups) .OrderBy(k => k.Name); cm = viewModel.People.ToList(); ReportDataSource rd = new ReportDataSource("PersonDataSet", cm); lr.DataSources.Add(rd); string reportType = id; string mimeType; string encoding; string fileNameExtension; Warning[] warnings; string[] streams; byte[] renderedBytes; renderedBytes = lr.Render( reportType, null, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); return File(renderedBytes, mimeType); }
当我像这样调用这个动作时:(mysite / person / report / pdf),我得到这个exception:
报告处理期间发生错误。 指示这一行:
renderedBytes = lr.Render( reportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings);
你能告诉我为什么我在这个代码中得到这个exception? 它没有给出任何错误,例外情况不是很明显。 我首先使用EF代码。 谢谢。
你添加一个TableAdapter后,你尝试这样吗? 这对我来说是完美的。
public FileResult Report(string id) { PersonTableAdapter ta = new PersonTableAdapter(); PersonDataSet ds = new PersonDataSet(); //for avoiding "Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints." error ds.Person.Clear(); ds.EnforceConstraints = false; ta.Fill(ds.Person, id); //You might customize your data at this step ie applying a filter ReportDataSource rds = new ReportDataSource(); rds.Name = "ReportingDataSet"; rds.Value = ds.Person; ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer(); rv.ProcessingMode = ProcessingMode.Local; rv.LocalReport.ReportPath = Server.MapPath("~/Report/Person.rdlc"); // Add the new report datasource to the report. rv.LocalReport.DataSources.Add(rds); rv.LocalReport.EnableHyperlinks = true; rv.LocalReport.Refresh(); byte[] streamBytes = null; string mimeType = ""; string encoding = ""; string filenameExtension = ""; string[] streamids = null; Warning[] warnings = null; streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings); return File(streamBytes, mimeType, "Person" + "_" + id + ".pdf"); }
希望这可以帮助…
我不确定哪一个会帮助你,所以我把它们列举如下:
- 尝试从“报告”菜单中删除数据源,然后再次添加它
- 在动作之前检查
Render
function要求 ,所以你可能想要检查和out
参数值。 - 试着看看
LocalReporter
一些例子 ,更加清楚如何使用这个工具。
最后,抛出exception的行与主代码不一样,因为你放置null
而不是deviceInfo
! 问候。
我的rdlc解决scheme基于ReportViewer。
byte[] bytes = null; string attachmentName = string.Empty; Warning[] warnings; string[] streamids; string mimeType; string encoding; string extension; /*GetReportDataSources(logicResult, spec);*/ var reportPath = GetReportExecutionPath(); ReportViewer viewer = new ReportViewer(); /*viewer.LocalReport.SubreportProcessing += new Microsoft.Reporting.WinForms.SubreportProcessingEventHandler(LocalReport_SubreportProcessing);*/ viewer.LocalReport.ReportPath = reportPath; /*viewer.LocalReport.SetParameters(parameters);*/ viewer.LocalReport.EnableExternalImages = true; viewer.RefreshReport(); viewer.LocalReport.DisplayName = "displayName"; bytes = viewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);
/ *一些逻辑* /
return new StreamResponse(() => { var pdfOutput = new MemoryStream(bytes); pdfOutput.Seek(0, SeekOrigin.Begin); return pdfOutput; }, "application/pdf").WithHeader("Content-Disposition", "attachment; filename=" + attachmentName);
您还需要添加报告path和数据源(我的解决scheme非常复杂,我使用LocalReport_SubreportProcessing)。
PS使用rdlc与ASP.MVC有1个问题。 你需要在ISS App Pool上设置“Identity = LocalSystem”,这在Intranet上是可以的,但是在Internet上不行。