繁体   English   中英

C#/ReportViewer:如何在不指定参数名称的情况下使用参数

[英]C#/ReportViewer: How to use parameters without specifying parameter names

我正在使用 C# 解决方案,该解决方案使用 ReportViewer 控件访问我们的 SSRS 服务器报告。

有人问我是否可以以未指定参数名称的方式对解决方案进行编码。 老实说,我不确定如何问这个问题。

目前该解决方案被少数报告使用,因此硬编码参数名称很简单,这些参数是查询字符串参数。

该解决方案从 web.config 文件中获取服务器 URL:

// Add the Reporting Server URL
rvSiteMapping.ServerReport.ReportServerUrl = new Uri(ConfigurationManager.AppSettings["ReportServerUrl"].ToString());

该解决方案从名为 = ReportPath 的查询字符串参数中获取报表路径,并分配给名为 ReportPath 的报表查看器报表路径属性:

//Add the Report Path
rvSiteMapping.ServerReport.ReportPath = Request.QueryString["ReportPath"];

这两个应该保持这样。

我需要改变的是以下内容:

第一个报告采用一个名为 MeetingID 的参数,第二个报告采用一个名为 RecordID 的参数,第三个报告采用一个包含 3 个参数的数组(每个参数可选)

我为每个报告指定每个参数的名称。 我在问是否有办法实现相同但不必指定参数名称,因此该解决方案可用于任何报告。 我们的报告采用 1 到最多 5 个参数。

这是我当前的代码,请不要对我苛刻,我正在学习如何使用此解决方案。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        try
        {
            rvSiteMapping.Height = Unit.Pixel(Convert.ToInt32(700));
            rvSiteMapping.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
            rvSiteMapping.ShowCredentialPrompts = false;

            if (ConfigurationManager.AppSettings["UseCredentials"].ToString().ToUpper() == "TRUE")
            {
                rvSiteMapping.ServerReport.ReportServerCredentials = new ReportCredential(
                    ConfigurationManager.AppSettings["UserName"].ToString(),
                    ConfigurationManager.AppSettings["UserPassword"].ToString(),
                    ConfigurationManager.AppSettings["UserNameDomain"].ToString()
                    );
            }

            // Add the Reporting Server URL
            rvSiteMapping.ServerReport.ReportServerUrl = new Uri(ConfigurationManager.AppSettings["ReportServerUrl"].ToString());
            
            //Add the Report Path
            rvSiteMapping.ServerReport.ReportPath = Request.QueryString["ReportPath"];

                        
            if (Request.QueryString["MeetingID"] != null)
            {
                Microsoft.Reporting.WebForms.ReportParameter[] parameters = new Microsoft.Reporting.WebForms.ReportParameter[1];
                parameters[0] = new Microsoft.Reporting.WebForms.ReportParameter("MeetingID", Request.QueryString["MeetingID"]);
                rvSiteMapping.ServerReport.SetParameters(parameters);
            }                    
            else if (Request.QueryString["RecordID"] != null)
            {
                Microsoft.Reporting.WebForms.ReportParameter[] parameters = new Microsoft.Reporting.WebForms.ReportParameter[1];
                parameters[0] = new Microsoft.Reporting.WebForms.ReportParameter("RecordID", Request.QueryString["RecordID"]);
                rvSiteMapping.ServerReport.SetParameters(parameters);

            }
            else if (Request.QueryString.Count > 2)
            {
                Microsoft.Reporting.WebForms.ReportParameter[] parameters = new Microsoft.Reporting.WebForms.ReportParameter[3];
                parameters[0] = new Microsoft.Reporting.WebForms.ReportParameter("StreetNumber", Request.QueryString["StreetNumber"]);
                parameters[1] = new Microsoft.Reporting.WebForms.ReportParameter("StreetName", Request.QueryString["StreetName"]);
                parameters[2] = new Microsoft.Reporting.WebForms.ReportParameter("District", Request.QueryString["District"]);
                rvSiteMapping.ServerReport.SetParameters(parameters);
            }
            rvSiteMapping.ServerReport.Refresh();
        }
        catch (Exception ex)
        {
            Console.WriteLine("General exception. {0}", ex.Message);
        }
    }
}

提前感谢您提供的任何帮助或您可能愿意并愿意分享的想法。

伊拉斯莫

Request.QueryString只是一个集合,因此您可以很容易地使参数通用。 我没有 IDE 手头,所以我的语法可能不是 100% 正确 - 但一般的想法是。

 // see if we have any query string parameters
 if (Request.QueryString.Count > 0) {
   // create the report parameters of the same length
   Microsoft.Reporting.WebForms.ReportParameter[] p = 
       new Microsoft.Reporting.WebForms.ReportParameter[Request.QueryString.Count];

    // loop over the query string and use the index to build your report params based on the key/value
    for (int idx = 0; idx < Request.QueryString.Count; idx++) {  
      p[idx] = new Microsoft.Reporting.WebForms.ReportParameter(
        Request.QueryString.GetKey(idx), 
        Request.QueryString.Get(idx)
      );
    }   

    // set your report parameters on your server report
    rvSiteMapping.ServerReport.SetParameters(parameters);
 }

这样您就可以处理任何给定的参数,而无需事先知道参数名称。

正在看这样的东西吗?

Microsoft.Reporting.WebForms.ReportParameter[] parameters = new Microsoft.Reporting.WebForms.ReportParameter[Request.QueryString.Count];
    int i = 0;
    foreach(var val in Request.QueryString)
    {
        parameters[i++]=val;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM