尝试使用ODP .NET连接时出现ORA-12154错误

时间:2015-12-10 16:13:41

标签: oracle odp.net

尝试使用ODP .NET进行连接时出现ORA-12154错误

更新:Wernfried的回答为我解决了。

  

创建环境变量   TNS_ADMIN = d:\ ORACLE \产品\ 12.1.0 \ dbhome_1 \网络\管理员

     

Sqlplus从Registry读取TNS_ADMIN,但是ODP.NET托管驱动程序   没有看过注册表。也可以看看:   OdbcConnection returning Chinese Characters as "?"

您可以通过以下方式检查环境变量:

string tns_admin = Environment.GetEnvironmentVariable("TNS_ADMIN")

我并不完全了解他所建议的链接是如何相关的。

原始问题:

尝试使用ODP .NET进行连接时出现ORA-12154错误

代码:

  OracleConnection oracleConnection = new OracleConnection();
  string connectionString = "User Id=redacted;Password=redacted;Data Source=db6";
  oracleConnection.ConnectionString = connectionString;
  oracleConnection.Open();

错误:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Oracle.ManagedDataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifier specified ---> OracleInternal.Network.NetworkException: 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.Network.OracleCommunication.Connect(String 

我的tnsnames.ora:

# tnsnames.ora Network Configuration File: D:\oracle\product\12.1.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

DB6 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = redacted.redacted.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db6)
    )
  )

LISTENER_DB6 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = redacted.redacted.com)(PORT = 1521))


ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

使用sql-plus连接:

C:\Users\Derek.Morin\Documents\Visual Studio 2010\Projects\ScriptCode\Oracle>sqlplus redacted/redacted@localhost/db6

SQL*Plus: Release 12.1.0.1.0 Production on Thu Dec 10 09:10:14 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Last Successful login time: Tue Sep 22 2015 09:41:19 -05:00

Connected to:
Oracle Database 12c Release 12.1.0.1.0 - 64bit Production

3 个答案:

答案 0 :(得分:6)

Wernfried的评论为我解决了这个问题。由于他没有回来发布它作为答案 - 我将以他的评论结束这一点。

创建环境变量

TNS_ADMIN=D:\oracle\product\12.1.0\dbhome_1\network\admin

sqlplus从Registry读取TNS_ADMIN,但ODP.NET托管驱动程序不读取注册表。另见stackoverflow.com/questions/28280883 / ... - Wernfried Domscheit 12月10日&15; 15:16

答案 1 :(得分:2)

我是杰夫的第二次观察。我已经试图解决这个问题几天了,这才是关键。我搜索了有问题的服务器上所有现存的tnsnames.ora个文件,重新命名了%ORACLE_HOME/network/admin中没有的文件,一切都开始工作了!

我最近卸载了32位Oracle驱动程序并重新安装了64位驱动程序......在短时间内,唯一的tnsnames.ora文件是示例文件(在示例子目录中)...也许是糟糕的链接(HAD在注册表中,我一直有TNS_ADMIN环境变量)在那时被伪造了?不确定,但即使变量似乎对某些人有帮助,在这个问题上水也可能非常混乱。

答案 2 :(得分:1)

注意:我在使用ODP.Net的SSRS项目中遇到此问题,在我的情况下,ODP.Net默认我的TNS为" C:\ Program Files(x86)\ Oracle Developer Tools for VS2015 \ network \管理员" (尽管事实上我有一个TNS_ADMIN环境变量用于其他东西。我进入该目录并将示例tnsnames.ora和sqlnet.ora文件重命名为不同的东西(即junk-tnsnames.ora)它开始工作。疯了!希望这有助于其他人。