Влияние изменения параметра NLS_LANG в реестре для клиента Oracle - PullRequest
3 голосов
/ 19 ноября 2009

Мы находимся в процессе перехода от драйвера Oracle .NET Microsoft к драйверу ODP.NET.

Одна из проблем, с которой мы столкнулись, это ошибка:

ORA-12705: Невозможно получить доступ к файлам данных NLS или указана неверная среда

Мы смогли остановить ошибку, изменив реестр и изменив настройки ( см. Этот вопрос )

В нашем случае мы изменили

HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - NLS_LANG

который был установлен на NA

будет таким же, как

HKEY_LOCAL_MACHINE - SOFTWARE - ORACLE - HOME0 - NLS_LANG

, который был установлен правильно

У меня вопрос, почему в реестре должны быть другие настройки NLS_LANG, и может ли быть какой-либо удар по эффектам изменения этого значения?


Обновление: Я только что нашел в Oracle NLS FAQ следующее

Для Oracle версии 7:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

Для баз данных Oracle версий 8, 8i и 9i:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\

где "х" - уникальный номер идентификация дома Оракула. ​​

HOME0 - первая установка

Для базы данных Oracle 10g:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>

Там у вас есть запись с именем NLS_LANG

ОК, поэтому существуют разные настройки реестра для разных версий ...

Примечание:

Некоторые люди смущены, обнаружив NLS_LANG установлен в «NA» в HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE когда версия 7 не была установлена. это используется для обратной совместимости, и может быть проигнорировано.

У меня Oracle 9i, так что теперь я еще больше запутался - почему dll ODP.NET смотрит на параметр реестра Oracle 7?

Ответы [ 5 ]

2 голосов
/ 11 января 2013

В нашем случае мы не хотели вносить какие-либо потенциально критические изменения в реестр Oracle, поскольку устанавливали наш веб-сервис на производственном сервере Oracle 9i.

Решение состояло в том, чтобы просто запретить ODAC видеть какие-либо ключи реестра ORACLE, отказав во всем доступе к этому ключу для идентификатора пользователя, под которым работал наш веб-сервис.

  1. Пуск -> Выполнить ... regedit (как администратор)
  2. Перейдите к HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
  3. Правой кнопкой мыши нажмите клавишу ORACLE -> Разрешения ...
  4. Нажмите кнопку Добавить ....
  5. Добавьте имя пользователя веб-службы, настроенное в удостоверении пула приложений веб-службы (например, IUSR_MyWebService); это имя пользователя, которое отображается против вашего процесса w3wp.exe в диспетчере задач.
  6. Нажмите ОК.
  7. Для новых прав доступа пользователя отметьте «Запретить» напротив разрешения «Полный доступ» и нажмите ОК.

Это сработало просто отлично, и в качестве бонуса мы обеспечили защиту нашего приложения от любых будущих изменений ключей реестра ORACLE.

Подсказка: Вы можете доказать себе, что данный пользователь не имеет доступа к указанным ключам, закрыв все запущенные экземпляры редактора реестра, запустив приглашение CMD пользователь (с помощью Run As ...), а затем запуск regedit из командной строки.

2 голосов
/ 17 января 2012

У меня была похожая проблема с;

ORA-12705: Невозможно получить доступ к файлам данных NLS или указана неверная среда

DLL или мгновенный клиент ODP.NET читали реестр;

HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE \ NLS_LANG = NA

Значение NA вызвало ошибку.

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

Моим простым исправлением в моем решении vb.net было, например, настроить среду для приложения с помощью:

Environment.SetEnvironmentVariable("NLS_LANG", 
                    "AMERICAN_AMERICA.WE8MSWIN1252", 
                    EnvironmentVariableTarget.Process)

пь. Ссылка Oracle "NLS FAQ" больше не действительна (2012)

2 голосов
/ 14 сентября 2011

PER Oracle Примечания к выпуску 11g ODP, эта ошибка может быть вызвана следующим:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG=NA <--- This NA does in fact cause this error if set to NA.

Вы можете попробовать DELETING ключ, если он не нужен, или установить для него действительное значение NLS_LANG для вашей локали.

Для нас мы установили AMERICAN_AMERICA.WE8MSWIN1252.

1 голос
/ 14 января 2010

В конце концов все это было решено путем установки клиентских компонентов ODAC 11 (загруженных с веб-сайта Oracle ). Я думаю, что система запуталась, потому что мы скопировали библиотеки ODAC вместо полной установки клиента. ODP.NET ожидает клиента Oracle 11 и не знает, где найти Oracle Home.

Примечание: если вы устанавливаете компоненты ODAC с использованием развертывания xCopy, не не устанавливает их в существующий каталог Oracle Home (например, c: \ oracle \ ora92 для клиента 9i). Это приводит к ошибке «Поставщик не совместим с версией клиента Oracle».

1 голос
/ 19 ноября 2009

Клиент Oracle (ORACLE_HOME \ bin \ ora * .dll) ищет файл с именем "oracle.key" в том же каталоге. Этот файл содержит имя раздела реестра, который принадлежит этой установке клиента Oracle. (например, "Программное обеспечение \ ORACLE \ HOME3") НТН Andreas

...