1

イントラネット Web アプリを開発するために MVC4 と Entity Framework を使用しており、ユーザーがダウンロードできるレポートを作成する必要があります。実際、2 つのレポート テンプレート (.rdlc ファイル) があります。それらの 1 つは、次のテンプレート用にコピーおよび変更される汎用テンプレートです。それが、「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;
}

更新: DataSet がいっぱいになっているかどうかを確認したかったのですが、そうではありません。それが問題でしょうか?

4

1 に答える 1

0

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);
于 2013-04-08T14:18:15.903 に答える