2015-01-22 5 views
1

По старым причинам наше приложение .NET 4.0 в настоящее время использует как поставщиков Oracle OLEDB, так и ODP.NET для подключения к экземпляру Oracle. Мы стандартизировали клиент Oracle 11.2.0.3.0. Оба поставщика данных работают, как ожидается, когда один клиент Oracle установлен.ODP.NET и OLEDB с несколькими домами Oracle

Проблемы были обнаружены на компьютерах, на которых уже установлен клиент 11.2.0.1.0. Для нашего приложения был установлен второй клиент, 11.2.0.3.0. Установка выглядит следующим образом:

c:\oracle 
    \product 
     \11.2.0 
     \client_1  <-- (existing) 11.2.0.1.0 
      \bin   <-- OraOLEDB11.dll registered here 
      \network 
      \admin  <-- TNSNAMES does NOT contain ORACLESVR 
     \client_2  <-- (new) 11.2.0.3.0 
      \bin 
      \network 
      \admin  <-- TNSNAMES contains ORACLESVR 

Из-за bug в 11.2.0.3.0 установки, драйвер OLEDB не зарегистрирован во втором доме, то есть водитель 11.2.0.1.0 остается зарегистрированным.

Это приводит к некоторому интересному/странному поведению, что я не могу объяснить:

  1. если «ODP.NET из 11.2.0.3.0» части приложения используется первым, как провайдеры могут подключиться, имея в виду «OLEDB от 11.2.0.1.0» использует tnsnames.ora из дома _2.
  2. Если вначале используется приложение «OLEDB от 11.2.0.1.0», ни один из провайдеров не будет подключаться, предположительно, потому что оба используют tnsnames.ora из дома _1.

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

Чтобы обойти эту проблему, мы можем сделать что-то вроде: зарегистрировать поставщик 11.2.0.3.0 OLEDB, добавьте переменные среды TNS_ADMIN, или добавить ORACLESVR в tnsnames.ora из _1 дома.

Однако, я хочу знать ПОЧЕМУ Это происходит? Я не могу найти в документации Oracle для каждого провайдера, как файл tnsnames.ora находится, когда присутствуют два клиента, а TNS_ADMIN не указан.

Как один поставщик влияет на другого?

ответ

1

OLEDB основан на Microsoft COM, и каждая зарегистрированная DLL должна иметь четкое имя. Таким образом, вы не можете зарегистрировать OraOLEDB11.dll несколько раз из разных мест, то есть OLEDB можно установить только один раз (для каждой архитектуры).

Если вы пытаетесь установить несколько OLEDB на одной машине, Oracle Installer создает беспорядок. Всегда сложно установить несколько клиентов Oracle.

В этих местах поиска находится tnsnames.ora, соотв.sqlnet.ora:

  1. путь тока (связанный с управлением клиентским приложением)
  2. переменной среды TNS_ADMIN определены для сессии
  3. переменной окружения TNS_ADMIN, определенной для системы
  4. реестра Windows Key HKLM\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN (для x64) или HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN (для x86)
  5. %ORACLE_HOME%\network\admin

Я получил этот список от Oracle Metalink 111942.1 (ссылка на Oracle 9.x и Windows NT/2000)

Я не знаю, применяется ли это для каждого отдельного поставщика/драйвера Oracle, который вы можете использовать. Когда вы отслеживаете свое приложение с помощью Process Monitor, вы можете получить другой заказ.

Смежные вопросы