7

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

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

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

4

5 回答 5

7

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

 conn = new OracleConnection(connectionString);
        conn.Open();
        OracleGlobalization info = conn.GetSessionInfo();
        info.DateFormat = "YYYY-MM-DD";
        conn.SetSessionInfo(info);
于 2014-10-12T14:52:23.757 回答
4

不,这是不可能的,请参阅文档Data Provider for .NET Developer's Guide其中说

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

另请参阅OracleGlobalization 属性

  • 客户端字符集 ->public string ClientCharacterSet { get; }

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

于 2015-12-18T07:09:25.897 回答
3

当您从非托管 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);
于 2016-05-11T08:48:44.697 回答
2

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

ALTER session SET nls_language = 'AMERICAN'

我在打开数据库连接后立即执行它。

完成后,运行它会返回“US”。

select USERENV('LANG') from dual;

您可以运行它来获取nls_language的可能值列表。

select * from V$NLS_VALID_VALUES where parameter = 'LANGUAGE'
于 2017-12-15T21:06:14.340 回答
0

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

更改 Oracle 客户端注册表中 NLS_LANG 设置的影响

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

于 2014-12-08T00:24:44.113 回答