尝试使用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
答案 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)它开始工作。疯了!希望这有助于其他人。