【问题标题】:Opening Oracle OleDb connection succeeds, while managed driver connection fails打开 Oracle OleDb 连接成功,而托管驱动程序连接失败
【发布时间】:2016-04-13 17:09:11
【问题描述】:

我使用 OleDb 从 C# 连接到 Oracle,执行以下操作:

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 在托管驱动程序不工作时工作的情况。

我已经仔细检查了两个连接字符串中的用户、密码和数据源是相同的。

【问题讨论】:

标签: c# .net oracle oracle-manageddataaccess


【解决方案1】:

ODP.NET 托管驱动程序使用不同的方式来查找tnsnames.ora,resp。 sqlnet.ora 而不是 OraOLEDB。

例如,OraOLEDB 会读取注册表中的 TNS_ADMIN 值,而 ODP.NET 托管驱动程序则不会。详情请见Determining locatation of relevant tnsnames.ora file

一种解决方案是设置一个环境变量TNS_ADMIN,其文件夹名称为tnsnames.orasqlnet.ora 文件所在的位置。据我所知,环境变量(几乎)优先于 ODP.NET 托管驱动程序和 OraOLEDB 中的所有其他设置。

【讨论】:

  • 原来是这样。即使 OleDb 可以,ODP 也无法找到 tnsnames。
【解决方案2】:

听起来您的 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"; 

this is error ORA-12154: TNS:could not resolve the connect identifier specified?

【讨论】:

  • 谢谢。这个解决方法让我连接起来(就像 Oracle 的 Easy Connect 格式 - 主机:[端口]/[服务名称])。但实际的问题是,即使 OleDb 可以,ODP 驱动程序也无法找到 tnsnames。
猜你喜欢
  • 2012-11-15
  • 2016-01-07
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多