为oracle托管数据访问设置NLS_LANG

时间:2014-06-19 13:16:47

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

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

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

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

从非托管ODP迁移到托管ODP时,问题会出现。 以下是将NLS_LANG设置为打开 OracleConnection

的方法
a

答案 2 :(得分:2)

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

  

ODP.NET,托管驱动程序不是{+ +}敏感的。它只对.NET语言环境敏感。

另见OracleGlobalization Properties

  
      
  • ClientCharacterSet - > NLS_LANG

         

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

  •   

答案 3 :(得分:1)

您可能需要查看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键的位置。

答案 4 :(得分:0)

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

ALTER session SET nls_language = 'AMERICAN'

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

完成后,运行此操作将返回' US'。

select USERENV('LANG') from dual;

您可以运行此选项以获取 nls_language 的可能值列表。

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