Почему Oracle.ManagedDataAccess не работает, когда работает Oracle.DataAccess?

Я разрабатываю очень простое приложение, которое собираюсь использовать для устранения неполадок, возникающих у меня на нескольких машинах, но еще до того, как я зашел так далеко, я столкнулся с несколькими проблемами, включая различия в архитектуре процессора и библиотеки баз данных Oracle.

У меня есть сервер базы данных, указанный в tnsnames.ora, находящийся в моем каталоге C:\oracle\11g\network\admin. Если я обращаюсь к этому серверу, я получаю желаемый ответ. Если я запрограммирую свою программу на C# для подключения к этому серверу с помощью следующего кода, используя Oracle.DataAccess.Client, это сработает.

string connectionString = "Data Source=DSDSDS;User Id=UNUNUN;Password=PWPWPW;";
DataTable dataTable = new DataTable();

using (var connection = new OracleConnection(connectionString)) {
    connection.Open();
    using (var command = new OracleCommand()) {
        command.Connection = connection;
        command.CommandText = sql;
        command.CommandType = CommandType.Text;
        using (var oda = new OracleDataAdapter(command)) {
            oda.Fill(dataTable);
        }
    }
}

Однако Oracle.DataAccess зависит от архитектуры системы, в которой он работает. Я видел, что есть еще одна библиотека Oracle.ManagedDataAccess, независимая от архитектуры. Когда я использую эту библиотеку, она больше не может подключиться к серверу. Выбрасывается ORA-12545: Network Transport: Unable to resolve connect hostname.

Почему это так? В чем разница между этими двумя библиотеками, потому что, исходя из того, что я прочитал до сих пор, это не должно быть проблемой.

Дополнительная информация:

  • %ORACLE_HOME% и %TNS_ADMIN% НЕ определены (помните, что tnsping и Oracle.DataAccess работают)
  • PATH определено C:\oracle\11g\BIN.
  • На моей машине есть только один файл tnsnames.ora

Если я перемещу tnsnames.ora в то же место, что и мой .exe-файл, он сработает. Почему Oracle.DataAccess может найти tnsnames.ora в каталоге C:\oracle\11g\network\admin, а Oracle.ManagedAccess не может?


person Jeff    schedule 03.07.2013    source источник
comment
На самом деле у меня та же проблема, независимо от настроек TNS_ADMIN в app.config.   -  person flindeberg    schedule 15.08.2013
comment
Вы решаете это? Вы можете мне объяснить?   -  person Jeterson Miranda Gomes    schedule 19.10.2018


Ответы (8)


Порядок приоритета разрешения имен TNS в ODP.NET, Managed Driver следующий (см. здесь):

  1. псевдоним источника данных в разделе «источники данных» в разделе файла конфигурации .NET.
  2. псевдоним источника данных в файле tnsnames.ora в месте, указанном параметром «TNS_ADMIN» в файле конфигурации .NET.
  3. псевдоним источника данных в файле tnsnames.ora, находящемся в том же каталоге, что и .exe.
  4. псевдоним источника данных в файле tnsnames.ora присутствует в %TNS_ADMIN% (где %TNS_ADMIN% — это параметр переменной среды).
  5. псевдоним источника данных в файле tnsnames.ora, присутствующем в %ORACLE_HOME%\network\admin (где %ORACLE_HOME% — это параметр переменной среды).

Я полагаю, что причина, по которой ваш пример работает с Oracle.DataAccess, но не с Oracle.ManagedDataAccess, заключается в том, что для последнего не поддерживается конфигурация на основе реестра Windows (см. documentation) - установка ODP.NET задает ключ реестра ORACLE_HOME (HLKM\SOFTWARE\Oracle\Key_NAME\ORACLE_HOME), который распознается только неуправляемой частью.

person metalheart    schedule 18.11.2013
comment
Хорошо, это, конечно, немного проясняет ситуацию. Однако моей последней проблемой был раздел конфигурации Unrecognized oracle.manageddataaccess.client. Похоже, что ‹configSections›‹section name=oracle.manageddataaccess.client type=OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess /›‹/configSections› также необходим. - person Jeff; 27.11.2013
comment
Он определенно работает без него (проверено на десятках установок как на рабочем столе, так и в Интернете). Однако, если вы используете это, убедитесь, что подпись сборки (номер версии, открытый ключ и т. д.) в configSections/section@type точно соответствует используемой вами Oracle.ManagedDataAccess.dll. - person metalheart; 28.11.2013
comment
отличное объяснение спасибо. В производственной среде я просто добавил ключ HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET.Managed\4.121.2.0 и добавил строковое значение TNS_ADMIN, указывающее на tnsnames.ora - person Gandarez; 16.08.2017
comment
Поскольку в моей строке подключения используется providerName="Oracle.ManagedDataAccess.Client, мне пришлось скопировать файлы клиента из моего локального C:\oracle\product\12.2.0\dbhome_1\ODP.NET\managed в серверную установку оракула C:\ORACLE\product\11.2.0\client_2\ODP.NET, у которой не было управляемого доступа к данным. Затем на целевом сервере мне пришлось запустить C:\oracle\product\12.2.0\dbhome_1\ODP.NET\managed\x86\configure.bat. TNS_ADMIN был установлен как системная переменная среды. Теперь IIS на целевом сервере правильно обслуживает веб-приложение. - person Junior Mayhé; 20.12.2017
comment
ПРИМЕЧАНИЕ. Для параметра TNS_ADMIN в файле конфигурации <setting name="TNS_ADMIN" value="tns_file_location"/> требуется Oracle.ManagedDataAccess версии 19.3 или выше. Это не работает в 18.3 или 18.6 (не уверен насчет других более низких версий). Я использую Oracle 12c, так что это тоже может быть в игре. - person Hari; 25.08.2020

Попробуйте добавить путь к tnsnames.ora в файл конфигурации:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <oracle.manageddataaccess.client>
    <version number="4.112.3.60">
      <settings>
        <setting name="TNS_ADMIN" value="C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>
</configuration>
person kolbasov    schedule 06.08.2013
comment
Если TNS_ADMIN имеет правильное значение, проблема может заключаться в номере версии. Попробуйте использовать ‹номер версии=*› - person kolbasov; 15.08.2013
comment
Я делаю это. Было бы прекрасно, если бы программно можно было увидеть как используемые tnsnames, так и sqlnet ;) Я использую производственную версию 121.1.0, выпущенную пару дней назад. Но все равно спасибо! :) - person flindeberg; 15.08.2013
comment
Я попробовал это, но безуспешно. Я изменил путь к C:\oracle\11g\network\admin\ в соответствии с моей настройкой, но получаю следующее: в Oracle.ManagedDataAccess.dll произошло первое случайное исключение типа System.TypeInitializationException. System.TypeInitializationException: Инициализатор типа для 'OracleInternal.Common.ProviderConfig' возникло исключение. ---› System.Configuration.ConfigurationErrorsException: не удалось инициализировать систему конфигурации ---› System.Configuration.ConfigurationErrorsException: нераспознанный раздел конфигурации oracle.manageddataaccess.client. - person Jeff; 26.08.2013
comment
Приведенная выше настройка, наконец, устранила мою проблему в проекте С# после установки нового клиента Oracle. Спасибо. - person Rogério Silva; 17.11.2017
comment
Я предполагаю, что это app.config? любое предложение о том, как изменить его по сравнению с тестовой средой? - person Ryan The Leach; 26.07.2021

Как только я нашел, какой формат он искал в строке подключения, он отлично работал с Oracle.ManagedDataAccess. Без необходимости возиться с чем-то отдельно.

DATA SOURCE=DSDSDS:1521/ORCL;
person Underground    schedule 30.09.2015

У меня была аналогичная проблема...... Чтобы решить эту проблему, я удалил ODP. Net и переустановите в тот же каталог, что и сервер oracle...... с параметром сервера вы заметите, что большинство продуктов уже установлены (при установке базы данных 12c), поэтому просто выберите другие функции и, наконец, завершите установку. ...

Обратите внимание, что этот обходной путь работает только в том случае, если вы установили 12c на тот же компьютер, то есть на свой ноутбук............

Если ваша база данных расположена на сервере, отличном от вашего ноутбука, выберите вариант клиента, а не сервер, а затем включите TNS_ADMIN в свой app.config и не забудьте указать версию...

поскольку моя установка находится на моем ноутбуке, мой App.config выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
</configuration>


 /////////the below code is a sample from oracle company////////////////


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Oracle.ManagedDataAccess.Client;

///copy these lines in a button click event 
    string constr = "User Id=system; Password=manager; Data Source=orcl;";
// Click here and then press F9 to insert a breakpoint
        DbProviderFactory factory =
    DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client");
            using (DbConnection conn = factory.CreateConnection())
            {
                conn.ConnectionString = constr;
                try
                {
                    conn.Open();
                    OracleCommand cmd = (OracleCommand)factory.CreateCommand();
                    cmd.Connection = (OracleConnection)conn;

//to gain access to ROWIDs of the table
//cmd.AddRowid = true;
                    cmd.CommandText = "select * from all_users";

                    OracleDataReader reader = cmd.ExecuteReader();

                    int visFC = reader.VisibleFieldCount; //Results in 2
                    int hidFC = reader.HiddenFieldCount;  // Results in 1

                    MessageBox.Show(" Visible field count: " + visFC);

                    MessageBox.Show(" Hidden field count: " + hidFC);


                    reader.Dispose();
                    cmd.Dispose();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                      MessageBox.Show(ex.StackTrace);
                }
            }
person Siddiqui    schedule 22.03.2014
comment
Я ожидал, что в конфигурации будет узел, на который вы ссылались в своем ответе? - person Ryan The Leach; 26.07.2021

В моем случае все сказанное выше было в порядке, но я все еще получаю ORA-12545: Network Transport: Unable to resolve connect hostname

Я попытался пропинговать машину Oracle и обнаружил, что не вижу ее, и добавил ее в файл hosts. Затем я получил еще одно сообщение об ошибке ORA-12541: TNS:no listener. После расследования я понял, что пингование одного и того же имени хоста с разных машин получает разные IP-адреса (не знаю почему), и я изменил IP-адрес в своем файле хоста, что решило проблему на 100%.

Я потрудился написать свой опыт, поскольку он кажется очевидным, но, хотя я был уверен, что проблема в вышеуказанных настройках, я совершенно забыл проверить, действительно ли я вижу там удаленную машину БД. Имейте это в виду, когда у вас нет идей, что происходит.....

Эти ссылки мне очень помогли:

http://www.moreajays.com/2013/03/ora-12545-connect-failed-because-target.html http://www.orafaq.com/wiki/ORA-12541

person ppenchev    schedule 18.02.2019

«Немного» опоздал на вечеринку, но реальный ответ на этот вопрос - если вы используете Oracle.ManagedDataAccess поставщика ODP.NET, вам следует забыть о таких вещах, как network\admin, Oracle client, Oracle_Home и т. д.

Вот что вам нужно

  1. Загрузите и установите Инструменты разработчика Oracle для VS или ODAC. Примечание. Средства разработки установят ODAC за вас. Это создаст относительно небольшую установку под C:\Program Files (x86). С полными инструментами разработки, менее 60 МБ
  2. В вашем проекте вы установите пакет Nuget с соответствующей версией ODP.net (Oracle.ManagedDataAccess.dll), на которую вы будете ссылаться
  3. На данный момент у вас есть 2 варианта подключения.

    • а) В строке подключения задайте datasource в следующем формате

      DataSource=ServerName:Port/SID . . . or DataSource=IP:Port/SID . . .

    • #P5# <блочная цитата> #P6# #P7#

Подводя итог: с управляемым нет необходимости в тяжелом Oracle Client, Oracle_home или знании глубины папок установки Oracle. Все можно сделать в структурах вашего приложения .net.

person T.S.    schedule 18.04.2019

Я получил такое же сообщение об ошибке. Чтобы решить эту проблему, я просто заменил сборку Oracle.ManagedDataAccess более старой сборкой Oracle.DataAccess. Это решение может не работать, если вам нужны новые функции, обнаруженные в новой сборке. В моем случае у меня гораздо больше проблем с более высоким приоритетом, чем попытка настроить новую сборку Oracle.

person Coleman    schedule 12.06.2015

person    schedule
comment
Где я должен разместить параметр Connection Timeout внутри этого длинного манстера? - person Jenna Leaf; 30.06.2017
comment
Все разрешенные атрибуты разделены точкой с запятой. Атрибут источника данных делает его похожим на двоюродного брата It ! В документах Oracle есть полный список атрибутов (включая время ожидания подключения, которое вы можете просто добавить в конце после последней точки с запятой внутри двойных кавычек): docs.oracle.com/cd/B13789_01/win.101/b10117/features001.htm - person Valid; 01.07.2017