如何在不访问源代码的情况下检查.NET应用程序在哪个语言环境下运行?

时间:2020-03-05 18:52:13  来源:igfitidea点击:

语境:
我负责运行用.NET编写的服务。专有申请。它使用SQL Server数据库。它以本地计算机中Administrators组的用户身份运行。在将计算机添加到域之前,它工作正常。

因此,我将计算机添加到域中(Win 2003),并将用户更改为Power Users组的成员,现在,

问题:
它尝试执行的某些SQL语句在西班牙语本地化中非常神奇(其中,将浮点数而不是。分隔开),从而导致错误。

There are fewer columns in the INSERT
  statement than values specified in the
  VALUES clause. The number of values in
  the VALUES clause must match the
  number of columns specified in the
  INSERT statement.    at
  System.Data.SqlClient.SqlConnection.OnError(SqlException
  exception, Boolean breakConnection)

机器中的操作系统和区域设置为英文。我询问了应用程序的提供者,他说:

Looks like you have a combination of
  code running under Spanish locale, and
  SQL server under English locale. So
  the SQL expects '15.28' and not
  '15,28'

在我看来,这在各个级别上都是错误的(SQL Server如何区分逗号分隔参数和属于浮点数的逗号?)。

因此,代码似乎是从某个地方获取西班牙语言环境的,我不知道它是运行它的用户,还是其他地方的用户(可能是全局策略?)。但是问题是

在机器/用户/域的基础上定义本地化的地方是什么?

我不知道必须搜寻罪魁祸首的所有地方,所以请帮助我找到它!

解决方案

回答

我们可以在执行代码的线程上下文中进行设置。

System.Threading.Thread.CurrentThread.CurrentCulture

回答

.NET中有两种本地化类型,可以在这些变量中找到区域性的两种设置(在计算机上启动.NET命令行应用程序以查看其内容):

System.Thread.CurrentThread.CurrentCulture

System.Thread.CurrentThread.CurrentUICulture

http://msdn.microsoft.com/zh-CN/library/system.threading.thread_members.aspx

它们与控制面板中的设置(在区域设置部分中)有关。
创建一个.NET命令行应用程序,然后仅在上述属性上调用ToString(),它应该告诉我们要查看哪个属性。

编辑:

原来,每个用户的语言环境设置都保存在这里:

HKEY_CURRENT_USER\Control Panel\International

可能值得检查具有西班牙语言环境的用户注册表,并将其与设置为美国或者我们需要的任何语言环境的注册表进行比较。

回答

太好了,我创建了控制台应用程序,确实,该应用程序并不疯狂,CurrentCulture是西班牙语,但仅适用于THAT计算机中的THAT用户。如果我以其他用户身份运行控制台应用程序,则它将返回所有文化的英语。

我是否应该打开一个新问题,询问用户明智的语言环境设置在哪里?

回答

好吧,如果它是针对用户的,请查看"区域和语言选项"控制面板。

<rant>另一方面,请踢一下开发人员,使他们在使用字符串时不了解文化。</ rant>

回答

找出为什么它仅在那台机器上发生。这是我实际与该用户一起登录的唯一帐户,然后域控制器为此设置了西班牙语的区域设置。