SSRS 子报表是否高效?
Are SSRS SubReports efficient?
(我是一名拥有 25 年以上经验的开发人员,但我对 SSRS 还很陌生,因此我正在努力更好地理解一些基础知识。)
子报告。
到目前为止我读到的所有内容都是将子报告创建为独立的 .rdl 或 .rdlc 文件,然后将此文件 link 放入主报告中。那部分是有道理的。
但是,在寻求有关如何有效执行此操作的帮助时,我看到教程中重复了相同的模式:使用未过滤的 SELECT 语句(无参数或 WHERE 子句)作为数据源,然后使用过滤器将显示的数据限制为您需要的内容。
我只需要了解一件事。这是 "best-and-only" 方式,还是这是一种可行方式的示例,最容易解释,但实际上在负载下执行得非常糟糕?说真的,没有人期望 NorthWind 或 AdventureWorks 是复杂数据流的真实示例。
我们正在为拥有数万行的客户编写此报告,这些行将在未过滤的 SELECT 语句中 returned,但最多 return 10如果我可以根据从主报表传递到子报表的参数使用带有 WHERE 子句的正确 SELECT 语句。我还不知道这个报告的响应时间是多少,但如果它要为子报告获取和处理数千行,速度会很糟糕。
有人可以指导我访问讨论如何有效处理 SSRS 子报表的博客或其他来源吗?
我只能得出结论,到目前为止我发现的所有教程都提供了过于简单的解决方案,根本无法很好地扩展。
我幸运地遇到了一个正在处理不同问题的线程,但是 OP 提出了他的解决方案,那就是 。
总结一下:
1)因为一个子报表只是一个.rdlc,根本没有预处理的余地。任何预处理都必须在主报告的 .ASPX.CS 代码中处理。
2) 在您的 .ASPX.CS Page_Load 中,将新的 SubreportProcessingEventHandler 添加到您的 ReportViewer,例如:
yourReportViewer.LocalReport.SubreportProcessing += new
SubreportProcessingEventHandler(SetSubDataSource);
yourReportViewer.LocalReport.Refresh();
3) 在您的 EventHandler 中,您建立数据库连接,并仅取回子报表所需的数据。您不会全部获取,然后对其进行过滤,这是非常低效的。
public void SetSubDataSource(object sender, SubreportProcessingEventArgs e)
{
// Reload the data required
SqlConnection conn = null;
SqlCommand cmd = null;
conn = new SqlConnection();
conn.ConnectionString =
ConfigurationManager.ConnectionStrings["connectionStringFromWebConfig"].ConnectionString;
conn.Open();
cmd = new SqlCommand();
cmd.Connection = conn;
SqlDataAdapter dataAdapter = new SqlDataAdapter();
DataSet dataset = new DataSet();
if (e.ReportPath == "yourSubReport")
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "yourSubReportStoredProcedure";
cmd.Parameters.AddWithValue("@subReportParam1", subReportParam1.Text);
dataAdapter = new SqlDataAdapter(cmd);
dataAdapter.Fill(dataset);
e.DataSources.Add(new ReportDataSource("yourSubReportDataSetName", dataset.Tables[0]));
}
}
(我是一名拥有 25 年以上经验的开发人员,但我对 SSRS 还很陌生,因此我正在努力更好地理解一些基础知识。)
子报告。
到目前为止我读到的所有内容都是将子报告创建为独立的 .rdl 或 .rdlc 文件,然后将此文件 link 放入主报告中。那部分是有道理的。
但是,在寻求有关如何有效执行此操作的帮助时,我看到教程中重复了相同的模式:使用未过滤的 SELECT 语句(无参数或 WHERE 子句)作为数据源,然后使用过滤器将显示的数据限制为您需要的内容。
我只需要了解一件事。这是 "best-and-only" 方式,还是这是一种可行方式的示例,最容易解释,但实际上在负载下执行得非常糟糕?说真的,没有人期望 NorthWind 或 AdventureWorks 是复杂数据流的真实示例。
我们正在为拥有数万行的客户编写此报告,这些行将在未过滤的 SELECT 语句中 returned,但最多 return 10如果我可以根据从主报表传递到子报表的参数使用带有 WHERE 子句的正确 SELECT 语句。我还不知道这个报告的响应时间是多少,但如果它要为子报告获取和处理数千行,速度会很糟糕。
有人可以指导我访问讨论如何有效处理 SSRS 子报表的博客或其他来源吗?
我只能得出结论,到目前为止我发现的所有教程都提供了过于简单的解决方案,根本无法很好地扩展。
我幸运地遇到了一个正在处理不同问题的线程,但是 OP 提出了他的解决方案,那就是
总结一下: 1)因为一个子报表只是一个.rdlc,根本没有预处理的余地。任何预处理都必须在主报告的 .ASPX.CS 代码中处理。
2) 在您的 .ASPX.CS Page_Load 中,将新的 SubreportProcessingEventHandler 添加到您的 ReportViewer,例如:
yourReportViewer.LocalReport.SubreportProcessing += new
SubreportProcessingEventHandler(SetSubDataSource);
yourReportViewer.LocalReport.Refresh();
3) 在您的 EventHandler 中,您建立数据库连接,并仅取回子报表所需的数据。您不会全部获取,然后对其进行过滤,这是非常低效的。
public void SetSubDataSource(object sender, SubreportProcessingEventArgs e)
{
// Reload the data required
SqlConnection conn = null;
SqlCommand cmd = null;
conn = new SqlConnection();
conn.ConnectionString =
ConfigurationManager.ConnectionStrings["connectionStringFromWebConfig"].ConnectionString;
conn.Open();
cmd = new SqlCommand();
cmd.Connection = conn;
SqlDataAdapter dataAdapter = new SqlDataAdapter();
DataSet dataset = new DataSet();
if (e.ReportPath == "yourSubReport")
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "yourSubReportStoredProcedure";
cmd.Parameters.AddWithValue("@subReportParam1", subReportParam1.Text);
dataAdapter = new SqlDataAdapter(cmd);
dataAdapter.Fill(dataset);
e.DataSources.Add(new ReportDataSource("yourSubReportDataSetName", dataset.Tables[0]));
}
}