【发布时间】:2016-03-16 08:52:49
【问题描述】:
尝试使用 ODP .NET 连接时出现 ORA-12154 错误
更新:Wernfried 的回答为我解决了这个问题。
创建环境变量 TNS_ADMIN=D:\oracle\product\12.1.0\dbhome_1\network\admin
Sqlplus 从注册表读取 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
【问题讨论】:
-
您的机器上是否配置了多个 Oracle Home?
-
据我所知只有一个。除非通过 nuget 安装 odp .net 创建了另一个。
-
我注意到您通过
sqlplus的连接是使用@localhost/db6完成的。您能否仅使用@db6与sqlplus连接?您是否也尝试过从命令行运行tnsping db6? -
创建环境变量
TNS_ADMIN=D:\oracle\product\12.1.0\dbhome_1\network\admin。 sqlplus 从注册表读取 TNS_ADMIN 但 ODP.NET 托管驱动程序不读取注册表。另请参阅stackoverflow.com/questions/28280883/… -
仅使用 @db6 即可。 tnsping db6 给出 OK(10 毫秒)