По старым причинам наше приложение .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 остается зарегистрированным.
Это приводит к некоторому интересному/странному поведению, что я не могу объяснить:
- если «ODP.NET из 11.2.0.3.0» части приложения используется первым, как провайдеры могут подключиться, имея в виду «OLEDB от 11.2.0.1.0» использует tnsnames.ora из дома _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 не указан.
Как один поставщик влияет на другого?