如何检查 .NET 应用程序在哪个区域设置下运行,而无需访问其源代码?
-
09-06-2019 - |
题
语境:我负责运行用 .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>
找出为什么它只发生在那台机器上。这是我实际使用该用户登录的唯一一个,然后域控制器将其区域设置设置为西班牙语。