.net 为oracle托管数据访问设置NLS_LANG

.net 为oracle托管数据访问设置NLS_LANG,.net,winforms,nhibernate,oracle12c,odp.net-managed,.net,Winforms,Nhibernate,Oracle12c,Odp.net Managed,我有一个winforms c应用程序,通过Oracle.manageddataaccess(通过NHibernate 4.0)使用Oracle 12c,Oracle数据库位于客户站点的另一台计算机上。由于Oracle数据库和客户端计算机之间的NLS_LANG差异,我们在字符集转换方面遇到了问题。客户端计算机上没有安装Oracle客户端(仅使用托管驱动程序) 我们发现可以使用环境变量指定客户端NLS_LANG 我的问题是: 在Oracle中使用新的托管数据访问时,是否有其他方法指定NLS_LANG

我有一个winforms c应用程序,通过Oracle.manageddataaccess(通过NHibernate 4.0)使用Oracle 12c,Oracle数据库位于客户站点的另一台计算机上。由于Oracle数据库和客户端计算机之间的NLS_LANG差异,我们在字符集转换方面遇到了问题。客户端计算机上没有安装Oracle客户端(仅使用托管驱动程序)

我们发现可以使用环境变量指定客户端NLS_LANG

我的问题是:
在Oracle中使用新的托管数据访问时,是否有其他方法指定NLS_LANG设置?

我正在使用OracleGlobalization设置日期格式,如下所示。这可能会给你一个线索

 conn = new OracleConnection(connectionString);
        conn.Open();
        OracleGlobalization info = conn.GetSessionInfo();
        info.DateFormat = "YYYY-MM-DD";
        conn.SetSessionInfo(info);

您可能需要检查Windows注册表中的NLS_LANG键。设置键或多或少等同于设置环境变量,但如果两者都存在,则环境变量优先。 这个问题和这个问题有点关联:


在今天的安装过程中,我们发现Web应用程序在64位操作系统上以32位模式运行,因此使用的注册表位置与标准位置不同。它位于HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1中。我建议使用regedit进行全局搜索,以找出NLS_LANG密钥的位置。

不,这是不可能的,请参阅文档中的说明

ODP.NET,托管驱动程序不敏感。它仅对.NET区域设置敏感

也看到

  • ClientCharacterSet->
    公共字符串ClientCharacterSet{get;}

    指定客户端字符集。 在ODP.NET托管驱动程序中不可用


当您从非托管ODP迁移到托管ODP时,会出现问题。 以下是将NLS_LANG按其部分设置为打开的OracleConnection的方法

string nlsLang = Settings.Default.NLS_LANG;
var arr = nlsLang.Split('_');
string language = arr[0];
arr = arr[1].Split('.');
string territory = arr[0];
string characterSet = arr[1];

OracleGlobalization info = connection.GetSessionInfo();
info.Language = language;
info.Territory = territory;
info.NumericCharacters = characterSet;
connection.SetSessionInfo(info);

我使用的是NHibernate,但是你可以用你正在使用的任何东西来运行它

ALTER session SET nls_language = 'AMERICAN'
我在打开数据库连接后立即执行它

完成后,运行此命令将返回“US”

select USERENV('LANG') from dual;
您可以运行它来获得nls\U语言的可能值列表

select * from V$NLS_VALID_VALUES where parameter = 'LANGUAGE'

ODP.NET,托管驱动程序不从注册表中考虑<代码> NLSSLange<代码>。事实上,它根本不考虑注册表设置。这个解决方案并不像我希望的那么健壮。我已将“Region and Language>Format”设置设置为“English(United States)”,以使USERENV('LANG')返回“US”。
信息。NumericCharacters
定义了小数和组分隔符(通常是
),它不设置字符集。我认为这是针对非托管驱动程序的。此代码似乎没有使用托管驱动程序编译。