sql >> データベース >  >> RDS >> Oracle

RDLCLocalReportのExcelへのエクスポートが非常に遅い

    レポート内にグループ化がある場合。レガシーCASが削除された.NET4以降、ローカルで処理されるRDLCレポートは、動的グループ化または動的フィルターの実行に膨大な時間を要します。このhttps://social.msdn.microsoft.com/Forums/sqlserver/en-US/6d89e2ce-3528-465f-9740-7e22aa7b7aae/slow-performance-with-dynamic-grouping-and-に関連する既存のディスカッションがありますreportviewer-in-local-mode?forum =sqlreportingservices
    私が見つけた最善の解決策は、
    1です。新しい.NET3.5ライブラリプロジェクトを作成し、レポートの実際の処理を行うファイルを作成します。

    using Microsoft.Reporting.WebForms;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Text;
    
    //As you would expect, the new assembly WebReportviewer.FullTrustReportviewer
    //all it does is just run the report. that's it. here is the code, it should be in a separated project:
    
    namespace WebReportviewer
    {
        [Serializable]
        public class FullTrustReportviewer : MarshalByRefObject
        {
            private ReportViewer FullTrust;
            public FullTrustReportviewer()
            {
                FullTrust = new ReportViewer();
                FullTrust.ShowExportControls = false;
                FullTrust.ShowPrintButton = true;
                FullTrust.ShowZoomControl = true;
                FullTrust.SizeToReportContent = false;
                FullTrust.ShowReportBody = true;
                FullTrust.ShowDocumentMapButton = false;
                FullTrust.ShowFindControls = true;
                //FullTrust.LocalReport.SubreportProcessing += LocalReport_SubreportProcessing;
                //FullTrust.LocalReport.SetBasePermissionsForSandboxAppDomain(new PermissionSet(PermissionState.Unrestricted));
            }
    
            public void Initialize(string DisplayName, string ReportPath, bool Visible, ReportParameter[] reportParam, string reportRenderFormat, string deviceInfo, string repMainContent, List<string[]> repSubContent)
            {
                FullTrust.LocalReport.DisplayName = DisplayName;
                FullTrust.LocalReport.ReportPath = ReportPath;
                //FullTrust.Visible = Visible;
                //FullTrust.LocalReport.LoadReportDefinition(new StringReader(repMainContent));
                FullTrust.LocalReport.SetParameters(reportParam);
    
                repSubContent.ForEach(x =>
                {
                    FullTrust.LocalReport.LoadSubreportDefinition(x[0], new StringReader(x[1]));
                });
                FullTrust.LocalReport.DataSources.Clear();
            }
    
            public byte[] Render(string reportRenderFormat, string deviceInfo)
            {
                return FullTrust.LocalReport.Render(reportRenderFormat, deviceInfo);
            }
            public void AddDataSources(string p, DataTable datatable)
            {
                FullTrust.LocalReport.DataSources.Add(new ReportDataSource(p, datatable));
            }
    
            public SubreportProcessingEventHandler SubreportProcessing { get; set; }
    
            public static void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
            {
                LocalReport lr = (LocalReport)sender;
    
                e.DataSources.Clear();
                ReportDataSource rds;
    
                if (e.ReportPath.Contains("DataTable2"))
                {
                    DataTable dt = (DataTable)lr.DataSources["DataTable2"].Value;
                    DataView dv = new DataView(dt);
                    dv.RowFilter = string.Format("Id={0}", e.Parameters["Id"].Values[0]);
                    rds = new ReportDataSource("DataTable2", dv.ToTable());
                    e.DataSources.Add(rds);
                }
            }
        }
    }
    

    2.既存のプロジェクトからコードを呼び出します

     public static byte[] GeneratePBAReport()
            {
    
    
                string l_spName = string.Empty;
                string l_reportPath = string.Empty;
                var repCol = new List<ReportDataSource>();
    
                var repParCol = new ReportParameter[1];
                if (id == "")
                {
    
                    l_reportPath = HttpContext.Current.Server.MapPath("~\\.rdlc");
                    l_spName = "";
                }
                else
                {
                    l_reportPath = HttpContext.Current.Server.MapPath("~\\.rdlc");
                    l_spName = "";
                }
    
                repParCol[0] = new ReportParameter("pID", "");
    
                var ds = new DataSet();
                using (var sqlCmd = new SqlCommand(l_spName, new SqlConnection(ConfigurationManager.ConnectionStrings[""].ConnectionString)))
                {
                    sqlCmd.CommandType = CommandType.StoredProcedure;
                    var sqlParam = new SqlParameter() { Value = "", ParameterName = "" };
                    sqlCmd.Parameters.Add(sqlParam);
                    sqlCmd.CommandTimeout = 300;
                    using (var sqlAdapter = new SqlDataAdapter(sqlCmd))
                    {
                        sqlAdapter.Fill(ds);
                    }
                }
    
                var rds = new ReportDataSource();
                rds.Name = "";
                rds.Value = ds.Tables[0];
                //l_report.DataSources.Add(rds);
                repCol.Add(rds);
    
                rds = new ReportDataSource();
                rds.Name = "";
                rds.Value = ds.Tables[1];
                //l_report.DataSources.Add(rds);
                repCol.Add(rds);
    
                rds = new ReportDataSource();
                rds.Name = "";
                rds.Value = ds.Tables[2];
                //l_report.DataSources.Add(rds);
                repCol.Add(rds);
    
                rds = new ReportDataSource();
                rds.Name = "";
                rds.Value = ds.Tables[3];
                //l_report.DataSources.Add(rds);
                repCol.Add(rds);
    
                Warning[] warnings;
                string[] streamids;
                string mimeType;
                string encoding;
                string extension;
                string deviceInfo;
    
    
                deviceInfo = "<DeviceInfo><SimplePageHeaders>True</SimplePageHeaders></DeviceInfo>";
    
                return NewDomainReport.Render("PDF", deviceInfo, "-" , l_reportPath, true, repCol, string.Empty, new List<string[]>(), repParCol);
            }
    

    非常に迅速なテストのために、記事に記載されているようにweb.configにCASを追加してみてください。

    ASP Netアプリケーションでは、<trust legacyCasModel="true" level="Full"/>を使用できます。 同じ結果を得るには、web.configファイルのsystem.webセクションにあります。

    速度が大幅に向上した場合、上記のコードは同じように動作します。上記のコードの利点は、ソリューション全体に影響を与えるのではなく、個別のAppDomainを作成することです。



    1. SQL再帰CTE:プロパティによってリンクされたオブジェクトの検索

    2. Include()を何度も使用すると、Entity-Frameworkコードが遅くなります

    3. グループ内の最後の行をクエリで検索-SQLServer

    4. 列のMySql合計要素