Как установить правильный путь к файлу 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, локальный для вашего приложения, попытается получить его с любого клиента, установленного на компьютере.

Другие вопросы по тегам