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

时间:2015-03-10 14:55:06

标签: c# asp.net asp.net-mvc reporting reportviewer

我有此操作来生成报告:

  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代码。谢谢。

3 个答案:

答案 0 :(得分:2)

我不确定哪一个会帮助你,所以我将它们列为以下内容:

  1. 尝试从“报告”菜单中删除数据源,然后添加它 再次
  2. 行动前检查Render功能requirements,因此您可能需要检查inout参数值。
  3. 尝试查看LocalReporter周围的some examples,以便更加了解如何使用此工具。
  4. 最后,抛出异常的行与主代码不同,因为您放置null而不是deviceInfo 问候。

答案 1 :(得分:2)

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

希望这会有所帮助......

答案 2 :(得分:1)

我的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)。

P.S。在ASP.MVC中使用rdlc有1个问题。您需要在ISS应用程序池“Identity = LocalSystem”上设置,在Intranet中可以,但在Internet中不行。