Строка подключения в ODP.Net

Первоначально я использовал поставщика oraoledb.oracle для подключения к базе данных Oracle, и было легко создать строку подключения:

Поставщик = OraOLEDB.Oracle; Идентификатор пользователя = myId; Пароль = мой пароль; Источник данных = data.customer.com

и все работает так, как ожидалось, но в настоящее время я переключился на ODP.Net, чтобы избавиться от установки клиента oracle, и я получаю ошибку ORA-12154: TNS:could not resolve the connect identifier specified со следующей строкой подключения:

Источник данных=data.customer.com;ID пользователя=myId;Пароль=myPassword

Так может кто-нибудь сказать мне, где я сделал ошибку?


person ChernikovP    schedule 10.12.2014    source источник
comment
И data.customer.com находится в tnsnames.ora для конкретного дома, через который вы работаете (проверьте биты)?   -  person Patrick Hofman    schedule 10.12.2014
comment
Кроме того, вы используете управляемую ODP.NET или неуправляемую версию?   -  person Patrick Hofman    schedule 10.12.2014
comment
@ Патрик Хофман, да, я использую управляемый ODP.NET и, к сожалению, не смог проверить файл tnsnames.ora, потому что у меня нет доступа к этому серверу. Все, что я знаю, это «data.customer.com».   -  person ChernikovP    schedule 10.12.2014
comment
Управляемый ODP.NET не работает с tnsnames.ora. Это проблема.   -  person Patrick Hofman    schedule 10.12.2014
comment
@ Патрик Хофман, и неуправляемый ODP.NET требует установки клиента Oracle, я прав?   -  person ChernikovP    schedule 10.12.2014
comment
Истинный. Этот поддерживает tnsnames.ora. Но это боль, чтобы заставить его работать.   -  person Patrick Hofman    schedule 10.12.2014
comment
@ Патрик Хофман, большое спасибо за помощь! Думаю, пора поговорить с покупателями=)   -  person ChernikovP    schedule 10.12.2014
comment
Без проблем. Добавил это как ответ, так как комментарии могут быть удалены со временем.   -  person Patrick Hofman    schedule 10.12.2014
comment
Исправление к сказанному выше: ODP.NET, управляемый драйвер ДЕЙСТВИТЕЛЬНО поддерживает TNSNAMES.ORA. Смотрите обсуждение в ответах ниже.   -  person Christian Shay    schedule 12.12.2014
comment
connectionstrings.com/oracle — хорошая ссылка.   -  person vapcguy    schedule 22.06.2016


Ответы (4)


Управляемый ODP.NET работает с tnsnames.ora, но для его работы требуется дополнительная настройка. Это твоя проблема. Вы пытаетесь использовать имя из tnsnames.ora, которое работает только при установке переменной среды TNS_ADMIN или раздела конфигурации в файле machine.config, Web.config или app. конфиг. Другой вариант использования tnsnames.ora — это неуправляемый драйвер ODP.NET, который, на мой взгляд, неудобен в использовании.

Попробуйте использовать имена EZCONNECT, которые поддерживаются как управляемыми, так и неуправляемый драйвер без необходимости в файле tnsnames.ora или любой другой конфигурации.

person Patrick Hofman    schedule 10.12.2014
comment
Это НЕ правда, что управляемый драйвер ODP.NET не работает с TNSNAMES.ORA. Да, но он берется из переменной TNS_ADMIN, которая по умолчанию задается в файле machine.config установщиком (или вы можете установить ее в своем приложении или веб-конфигурации). Вы также можете поместить TNSANAMES.ORA в рабочий каталог исполняемого файла, и если вы еще не установили TNS в своем файле конфигурации, он будет выбран. - person Christian Shay; 11.12.2014
comment
@Chr: вы противоречите своему собственному ответу: stackoverflow.com/a/26672511/993547 - person Patrick Hofman; 11.12.2014
comment
В этом посте, на который вы ссылаетесь, был вопрос о поддержке параметра IFILE внутри TNSNAMES.ORA. Это не говорило, что мы не поддерживаем TNSNAMES.ORA. В нем говорилось, что мы не поддерживаем IFILE внутри TNSNAMES.ORA при использовании ODP.NET, управляемого драйвера. - person Christian Shay; 12.12.2014
comment
@Chr: согласен. Можете ли вы проверить, является ли исправленное сообщение точным? - person Patrick Hofman; 12.12.2014
comment
Нет, это неправильно. Управляемый ODP.NET действительно работает с TNSNAMES.ORA. Вы можете либо указать на него с помощью TNS_ADMIN, либо (если вы не поместите псевдонимы в свою машину/app.config, что будет иметь значение) вы можете поместить его в рабочий каталог исполняемого файла. - person Christian Shay; 12.12.2014
comment
@Chr: так что вам нужно удалить файл tnsnames.ora в exe-файле? - person Patrick Hofman; 12.12.2014
comment
Да, в рабочем каталоге exe или в месте, указанном TNS_ADMIN (которое можно установить в app/web/machine.config.). По умолчанию установщик установит для вас TNS_ADMIN в файле machine.config и укажет на ‹HOME›/NETWORK/ADMIN дома, где был установлен ODP.NET. - person Christian Shay; 12.12.2014
comment
@ChristianShay: Но управляемый драйвер - это просто почтовый индекс, он не установлен. Какой home/network/admin тогда нужен? - person Patrick Hofman; 12.12.2014
comment
Это правда, если вы просто загружаете саму dll, тогда да, вам нужно выполнить настройку самостоятельно, включая установку значения TNS_ADMIN туда, где вы размещаете TNSNAMES.ORA, перемещение TNSNAMES.ORA в рабочий каталог или настройку псевдонимов подключения в вашем файл конфигурации. Однако, если вы не находитесь в сценарии развертывания, вы можете загрузить версию установщика, и это сделает для вас больше. Вам придется использовать установщик, если вы работаете во время разработки с Entity Framework Designers. oracle.com/technetwork/topics/dotnet/downloads/index.html< /а> - person Christian Shay; 12.12.2014
comment
Пожалуйста, исправьте свой ответ, чтобы удалить Управляемый ODP.NET не работает с tnsnames.ora. - person Christian Shay; 12.12.2014
comment
@Chr: Я сделал. Пожалуйста, просмотрите сообщение. Не стесняйтесь редактировать его, чтобы улучшить его. - person Patrick Hofman; 13.12.2014

Лично я предпочитаю не зависеть от определенного tnsnames.ora на машине. Используя более длинную строку подключения (см. пример ниже), вы можете развернуть свою программу, не думая о tnsnames.ora, которого может не быть в целевой системе.

Пример использования ODP.NET без tnsnames.ora:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));
User Id=myUsername;Password=myPassword;

См. также .

person ialekseev    schedule 10.12.2014
comment
Использование формата конфигурации EZ проще, чем если вы предпочитаете встраивать все детали в строку подключения. Например: Data Source=MyHost:MyPort/MyOracleService;ID пользователя=myUsername;Password=myPassword; - person Christian Shay; 11.12.2014

Недавно я пошел по этому пути, но столкнулся с проблемами 32x/64x при попытке запустить веб-сайт с использованием ODP.net.

Вот моя рабочая строка подключения: Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ip/server)(PORT=port)))(CONNECT_DATA=(SERVER=DEDICATED)(SID=service_id)));User Id=user_id;Password=p_word"

РЕДАКТИРОВАТЬ: Черт, @ialekseev слишком быстр..

person kevvy_dawg    schedule 10.12.2014

Скопируйте TNSNAMES.ORA, содержащий data.customer.com, в каталог {ODP.NET ORACLE HOME}/NETWORK/ADMIN, если вы использовали установщик Oracle для установки ODP.NET, и он должен работать, потому что установщик устанавливает переменную TNS_ADMIN в machine.config (для управляемого ODP.NET).

Вы также можете использовать синтаксис строки подключения SQLNET EZ Config, если хотите вообще обойтись без записи TNSNAMES.ORA.

Например: Data Source=MyHost:MyPort/MyOracleService;ID пользователя=myUsername;Password=myPassword;

person Christian Shay    schedule 11.12.2014
comment
Также можно просто создать переменную окружения TNS_ADMIN и создать строку реестра со значением TNS_ADMIN в HKLM\Software\Oracle\KEY_OraClient11ghome1 со значением пути к папке, в которой вы будете хранить tnsnames.ora, которое должно быть {ORACLE HOME}/NETWORK/ADMIN. как указано. - person vapcguy; 22.06.2016
comment
@vapcguy Оказывается, оригинальный постер использует Managed ODP.NET, который не поддерживает ни записи реестра, ни переменные среды. - person Christian Shay; 28.06.2016
comment
Хм, это то, что я тоже использую, и мне пришлось реализовать, включая переменные среды, чтобы заставить мою работу работать. Без них получались ошибки, и именно поэтому я упомянул об этом. Возможно, вы захотите еще раз перечитать принятый ответ, потому что в нем даже указано, где нужно найти TNS_ADMIN - либо machine.config, как вы утверждаете (хотя я не могу за это ручаться), но также могут быть переменные среды и реестр (Oracle нужна запись в реестре, а не .NET) или web.config (что я тоже не пробовал). - person vapcguy; 28.06.2016