如何检查 .NET 应用程序在哪个区域设置下运行,而无需访问其源代码?

StackOverflow https://stackoverflow.com/questions/59013

语境:我负责运行用 .NET 编写的服务。专有应用程序。它使用 SQL Server 数据库。它作为本地计算机中管理员组的用户成员运行。在我将机器添加到域之前它工作正常。

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

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

插入语句中的列比值子句中指定的值少。值子句中的值数量必须匹配插入语句中指定的列数。在system.data.sqlclient.sqlconnection.onerror(sqlexception异常,布尔旋转)

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

看来您在西班牙语言环境下运行的代码和英语语言环境下的SQL Server的组合。因此,SQL期望'15 .28'而不是'15,28'

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

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

在哪些地方可以根据机器/用户/域来定义本地化?

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

有帮助吗?

解决方案

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

system.thread.currentthread.currentculture&system.thread.currentthread.currentuiculture

http://msdn.microsoft.com/en-us/library/system.threading.thread_members.aspx

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

编辑:

事实证明,每个用户的区域设置都保存在这里:

HKEY_CURRENT_USER\Control Panel\International

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

其他提示

您可以在执行代码的线程上下文中设置它。

System.Threading.Thread.CurrentThread.CurrentCulture

太棒了,我创建了控制台应用程序,事实上,该应用程序并不疯狂,CurrentCulture 是西班牙语,但仅适用于该机器上的该用户。如果我以另一个用户身份运行控制台应用程序,它将返回所有文化的英语。

我是否应该提出一个新问题,询问用户明智的区域设置在哪里?

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

<rant>顺便说一句,请批评开发人员在使用字符串时没有文化意识。</rant>

找出为什么它只发生在那台机器上。这是我实际使用该用户登录的唯一一个,然后域控制器将其区域设置设置为西班牙语。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top