繁体   English   中英

报表处理期间发生错误。 -ASP.NET MVC中的RLDC报告

[英]An error occurred during report processing. -RLDC reporting in ASP.NET MVC

我有这个动作来生成报告:

  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)时,出现此异常:

报表处理期间发生错误。 指示这一行:

        renderedBytes = lr.Render(
            reportType,
            deviceInfo,
            out mimeType,
            out encoding,
            out fileNameExtension,
            out streams,
            out warnings);

你能告诉我为什么我在这段代码中得到这个异常吗? 它没有给出任何错误,并且异常不是很解释。 我先使用EF代码。 谢谢。

我不确定哪一个会帮助您,因此将它们列出如下:

  1. 尝试从“报告”菜单中删除数据源,然后再次添加
  2. 在执行操作之前,请检查“ Render功能要求 ,因此您可能想检inout参数值。
  3. 尝试查看有关LocalReporter 一些示例 ,以更清楚地了解如何使用此工具。

最后,引发异常的行与主代码不同,因为您放置了null而不是deviceInfo 问候。

添加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 i.e. 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");
}

希望这可以帮助...

我的rdlc解决方案基于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);

您还需要添加报告路径和数据源(我的解决方案很复杂,并且用于LocalReport_SubreportProcessing)。

PS与ASP.MVC一起使用rdlc有1个问题。 您需要在ISS应用程序池中设置“ Identity = LocalSystem”,在Intranet中可以,但在Internet中则不能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM