【问题标题】:ORA-12154 could not resolve the connect identifier specifiedORA-12154 无法解析指定的连接标识符
【发布时间】:2011-12-18 23:12:58
【问题描述】:

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

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

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

在谷歌搜索之后,我发现网上很多帖子都提到了权限,所以我将我的 C:/Oracle 权限设置为我的 ASP.net 帐户、网络服务、计算机名称的读/写/执行。那仍然不能解决问题。我检查了我的 Web 应用程序在我的域\用户名帐户下运行,并且该帐户具有对 C:\Oracle 文件夹的读/写/执行权限。

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

关于为什么我的网络应用看不到连接字符串的任何想法? (而控制台应用程序确实如此) 不知道我还能做什么。

【问题讨论】:

    标签: asp.net oracle


    【解决方案1】:

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

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

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

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

    sqlplus user/pass@service
    

    服务在 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
    

    所以你需要检查几件事:

    1. 是否有 tnsnames.ora 文件 - 我认为是的,因为您的控制台可以连接
    2. 文件中是否有服务条目 - 我认为是的,因为控制台连接
    3. 应用程序能否找到 tnsnames.ora?

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

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

    【讨论】:

    • 请注意,它是 tnsnames.ora 而不是 tns_names.ora
    • @cagcowboy - 非常正确,我已经更正了。我输入的时候它看起来不正确,但它只是没有点击我说它是错误的。
    • 斯蒂芬,谢谢。第 1 点和第 2 点是肯定的。我最初的预感是我的网络应用程序在与控制台应用程序不同的用户下运行,所以我检查并确定,我的网络应用程序以 DOMAIN\USERNAME 身份运行,并且我授予该帐户执行/写入 oracle 文件夹的权限...... tnsnames.ora 在那里,所有条目都正确,但仍然无法从 Web 应用程序解析。
    • 是否为该用户设置了 TNS_ADMIN 环境变量?我比 Windows 更像 Unix 专家,但我认为您需要确保它是 Windows 中的“系统”环境变量,以便所有用户都可以使用它。 (右键单击我的电脑 -> 属性 -> 高级系统设置 -> 环境变量;然后确保在系统变量部分中定义了 TNS_ADMIN 以指向包含文件的目录(C:\app\sodonnel\product\11.2.0 \dbhome_1\NETWORK\ADMIN 在我的系统上))
    • 还有一个TNS_ADMIN字符串值应该在HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11ghome1的注册表中定义,它与环境变量的路径相同。
    【解决方案2】:

    有一个类似的问题,只有我的 web 应用程序很好,是 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的字符串项,与环境变量的路径相同。

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

    我的故障排除步骤:

    • 将上述所有环境变量从 12 更改为 11
    • 与 11g 的 SQLPlus 连接(成功!)
    • 将以上所有环境变量从11改回12
    • 再次连接 12 的 SQLPlus(成功!)

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

    【讨论】:

    • 指向 C:\DevSuiteHome_1 的变量 ORACLE_HOME 对我有用。谢谢!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      如果您在机器上安装了同样导致问题消失的 64 位 ODAC 驱动程序,则作为替代方案。

      【讨论】:

        【解决方案5】:

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

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

        the documentation 之后,我尝试添加一个给出 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>
        

        但是,这导致立即出现 500 服务器错误。

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

        注意:如果您的应用程序是 Web 应用程序,并且上述条目已添加到 web.config 并且“oracle.manageddataaccess.client”的相同配置部分处理程序也存在于 machine.config 中,但“版本”属性值不同,错误消息“定义了重复的 'oracle.manageddataaccess.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  
        

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

        C:\Oracle\product\12.1.0\client_1\network 
        

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

        【讨论】:

          【解决方案6】:

          如果您使用 LDAP,请确保环境变量“TNS_ADMIN”存在并指向包含文件“ldap.ora”的文件夹。

          如果此变量不存在,请创建它并重新启动 Visual Studio。

          【讨论】:

          • 或者确保环境(系统)变量指向您拥有tnsnames.orasqlnet.ora的文件夹
          【解决方案7】:

          我在 Oracle 11 中遇到的另一种令人讨厌的错误类型:tnsnames.ora 中的条目不是从行的第一列开始(' XXX=(...)' 而不是 'XXX=(.. .)') 并与前面的条目一起解析,使其格式错误。

          就像替换的 orr 放错位置的 tnsnames.ora 文件一样,这种类型的问题很容易使用 tnsping 命令行实用程序进行诊断:您将 tnsnames.ora 条目的名称传递给它,它会给出其定义的完整文本.

          【讨论】:

          • 我的数据源别名之前确实有一个空格。您可能只是为我节省了很多时间并重启了几次服务器。
          【解决方案8】:

          请让我重复一下斯蒂芬所说的话,因为我自己第一次错过了它。 TNS_ADMIN 环境变量和ORACLE_HOME 设置为C:\instantclient_11_2 和th tnsnames.ora 文件在那里。在this link找到答案。

          【讨论】:

          • 这对于不同的人来说会有所不同,基于 Oracle 安装(包括他们是否安装了即时客户端,我没有)。我的位置是:ORACLE_HOME = C:\oracle\product\11TNS_ADMIN = C:\oracle\product\11\network\admin。这些将是默认位置(尽管11 可以是您当时命名/正在安装的任何版本)。 Path 变量还必须包含 C:\oracle\product\11\bin
          【解决方案9】:

          此错误(以及 ORA-6413:连接未打开)也可能由应用程序可执行路径中的括号和 10.2.0.1 或更低版本的 oracle 客户端库中的错误引起。

          您应该升级您的 oracle 客户端库或更改可执行路径。

          更多详情见:

          【讨论】:

          • 这为我解决了这个问题;高度赞赏。我在使用 Oracle 10 的 Windows 7(32 位)下运行良好的旧版应用程序遇到问题;但由于链接中讨论的 Oracle“错误”以及默认目录包含“程序文件(x86)”的事实,它无法在 Windows 10 上运行。我只是将安装路径更改为更简单的目录名称 - 问题已解决。
          【解决方案10】:

          如果您的密码中包含@,则必须更改它,大多数Oracle产品不接受密码中的@字符

          【讨论】:

            【解决方案11】:

            使用进程监视器并搜索 tnsnames.ora 文件的 name not found 日志。

            检查您的环境变量。如果无效,则卸载所有 oracle 客户端并重新安装。

            【讨论】:

            • 您不必卸载 Oracle 客户端来更改环境变量,您只需要检查它们并在必要时更新它们。右键单击计算机,选择属性 > 高级系统设置、环境变量。其中一个必须是TNS_ADMIN 并指向C:\oracle\product\11\network\admin,其中需要有一个tnsnames.ora 文件,其中包含一个连接字符串——这就是我认为这篇文章想要表达的意思。
            【解决方案12】:

            我在使用 SSIS 项目的 Visual Studio 2013 中遇到此错误。我设置 Project, Properties, Debugging, Run64BitRuntime = false 然后运行 ​​SSIS 包。但是,当我将包部署到服务器时,我必须将值设置为 true(服务器是 64 位 Windows 2012 / Sql 2014 )。

            我认为这背后的原因是 Visual Studio 是一个 32 位应用程序。

            【讨论】:

              【解决方案13】:

              这是一个老问题,但 Oracle 最新的安装程序没有任何改进,所以我最近发现自己又回到了这个沼泽地,折腾了好几天......

              我的场景是 SQL Server 2016 RTM。 32 位 Oracle 12c Open Client + ODAC 最终在 Visual Studio 报表设计器和集成服务设计器以及通过 SQL Server 代理(带有 32 位选项)运行的 SSIS 包上运行良好。在定义和测试数据源时,64 位报告门户可以正常工作,但运行报告总是会出现可怕的“ORA-12154”错误。

              我的最终解决方案是切换到 EZCONNECT 连接字符串 - 这完全避免了 TNSNAMES 混乱。这是一个详细描述的链接,但基本上只是:host:port/sid

              http://www.oracledistilled.com/oracle-database/oracle-net/using-easy-connect-ezconnect-naming-method-to-connect-to-oracle-databases/

              以防它在未来对任何人有所帮助(或者我再次陷入困境),这是我的 Oracle 安装步骤(完全恐怖):

              安装 Oracle 驱动程序:Oracle Client 12c(32 位)加上 ODAC。

              一个。从http://www.oracle.com/technetwork/database/enterprise-edition/downloads/database12c-win64-download-2297732.htmlhttp://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html下载并解压以下文件):

              我。 winnt_12102_client32.zip

              二。 ODAC112040Xcopy_32bit.zip

              b.运行 winnt_12102_client32\client32\setup.exe。对于安装类型,选择管理员。对于安装位置,输入 C:\Oracle\Oracle12。接受其他默认值。

              c。启动命令提示符“以管理员身份”并将目录 (cd) 更改为您的 ODAC112040Xcopy_32bit 文件夹。

              d。输入命令:install.bat all C:\Oracle\Oracle12 odac

              e。将 tnsnames.ora 文件从另一台机器复制到这些文件夹:*

              我。 C:\Oracle\Oracle12\network\admin *

              二。 C:\Oracle\Oracle12\product\12.1.0\client_1\network\admin *

              安装 Oracle Client 12c (x64) 和 ODAC

              一个。从http://www.oracle.com/technetwork/database/enterprise-edition/downloads/database12c-win64-download-2297732.htmlhttp://www.oracle.com/technetwork/database/windows/downloads/index-090165.html下载并解压以下文件):

              我。 winx64_12102_client.zip

              二。 ODAC121024Xcopy_x64.zip

              b.运行 winx64_12102_client\client\setup.exe。对于安装类型,选择管理员。对于安装位置,输入 C:\Oracle\Oracle12_x64。接受其他默认值。

              c。启动命令提示符“以管理员身份”并将目录 (cd) 更改为 C:\Software\Oracle Client\ODAC121024Xcopy_x64 文件夹。

              d。输入命令:install.bat all C:\Oracle\Oracle12_x64 odac

              e。将 tnsnames.ora 文件从另一台机器复制到这些文件夹:*

              我。 C:\Oracle\Oracle12_x64\network\admin *

              二。 C:\Oracle\Oracle12_x64\product\12.1.0\client_1\network\admin *

              * 如果您使用 EZCONNECT 方法,则不需要这些步骤。

              ODAC 安装既棘手又晦涩 - 感谢 Dan English,他为此提供了方法(上文详述)。

              【讨论】:

                【解决方案14】:

                使用this link.on Microsoft 支持

                我在 oracle 主文件夹上授予 IUSR_MachineName 用户权限,我能够解决问题

                【讨论】:

                • 此链接不再有效。
                【解决方案15】:

                就我而言,此错误的原因是我缺少 client_32\NETWORK\ADMIN

                下的 tnsnames.ora 文件

                【讨论】:

                  【解决方案16】:
                  • 转到控制面板 -> 搜索“环境变量”并单击“编辑您帐户的系统环境变量” 确保它不是“为您的帐户编辑环境变量”

                  • 点击“环境变量”按钮,然后在“系统变量”列表中点击“新建”

                  • 如下填写:

                    • 名称:TNS_ADMIN
                    • 值:[您 PC 上 tns 文件的路径],例如:D:\app[userName]\product\11.2.0\client_1\Network\Admin
                  • 重启你的电脑 [应用更改很重要]

                  【讨论】:

                    猜你喜欢
                    • 2014-11-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-10-06
                    • 2016-11-25
                    相关资源
                    最近更新 更多