【问题标题】:Set NLS_LANG for oracle managed data access为 oracle 管理的数据访问设置 NLS_LANG
【发布时间】:2014-08-10 01:11:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net winforms nhibernate oracle12c odp.net-managed


    【解决方案1】:

    当您从非托管 ODP 迁移到托管 ODP 时会出现此问题。 这是将 NLS_LANG 的部分设置为 opened 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);
    

    【讨论】:

    • info.NumericCharacters 定义小数和组分隔符(通常为.,),它不设置字符集。
    【解决方案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'
    

    【讨论】:

    • 这个解决方案没有我希望的那么强大。我已将“区域和语言 > 格式”设置为“英语(美国)”以使 USERENV('LANG') 返回 'US'。
    【解决方案3】:

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

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

    另见OracleGlobalization Properties

    • ClientCharacterSet -> public string ClientCharacterSet { get; }

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

    【讨论】:

      【解决方案4】:

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

      Effects of changing NLS_LANG setting in the registry for Oracle Client

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

      【讨论】:

      • ODP.NET,托管驱动程序不考虑注册表中的NLS_LANG。实际上它根本不考虑注册表设置。
      【解决方案5】:

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

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

      【讨论】:

      • 我认为这是针对非托管驱动程序的。此代码似乎无法使用托管驱动程序编译。
      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 2013-11-12
      • 1970-01-01
      相关资源
      最近更新 更多