【问题标题】:MVC 4 Reporting with Entity Framework使用实体框架进行 MVC 4 报告
【发布时间】:2013-03-30 12:17:29
【问题描述】:

我正在使用 MVC4 和 Entity Framework 来开发 Intranet Web 应用程序,我必须创建可供用户下载的报告。事实上,我有 2 个报告模板(.rdlc 文件)。其中之一是通用模板,将为下一个模板复制和修改。这就是我对“PersonReport”模板所做的:从通用模板中复制和修改。

我的问题是使用通用模板(以及下面的代码),一切都很好。但是,当我使用我的个性化模板时,它不起作用。我尝试调试我的代码,发现问题出在哪里(当我使用 .Render() 指定格式时)。有我的错误信息:

An error occurred during local report processing.

这是我的行动:

public ActionResult PersonReport()
{

    ReportViewer personReportViewer = new ReportViewer();

    //Parameters

    ReportParameter[] reportParameters = new ReportParameter[3];
    reportParameters[0] = new ReportParameter("Title", "Test", true);
    reportParameters[1] = new ReportParameter("Address", "Avenue de Tervuren,  268", true);
    reportParameters[2] = new ReportParameter("PostalCode", "B-1150 Brussels", true);

    //Report Template

    personReportViewer.ProcessingMode = ProcessingMode.Local;
    personReportViewer.LocalReport.ReportPath = HttpContext.Server.MapPath("..") + "\\Reporting\\Templates\\" + "AllPersonsReport.rdlc";

    //Source

    DataSet ds = BuSIMaterial.Utils.Services.ExecuteStoredProcedure(db, "GetAllPersons", null);

    ReportDataSource dataSource = new ReportDataSource("personDataSource", ds.Tables[0]);
    personReportViewer.LocalReport.DataSources.Clear();
    personReportViewer.LocalReport.DataSources.Add(dataSource);

    //Report type

    personReportViewer.LocalReport.SetParameters(reportParameters);
    byte[] byteArray = personReportViewer.LocalReport.Render("PDF"); //Here's the failure

    //Downloading

    Response.ClearHeaders();
    Response.AddHeader("Content-Disposition", "attachment; Filename=\"" + DateTime.Now + "_Title_.pdf" + "\"");
    Response.AddHeader("Content-Transfer-Encoding", "Binary");
    Response.BinaryWrite((byte[])byteArray);
    Response.Flush();
    Response.End();

    return RedirectToAction("Index");
}

还有我从一个简单的 select * 存储过程创建 DataSet 的方法:

public static DataSet ExecuteStoredProcedure(ObjectContext db,
                                     string storedProcedureName,
                                     IEnumerable<SqlParameter> parameters)
{
    var connectionString =
        ((EntityConnection)db.Connection).StoreConnection.ConnectionString;

    var ds = new DataSet();

    using (var conn = new SqlConnection(connectionString))
    {
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = storedProcedureName;
            cmd.CommandType = CommandType.StoredProcedure;

            if (parameters != null)
            {
                foreach (var parameter in parameters)
                {
                    cmd.Parameters.Add(parameter);
                }
            }

            using (var adapter = new SqlDataAdapter(cmd))
            {
                adapter.Fill(ds);
            }
        }
    }

    return ds;
}

UPDATE:我想检查我的 DataSet 是否已填满,但未填满。会不会是问题?

【问题讨论】:

  • 你的数据集有问题是什么意思?同样出于代码整洁的原因,请查看 FileResult 而不是弄乱响应标头。
  • 感谢您的建议。事实上我是不对的,DataSet 不是问题。当我调用 .Render() 方法时,一切都出错了。
  • 您应该尝试使用其他版本或Render,使用更多参数来获取更多错误信息。

标签: c# asp.net-mvc entity-framework reporting-services dataset


【解决方案1】:

我认为您应该尝试在 Render() 重载中添加更多参数:

    private Warning[] warnings;
    private string[] streams;
    private string mimeType;
    private string encoding;
    private string extension;

    byte[] byteArray = personReportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streams, out warnings);

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多