User!Language 与 CurrentThread

User!Language vs CurrentThread

为了格式化 RDL 文件中的日期,我们使用以下格式:

=First(FormatDateTime(Fields!SomeDate.Value, 2))

根据这个Page,它应该采用计算机的区域设置。

问题是:如果我通过另一个服务调用 Reporting-Service 并尝试设置语言:

rs.SetExecutionParameters(MapParameters(Report.Parameters).ToArray(), "de-CH"); 

这会被忽略。我试图通过

覆盖 Thread-Cultures
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de-CH");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-CH");

这也被忽略了。 真正的字符串是什么:Reporting-Server 本身也有 de-CH 作为文化,但它一直使用英文日期格式。

有人可以告诉我 "Computer's Regional Settings" 是什么意思以及为什么 Reporting-Service 拒绝接受传递的文化吗?

编辑:报告中的语言是

=User!Language

一般说我想从外部传递报告语言,无论是通过 CurrentThread 还是通过参数。但是两者都被忽略了。

简答

而不是 FormatDateTime, you could use Format 并指定您期望的输出格式:

=First(Format(Fields!SomeDate.Value, "dd.MM.yyyy"))

或者将区域性包含在参数中的另一种替代方法,但在这种情况下,您将不得不阅读冗长的答案。

长答案

您对 SetExecutionParameters 的第一次尝试是设置参数的文化,这不会影响报告本身(仅影响您传递给它的参数)。

您的第二次尝试是更改客户端应用程序的区域性,这也不影响报告(仅客户端应用程序区域性)。

FormatDateTime功能通常使用计算机区域设置,但在Reporting Services中不使用。它将采用报告文化,在您的情况下是 User!Language.

User!Language returns 浏览报表服务器时在客户端 Web 浏览器中配置的语言。
我不确定从网络服务调用时的行为是什么(采用特定设置或默认为 en-US)。

报表语言 属性 可以是一个表达式,因此您可以向报表添加另一个文本参数,例如 ReportCulture,并在 Properties 中使用它 => Language:

=Parameters!ReportCulture.Value

您必须继续使用您的日期表达式:

=First(FormatDateTime(Fields!SomeDate.Value, 2))

您可以配置一个默认值(de-CH 在您的情况下),这样只有在您想要覆盖它时才会指定此设置。