ORA-12154无法解析指定的连接标识符

sar*_*ake 17 asp.net oracle

我已切换到64位Windows 7并创建了一个简单的Web应用程序来测试与数据库的连接.我正在使用VS 2010 - 普通的asp.net web项目,我正在从VS中运行该应用程序.

我收到此错误:"ORA-12154无法解析指定的连接标识符"

我还有一个示例控制台应用程序来测试与数据库的连接,它工作正常.

在谷歌搜索之后,我发现很多在线帖子都提到了权限,因此我将我的C:/ Oracle权限设置为我的ASP.net帐户,NETWORK SERVICE,COMPUTER NAME的读/写/执行.这仍然无法解决问题.我检查了我的网络应用程序在我的域\用户名帐户下运行,并且该帐户具有读/写/执行到C:\ Oracle文件夹的权限.

我甚至重新安装了我的VS,以确保它在C:\ Program Files而不是C:\ Program Files(x86)

我的网络应用程序没有看到连接字符串的任何想法?(虽然控制台应用程序确实)不知道我还能做什么.

Ste*_*ell 16

我将假设您正在使用tnsnames.ora文件来指定可用的数据库服务.如果是这样,连接错误通常归结为两件事.

  1. 应用程序找不到您在连接字符串中指定的TNS条目.

  2. 找到了TNS条目,但tnsnames.ora文件中的IP或主机不正确.

扩大数字1(我认为这是你的问题).当您告诉Oracle使用以下内容进行连接时:

sqlplus user/pass@service
Run Code Online (Sandbox Code Playgroud)

该服务在tnsnames.ora文件中定义.如果我尝试连接我的tnsnames.ora中未定义的服务,我会收到你得到的错误:

[sodonnel @ home~] $ sqlplus sodonnel/sodonnel @ nowhere

SQL*Plus: Release 11.2.0.1.0 Production on Mon Oct 31 21:42:15 2011

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

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
Run Code Online (Sandbox Code Playgroud)

所以你需要检查一些事情:

  1. 有没有tnsnames.ora文件 - 我想是的,因为你的控制台可以连接
  2. 该服务的文件中是否有条目 - 我认为控制台连接时也是如此
  3. 应用程序可以找到tnsnames.ora吗?

您的问题可能是第3位 - 应用程序是否以与运行控制台时不同的用户身份运行?

Oracle在TNS_ADMIN环境变量中定义的目录中查找tnsnames.ora文件 - 如果您作为不同的用户运行,那么可能未设置TNS_ADMIN环境变量,因此无法找到该文件?

  • 请注意,它是tnsnames.ora而不是tns_names.ora (2认同)
  • 是否为该用户设置了TNS_ADMIN环境变量?我不是Windows的Unix专家,但我认为你需要确保它是Windows中的'SYSTEM'环境变量,因此它适用于所有用户.(右击我的电脑 - >属性 - >高级系统设置 - >环境变量;然后,确保TNS_ADMIN在系统变量部分定义为指向包含该文件(目录C:\程序\ sodonnel \产品\ 11.2.0我系统上的\ dbhome_1\NETWORK\ADMIN)) (2认同)
  • 还有一个“TNS_ADMIN”字符串值应在注册表中的“HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11ghome1”中定义,该值与环境变量具有相同的路径。 (2认同)

Bur*_*sBA 8

我有一个可在本地计算机上运行的实体框架 Web 应用程序,但在推送到另一个环境时会出现此错误。还有其他可以工作的非实体框架应用程序,并且我能够与 sqlplus 连接。

使用 sysinternals Process Monitor 显示 tns 名称文件未正确加载:

tnsnames.ora 状态 未找到名称

在文档之后,我尝试添加一个部分,给出 tnsnames 文件的位置,如下所示:

<configuration>

  <configSections>
    <section name="oracle.manageddataaccess.client"
      type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  </configSections>
  
  <oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="TNS_ADMIN" value="C:\Oracle\product\12.1.0\client_1\Network\Admin"/>
      </settings>
    </version>
  </oracle.manageddataaccess.client>
  
<configuration>
Run Code Online (Sandbox Code Playgroud)

然而,这立即导致了 500 服务器错误。

进一步调查发现,我与Web应用程序打包的dll版本是4.122.1.0,而机器上安装的Oracle客户端环境是4.121.2.0。如Oracle EntityFramework 包文档中所述

注意:如果您的应用程序是 Web 应用程序,并且上述条目已添加到 web.config 中,并且 machine.config 中也存在“oracle.manageddataaccess.client”的相同配置部分处理程序,但“Version”属性值不同,错误消息“定义了重复的‘oracle.managementdataaccess.client’部分。” 可以在运行时观察到。如果是这样,则必须从 machine.config 中删除 machine.config 中“oracle.manageddataaccess.client”的配置节处理程序条目,以便 Web 应用程序不会遇到此错误。但考虑到计算机上可能有其他应用程序依赖于 machine.config 中的此条目,因此可能需要将此配置节处理程序条目移动到该计算机上依赖于它的所有应用程序的 .NET 配置文件中。

我尝试在 .NET machine.config 中添加单独的版本部分,但没有成功(存在版本 4.121.2.0 的部分,我添加了版本 4.122.1.0 的部分)。从 machine.config 中删除“oracle.manageddataaccess.client”部分后,对 web.config 的上述添加解决了 ORA-12154。

解决方案#1总结:

  1. 从 .NET machine.config 中删除“oracle.manageddataaccess.client”
  2. 在 web.config 中提供 TNS_ADMIN 配置设置,如上所述

解决方案2

在研究这个问题时,我发现 TNS_ADMIN 环境变量未设置。我创建了一个名为 TNS_ADMIN 的新环境变量,并将值设置为“C:\Oracle\product\12.1.0\client_1\Network\Admin”。我删除了 web.config 更改,并从 .NET machine.config 中删除了“oracle.manageddataaccess.client”部分,但仍然收到了 ORA-12154。只有在我重新启动机器后,问题才得到解决。

解决方案#2摘要:

  1. 创建名为 TNS_ADMIN 的新环境变量并将值设置为“C:\Oracle\product\12.1.0\client_1\Network\Admin”
  2. 重启机器

解决方案3

我在注册表中添加了正确版本的条目,这解决了问题:

HKLM\Software\Wow6432Node\Oracle\ODP.NET.Managed\4.121.2.0  
Run Code Online (Sandbox Code Playgroud)

密钥的名称是TNS_ADMIN,它指向包含 tnsnames 文件的文件夹:

C:\Oracle\product\12.1.0\client_1\network 
Run Code Online (Sandbox Code Playgroud)

不是C:\Oracle\product\12.1.0\client_1\network\admin文件夹。


Asi*_*sif 6

我遇到过同样的问题。就我而言,我使用的是使用 AnyCPU 设置构建的 Web 服务。由于 WCF 使用 32 位 Oracle 数据访问组件,因此当我尝试从控制台客户端调用它时,它会引发相同的错误。因此,当我使用基于 x86 的设置编译 WCF 服务时,客户端能够成功从 Web 服务获取数据。

如果您编译为“任何 CPU”并在 x64 平台上运行,那么您将无法加载 32 位 dll(在我们的例子中是 Oracle Data Access 组件),因为我们的应用程序不是在 WOW64 中启动的(Windows 64 上的 Windows32)。因此,为了允许 Oracle Data Access 组件的 32 位依赖性,我使用 x86 平台目标编译了 Web 服务,这为我解决了这个问题

作为替代方案,如果您在计算机上安装了 64 位 ODAC 驱动程序,这也会导致问题消失。


小智 5

可能会有很多问题,但如果您使用的是 oracle 10g,请卸载 oracle 10g,并从注册表中删除该值并安装 oracle 11g。但如果您使用的是 oracle 11g ,请首先检查注册表是否指向正确的 home。有时可能会有多个家,因为您一次又一次地安装 sql Developer。在这种情况下,您可以删除不必要的主注册表值,或者可以将 tns 和 sql.net 文件添加到所有这些主目录中,这可能会解决该问题。我的就是这样解决的。


vap*_*guy 5

有一个类似的问题,只有我的网络应用程序很好,是 SQLPlus 给我带来了连接问题和ORA-12154 could not resolve the connect identifier specified错误。我安装了 11g 和 12 个 Oracle 客户端。我的环境变量都设置为指向我的12实例:

  • ORACLE_HOME = C:\oracle\product\12
  • PATH = C:\oracle\product\12\bin;....
  • TNS_ADMIN = C:\oracle\product\12\network\admin

在 处还需要一个注册表项HKLM\Software\Oracle\KEY_OraClient12Home1,一个TNS_ADMIN与环境变量路径相同的字符串项。

我有一个 tnsnames.oraC:\oracle\product\11\network\adminC:\oracle\product\12\network\admin. 据我所知,我的 Web 应用程序和我使用的 12 SQLPlus 客户端都应该使用所有12版本变量。

我的故障排除步骤:

  • 将上面的所有环境变量从 更改1211
  • 连接 11g 的 SQLPlus(成功了!)
  • 从上面的更改回所有环境变量1112
  • 再次连接 12 的 SQLPlus(成功了!)

所以我真的不知道是什么导致 12 的 SQLPlus 停止连接,但这种重置可能对某人有用,所以我想我会在这里记录它。