Подключение к 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);
    ...
Другие вопросы по тегам