Установите NLS_LANG для доступа к данным, управляемым Oracle

У меня есть приложение winforms С #, использующее Oracle 12c через oracle.manageddataaccess (через NHibernate 4.0), база данных oracle находится на другом компьютере на сайте клиента, у нас были проблемы с преобразованием набора символов из-за различий NLS_LANG между базой данных oracle и клиентским компьютером . На клиентском компьютере не установлен клиент Oracle (используется только управляемый драйвер).

Мы обнаружили, что вы можете указать клиентский NLS_LANG с помощью переменной среды.

У меня вопрос: есть ли другие способы указать параметр NLS_LANG при использовании нового управляемого доступа к данным в Oracle?


person Alex McMahon    schedule 19.06.2014    source источник


Ответы (5)


Я использую OracleGlobalization, чтобы установить формат даты следующим образом. Это может дать вам ключ к разгадке ..

 conn = new OracleConnection(connectionString);
        conn.Open();
        OracleGlobalization info = conn.GetSessionInfo();
        info.DateFormat = "YYYY-MM-DD";
        conn.SetSessionInfo(info);
person TonyP    schedule 12.10.2014
comment
Я думаю, это для неуправляемого драйвера. этот код, похоже, не компилируется с управляемым драйвером. - person PatrickR; 29.12.2020

Нет, это невозможно, см. Документацию поставщика данных для. NET Developer's Guide, где говорится

ODP.NET, управляемый драйвер не NLS_LANG чувствителен. Это зависит только от языкового стандарта .NET.

Также см. Свойства OracleGlobalization

  • ClientCharacterSet -> public string ClientCharacterSet { get; }

    Задает набор символов клиента. Недоступно в ODP.NET, управляемый драйвер

person Wernfried Domscheit    schedule 18.12.2015

Проблема возникает при переходе от неуправляемого к управляемому 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);
person Vyacheslav Alexeyenko    schedule 11.05.2016
comment
info.NumericCharacters определяет десятичный разделитель и разделитель групп (обычно . и ,), он не устанавливает набор символов. - person Wernfried Domscheit; 20.08.2019

Я использую NHibernate, но вы, вероятно, могли бы запустить его с чем угодно.

ALTER session SET nls_language = 'AMERICAN'

Выполняю сразу после открытия подключения к базе данных.

Как только это будет сделано, запуск вернет «US».

select USERENV('LANG') from dual;

И вы можете запустить это, чтобы получить список возможных значений для nls_language.

select * from V$NLS_VALID_VALUES where parameter = 'LANGUAGE'
person yohosuff    schedule 15.12.2017
comment
Это решение оказалось не таким надежным, как мне хотелось бы. Я прибег к установке для параметра «Регион и язык› формата »значения« Английский (США) », чтобы заставить USERENV (« LANG ») возвращать« US ». - person yohosuff; 19.12.2017

Возможно, вы захотите проверить реестр Windows на предмет ключей NLS_LANG. Установка ключа более или менее эквивалентна установке переменной среды, но если обе существуют, переменная среды имеет приоритет. Этот вопрос StackOverflow был немного связан с этим вопросом:

Влияние изменения параметра NLS_LANG в реестре для Oracle Client

Во время моего сеанса установки сегодня мы обнаружили, что наше веб-приложение работает в 32-битном режиме поверх 64-битной ОС, поэтому используемое место в реестре отличается от стандартного. Он находится в HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ORACLE \ KEY_OraClient11g_home1. Я бы посоветовал выполнить глобальный поиск с помощью regedit, чтобы узнать, где находятся ключи NLS_LANG.

person YudhiWidyatama    schedule 08.12.2014
comment
ODP.NET, Managed Driver не считает NLS_LANG из реестра. На самом деле он вообще не учитывает настройки реестра. - person Wernfried Domscheit; 20.12.2015