【发布时间】:2016-12-16 20:52:59
【问题描述】:
我们的应用程序使用托管的 ODP.NET 代码来调用各种 Oracle 过程。
对于我们的一位使用公共数据库链接并在过程中引用链接表的客户,该调用失败。经过进一步测试,任何通过 ODP.NET 对链接表运行查询的尝试都会失败。
ORA-12154: TNS: 无法解析指定的连接标识符
全栈:
Oracle.ManagedDataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifier specified
at OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, OracleDataReaderImpl& rdrImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, Int64& internalInitialLOBFS, OracleException& exceptionForArrayBindDML, Boolean isDescribeOnly, Boolean isFromEF)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at [APPLICATION CODE]
这很奇怪,因为尝试使用 SQL PLUS 进行相同查询会成功,即使 客户端计算机上没有 TNS 名称或文件。
我们的应用甚至不使用 TNS 名称,它使用明确的连接字符串详细信息。
我们甚至通过 DevArt oracle 驱动程序运行了测试查询,它们也很成功。
就好像专门通过托管 ODP.NET 进行调用使服务器以不同的方式对待数据库链接。
ODP.NET Query (Client Machine A) > (Server A) > Table (Server B) = ERROR
SQL Plus Query (Client Machine A) > (Server A) > Table (Server B) = SUCCESS
DEV ART Query (Client Machine A) > (Server A) > Table (Server B) = SUCCESS
我们现在使用的测试查询是一个简单的 SELECT 语句
有谁知道我们如何让 ODP.NET 像 SQL Plus 一样将这些信息交给服务器来获取?
数据库链接信息:
OWNER: PUBLIC
USERNAME: [FIXED OTHER USER]
【问题讨论】:
-
在服务器 A 上应该有 tnsnames.ora,其中包含服务器 B 上远程数据库的正确服务名称和连接字符串 (ADDRESS=(protocol_address_information)) (CONNECT_DATA= (SERVICE_NAME=service_name))) 检查此服务名称针对步骤 4 中使用的数据库链接的 DDL。触发器
-
从 IDE 成功运行相同的 proc 不会排除服务器 A 上的配置问题吗?
-
ODP.NET 尝试连接服务器 A 时是否会出现 ORA-12154?还是它是执行后出现的错误堆栈的一部分?巨大差距。也许您可以分享完整的错误堆栈。此外,您应该三重检查 ODP.NET 连接字符串。您可能根本没有连接到服务器 A,而是连接到某个测试服务器或服务器 A 上的另一个架构。无论如何,ODP.NET 应该对数据库链接连接没有任何影响。
-
@ChristianShay 它仅在执行引用链接服务器的查询时发生,而不是在连接或执行非链接服务器查询时发生。今天我将尝试获取更多堆栈跟踪
-
添加了错误堆栈
标签: oracle odp.net dblink tnsnames odp.net-managed