Как установить правильный путь к файлу TNSNAMES в приложении C#?
Вот моя проблема: у меня есть программа на C#, которая использует ODP.NET DLL: oci.dll, ociw32.dll, Oracle.DataAccess.dll, orannzsbb11.dll, oraocci11.dll, oraociicus11.dll, OraOps11w.dll.
У меня есть 2 компьютера. Первый с установленным пакетом ODAC, а второй без этого пакета. Но у меня есть все необходимые DLL в моем каталоге EXE, поэтому ODAC не проблема (я думаю). Разница между этими компьютерами заключается в пути к файлу TNSNAMES. Первый: C:\app\OraHome_1\Network\admin\ Второй: C:\Oracle\product\11.2.0\client_1\network\admin
И на первом процессоре программа работает нормально. Но на втором с той же строкой соединения не открывать соединение (ORA-12154). И с помощью SQL Plus я могу подключиться на обоих компьютерах.
Итак, как я могу показать моей программе правильный путь к TNSNAMES?
3 ответа
Вы можете установить TNS_ADMIN
переменная окружения программно. Смотрите эту страницу шаг за шагом. То есть если вы хотите перейти на конкретный TNS_NAMES.ORA
файл. Клиент Oracle все еще должен быть установлен на клиентском компьютере.
Из ConnectionStrings - без использования TNS:
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;
РЕДАКТИРОВАТЬ: добавлен 3-й вариант
Пожалуйста, посмотрите этот вопрос, который может помочь вам найти текущее местоположение клиента TNS_NAMES.ORA
файл - который вы можете открыть и изменить, если хотите (добавьте свое собственное соединение, если оно не существует)
Вам не нужно заботиться о пути к вашему файлу TNSNames: он будет автоматически обнаружен самой библиотекой... как только он будет установлен. Это ключевой момент: распространения dll в вашем проекте недостаточно. Вам нужно установить ODP.Net на компьютере, который должен его использовать: на самом деле при установке просто создайте несколько записей в реестре, и один из них будет указывать на нужный каталог оракула (в котором библиотека может при необходимости узнать имена tns).
Morover, как кто-то указал, вам не нужен файл tnsnams вообще. Вы можете написать все необходимое внутри строки подключения. Вот что я использую в своей среде:
Data Source= (DESCRIPTION =
(ENABLE = BROKEN)
(ADDRESS_LIST =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(Host =por10srv-a)(Port = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = por10.gruppo.autostrade.it)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 10)
(DELAY = 3)
)
)
);User ID=npa_collaudo;Password=npa_collaudo;
Вам не нужно устанавливать ODP.NET (или, если уж на то пошло, Oracle Client), так как у вас, похоже, есть необходимые библиотеки DLL для локального распространяемого встроенного клиента Oracle. В вашем случае возможно, чтобы файл TNSNAMES.ORA находился в той же папке, что и ваш исполняемый файл, и ваш специализированный "встроенный клиент Oracle" получит его оттуда. В противном случае клиент oracle, локальный для вашего приложения, попытается получить его с любого клиента, установленного на компьютере.