报告参数的日期时间格式问题,在 s-s-rS 报告 Web 服务中,而不是报告查看器控件

Posted

技术标签:

【中文标题】报告参数的日期时间格式问题,在 s-s-rS 报告 Web 服务中,而不是报告查看器控件【英文标题】:DateTime format issue on report parameter, in s-s-rS reporting web service, not report viewer control 【发布时间】:2011-08-19 17:43:06 【问题描述】:

我想使用 C# 通过 s-s-rS 报告 Web 服务从报告中读取所有参数。但是我在读取 DateTime 参数时遇到了问题。 rdl文件中的参数是英式格式,但是在C#中变成了美式格式。

编辑:

我尝试使用下面的代码设置文化,但它仍然不起作用:

 //set it before instantiating ReportingService2010 instance. 
  Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
  Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB"); 

 //set it when reading a date type value
  Console.WriteLine("0 1 2", dateTime.Year, dateTime.Month, dateTime.Day);
  Console.WriteLine(dateTime.ToString("yyyy-MM-dd"));
 Console.WriteLine(dateTime.ToString("yyyy-MM-dd", new CultureInfo("en-GB", false)));

使用报表查看器控件时,日期格式正确。当通过报表查看器控件读取参数时,日期值已经正确 (dd/MM/YYYY)。但是,当通过报告 Web 服务读取相同的参数时,相同的值是另一种格式(MM/dd/YYYY)。我认为这就是设置文化不起作用的原因。

下面是我的代码:

ReportingService2010 rs = new ReportingService2010();
      rs.Credentials = System.Net.CredentialCache.DefaultCredentials;

      string report = "/SampleReports/Employee Sales Summary";
      bool forRendering = false;
      string historyID = null;
      ParameterValue[] values = null;
      DataSourceCredentials[] credentials = null;
      ItemParameter[] parameters = null;

      try
      
         parameters = rs.GetItemParameters(report, historyID, forRendering, values, credentials);

         if (parameters != null)
         
            foreach (ItemParameter rp in parameters)
            
string value = parameter.DefaultValues.FirstOrDefault(); //it becomes US format here
               Console.WriteLine("Name: 0",value);
            
         
      

      catch (SoapException e)
      
         Console.WriteLine(e.Detail.InnerXml.ToString()); 
      

ReportingService2010.GetItemParameters Method

Accessing the SOAP API

有什么想法吗?

【问题讨论】:

【参考方案1】:

首先,检查报告本身中的语言属性。如果正确,请尝试设置 C# 代码的文化:

Culture="en-GB"

【讨论】:

绝对值得一试。我总是被 Visual Studio 默认为新报告的美国语言的方式所吸引,无论它安装在什么环境中。 @PaulStock 感谢您的建议,将文化设置为“en-GB”是行不通的。请参考我更新的 cmets。【参考方案2】:

我必须在生成的 ReportingService 类旁边创建一个部分类并覆盖 GetWebRequest 方法,然后将 Accept-Language 标头添加到 Web 请求。这是一个示例类:

public partial class ReportingService



 protected override System.Net.WebRequest GetWebRequest(Uri uri)
    
        WebRequest request = base.GetWebRequest(uri);

        request.Headers.Add(HttpRequestHeader.AcceptLanguage, CultureInfo.CurrentCulture.Name);

        return request;
    


【讨论】:

使用 reportExecutionService 像源代码:reportExecutionService.SetExecutionParameters(parametersList.ToArray(), parameterLanguage);parameterLanguageSystem.Globalization.CultureInfo.CurrentCulture.Name

以上是关于报告参数的日期时间格式问题,在 s-s-rS 报告 Web 服务中,而不是报告查看器控件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 s-s-rS 订阅的主题行中包含报告参数?

如何根据 startdate 和 enddate 参数隐藏 s-s-rs 报告生成器中的列?

s-s-rS 13 (SQL 2016) 报告缓存问题

s-s-rS 订阅日期参数 [关闭]

s-s-rS 报告为 Join 表达式提供错误

将多值列表值传递给 s-s-rS 报告参数的 SSAS 报告操作