Открытие соединения Oracle OleDb успешно, в то время как соединение управляемого драйвера не удается

Из C# я подключаюсь к Oracle, используя OleDb, делая следующее:

String connectionString = "Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=x;Password=y;Data Source=z";

var connection = new System.Data.OleDbConnection(connectionString);
connection.Open();

Это отлично работает.

Из того же процесса я пытаюсь подключиться с помощью управляемого драйвера, выполнив следующие действия:

String connectionString = "USER ID=x;PASSWORD=y;DATA SOURCE=z";

var connection = new Oracle.ManagedDataAccess.Client.OracleConnection(connectionString);
connection.Open();

Это терпит неудачу со следующей ошибкой:

Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-12154: TNS:could not resolve the connect identifier specified ---> OracleInternal.Network.NetworkException (0x00002F7A): ORA-12154: TNS:could not resolve the connect identifier specified
   at OracleInternal.Network.AddressResolution..ctor(String TNSAlias, String instanceName)
   at OracleInternal.Network.OracleCommunication.DoConnect(String tnsDescriptor)
   at OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(ConnectionString cs, Boolean bOpenEndUserSession, String instanceName)

Server stack trace: 
   at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)
   at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)
   at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword)
   at Oracle.ManagedDataAccess.Client.OracleConnection.Open()

Я получал подобные ошибки в прошлом, когда была проблема с tnsnames, но у меня никогда не было ситуации, когда OleDb работает, когда управляемый драйвер не работает.

Я дважды проверил, и пользователь, пароль и источник данных идентичны в двух строках подключения.

2 ответа

Решение

Управляемый драйвер ODP.NET использует другой способ поиска tnsnames.oraсоответственно sqlnet.ora чем делает OraOLEDB.

Например, OraOLEDB читает реестр для TNS_ADMIN значение, тогда как ODP.NET Управляемый драйвер нет. См. Определение местоположения соответствующего файла tnsnames.ora для получения дополнительной информации.

Одним из решений является установка переменной среды TNS_ADMIN с именем папки где tnsnames.ora а также sqlnet.ora файлы находятся. Насколько я знаю, переменные окружения имеют приоритет (почти) над всеми остальными настройками как в ODP.NET Managed driver, так и в OraOLEDB.

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

static string constr = @"Data Source=(DESCRIPTION=
         (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=yourhostname )(PORT=1521)))
         (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));
        User Id=system ;Password=yourpasswrd"; 

это ошибка ORA-12154: TNS: не удалось разрешить указанный идентификатор подключения?

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