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

时间:2011-10-31 18:24:39

标签: 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)

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

15 个答案:

答案 0 :(得分:16)

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

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

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

  3. 扩展数字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吗?
    4. 您的问题可能是第3位 - 应用程序是否以与运行控制台时不同的用户身份运行?

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

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

tnsnames.ora status NAME NOT FOUND

关注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中,但“Version”属性值是不同的,“定义了一个重复的'oracle.manageddataaccess.client'部分的错误消息。”可以在运行时观察到。如果是这样,则必须从machine.config中删除machine.config中“oracle.manageddataaccess.client”的config部分处理程序条目,以使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
  2. 中删除“oracle.manageddataaccess.client”
  3. 如上所述在web.config中提供TNS_ADMIN配置设置
  4. 解决方案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. 解决方案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文件夹。

答案 4 :(得分:1)

请让我重复斯蒂芬所说的,因为我第一次错过了自己。 TNS_ADMIN环境变量和ORACLE_HOME设置为C:\instantclient_11_ 2,th tnsnames.ora文件位于此处。在this link上找到答案。

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

有一个类似的问题,只有我的网络应用程序很好,而且是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停止连接,但这种重置可能对某人有用,所以我想在这里记录它。

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

使用进程监视器并搜索tnsnames.ora文件的名称未找到日志。

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

答案 9 :(得分:0)

在Microsoft支持上使用this link

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

答案 10 :(得分:0)

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

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

进一步详情见:

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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

我的方案是SQL Server 2016 RTM。 32位Oracle 12c Open Client + ODAC最终适用于Visual Studio报表设计器和Integration Services设计器,并且SSIS包通过SQL Server代理(具有32位选项)运行。在定义和测试数据源时,64位在Report Portal中运行正常,但运行报告时总是会出现可怕的“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

II。 ODAC112040Xcopy_32bit.zip

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

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

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

即将tnsnames.ora文件从另一台计算机复制到这些文件夹:*

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

II。 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

II。 ODAC121024Xcopy_x64.zip

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

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

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

即将tnsnames.ora文件从另一台计算机复制到这些文件夹:*

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

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

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

ODAC安装非常棘手且难以理解 - 感谢Dan English为我提供了上述方法(详见上文)。

答案 13 :(得分:0)

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

下的 tnsnames.ora 文件

答案 14 :(得分:0)

如果你的密码包含@,那么你必须改变它,大多数Oracle产品不接受密码中的@字符