Подключение к Oracle с использованием исключения Oracle.ManagedDataAccess
Я использую пакет Nuget Oracle.ManagedDataAccess версии 12.2.1100 в своем проекте C# (>.NET 4.0). На моем локальном хосте все работает нормально, но на сервере dev я получаю исключение:
Сообщение об исключении: ORA-12154: TNS: не удалось разрешить указанный идентификатор соединения. Исключение Источник: поставщик данных Oracle для.NET, управляемый драйвер
Теперь я думал, что ManagedDataAcess содержит все, что мне нужно. Я что-то упускаю? Что-то еще мешает пакету? Нужно ли добавить что-то еще?
Примечание: нет <oracle.manageddataaccess.client>
тег в моем Web.config
Код:
<connectionStrings>
<add name="XXX" connectionString="Data Source=XXX;User ID=XXX;Password=XXX" />
</connectionStrings>
РЕДАКТИРОВАТЬ:
Я подтвердил, что переменная TNS_ADMIN установлена в Панели управления, но это не помогло.
Затем я добавил файл tnsnames.ora в папку bin, и он работает, но это не является долгосрочным решением.
3 ответа
Ваша программа не находит tnsnames.ora
(Соотв. sqlnet.ora
) файл. Есть несколько возможностей указать местоположение.
Определите это в конфигурационном файле.NET (
web.config
,machine.config
,application.config
)Установить переменную среды
TNS_ADMIN
копия
tnsnames.ora
,sqlnet.ora
файлы в каталог, где находится ваше приложение.exe.
Пример для файла конфигурации.NET:
<oracle.manageddataaccess.client>
<version number="4.122.*">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\network\admin"/>
</settings>
</version>
</oracle.manageddataaccess.client>
Обратите внимание, что в отличие от других драйверов / поставщиков, управляемый драйвер ODP.NET не читает TNS_ADMIN
установка из реестра.
Возможно, вы не настроили TNS, поэтому такая форма строки соединения не работает. Вам не нужно настраивать TNS, если вы используете другую форму строки подключения, например:
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=MyIpOrServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MySID)));User Id=MyUsername;Password=MyPassword;
Заменить все My*
заполнители с вашими ценностями.
Мы видели подобные проблемы в одной из наших сред, и следующие решили нашу проблему;
Когда Oracle Data Provider для.NET установлен на веб-сервере и в зависимости от того, что вы выбрали во время установки, он записывает записи в файл machine.config (находится по адресу C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\ в зависимости от версии фреймворка). Кажется, что разные версии установщика ODP.NET делают разные вещи с machine.config (некоторые из наших серверов не имеют номера версии, указанного в machine.config, а другие имеют определенный номер версии, указанный для клиента, управляемого Oracle)
В зависимости от установленной версии, он добавляет пару строк, например:
...
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
...
<oracle.manageddataaccess.client>
<version number="4.121.2.0">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\client\product\12.1.0\client_1\network\admin" />
</settings>
</version>
</oracle.manageddataaccess.client>
...
Записи содержат конкретный номер версии, относящийся к версии клиента ODP.NET. Мы создаем наши приложения с версией 4.122.1.0 управляемой клиентской библиотеки (пакет nuget версии 12.2.1100), которая не соответствует 4.121.2.0
Мы изменили вышеуказанные записи, удалив версию библиотеки клиента, управляемой Oracle, из этого тега:
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess" />
И указав '*' для номера версии для этого тега:
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\client\product\12.1.0\client_1\network\admin" />
</settings>
</version>
</oracle.manageddataaccess.client>
Если вам нужны определенные номера версий, убедитесь, что ваш код скомпилирован с теми же номерами версий.
Вы также можете удалить все эти записи из machine.config, если они есть, и указать их в приложениях web.config в зависимости от вашей конфигурации.
Простой способ в моем случае.
Установите переменную среды ORACLE_HOME в Program.cs(класс Entrypoint)
без каких-либо изменений или настроек в app.config
[STAThread]
static int Main()
{
var oracleHome = GetOracleHome(); // Find registry...
Environment.SetEnvironmentVariable("ORACLE_HOME", oracleHome);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
...