Oracle.ManagedDataAccess:TNS:无法解析指定的连接标识符

Posted

技术标签:

【中文标题】Oracle.ManagedDataAccess:TNS:无法解析指定的连接标识符【英文标题】:Oracle.ManagedDataAccess: TNS:could not resolve the connect identifier specified 【发布时间】:2014-06-21 22:32:17 【问题描述】:

我在尝试从新的 ASP.NET MVC 4 应用程序连接到 Oracle 数据库时遇到以下错误:“ORA-12154:TNS:无法解析指定的连接标识符”。我正在使用 Oracle.ManagedDataAccess DLL(版本 4.121.1.0)尝试连接到 Oracle 10g 数据库。事情是这样的 - 我有一个集成测试程序集,它使用这个最小的 App.config 成功连接到数据库:

  <connectionStrings>
    <add name="OracleConnection" connectionString="DATA SOURCE=TNS_NAME;PASSWORD=xxx;PERSIST SECURITY INFO=True;USER ID=xxx" providerName="Oracle.ManagedDataAccess.Client" />
  </connectionStrings>

但是,如果我尝试使用所有疯狂的 Web.config 设置运行我的 Web 应用程序,我会收到错误“ORA-12154: TNS:could not resolve the connect identifier specified”。我究竟做错了什么?为什么我的集成测试程序集的配置如此简单,而 Web.config 如此复杂?这是我的 Web.config 的相关部分(取自 Deploying and Configuring ODP.NET to work without installation with Entity Framework):

自定义配置部分:

<configSections>
    <section name="oracle.manageddataaccess.client"
        type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>

相应的配置部分:

  <oracle.manageddataaccess.client>
    <version number="*">
      <edmMappings>
        <edmMapping dataType="number">
          <add name="bool" precision="1"/>
          <add name="byte" precision="2" />
          <add name="int16" precision="5" />
        </edmMapping>
      </edmMappings>
    </version>
  </oracle.manageddataaccess.client>

自定义system.data节点:

  <system.data>
    <DbProviderFactories>
       Remove in case this is already defined in machine.config 
      <remove invariant="Oracle.DataAccess.Client" />
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client"
             description="Oracle Data Provider for .NET, Managed Driver"
             type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>

EntityFramework 节点:

  <entityFramework>
    <defaultConnectionFactory type="Victoria.Data.OracleConnectionFactory, EntityFramework" />
  </entityFramework>

更新 1:通读 http://docs.oracle.com/cd/E16655_01/win.121/e17732/featConfig.htm#ODPNT8161 后,我尝试将我的 Web.config oracle.manageddataaccess.client 修改为以下内容,它可以工作。但是,让 connectionString 节点引用 TNS 名称以及对同一个 TNS 名称文件的额外引用似乎并不正确。

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="SIEBMATS" descriptor="(DESCRIPTION=(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.yyy.zzz)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = siebmats)))" />
      </dataSources>
      <edmMappings>
        <edmMapping dataType="number">
          <add name="bool" precision="1"/>
          <add name="byte" precision="2" />
          <add name="int16" precision="5" />
        </edmMapping>
      </edmMappings>
    </version>
  </oracle.manageddataaccess.client>

【问题讨论】:

你是64位环境吗? 是的,我正在运行 Windows 7 64 位。我已将我的程序集设置为使用“任何 CPU”构建。 过去我在调试和测试时遇到过问题,但一切正常,因为 VS 是 32 位应用程序,因此调用的是 32 位 Oracle 客户端。我必须安装 64 位 oracle 客户端才能运行该应用程序。您可能会遇到类似的问题。我会检查以确保您的服务器上安装了 64 位 oracle 客户端。 【参考方案1】:

您可以尝试的一件事是使用如下连接字符串: connectionString="数据源=//SERVER:PORT/INSTANCE_NAME;USER=XXX;PASSWORD=XXX"。

这里有用的参考资料: http://www.connectionstrings.com/oracle/ http://docs.oracle.com/cd/E51173_01/win.122/e17732/featConnecting.htm#ODPNT169

在遇到 EF 问题时,这也对我有所帮助: Deploying and Configuring ODP.NET to work without installation with Entity Framework

希望有所帮助。

【讨论】:

我试过你的连接字符串;不应该,第二部分读“USER ID = XXX”而不仅仅是“USER”? (我仍然对侦听器进程有疑问,但我会解决的。)【参考方案2】:

我的问题是 Oracle 驱动程序版本不正确/不完整,安装了 11.2.0。我添加了另一个 12.2.0 版本,没有改变 web.config 中的任何内容,它起到了魅力

【讨论】:

【参考方案3】:

我建议在另一个线程中尝试@kolbasov 提出的解决方案,但问题相同:https://***.com/a/20050462/9390179 它对我有用:

<oracle.manageddataaccess.client>
    <version number="*">
        <settings>
            <setting name="TNS_ADMIN" value="C:\Oracle\product\11.1.0\client_1\network\admin" />
        </settings>
    </version>
</oracle.manageddataaccess.client>

【讨论】:

以上是关于Oracle.ManagedDataAccess:TNS:无法解析指定的连接标识符的主要内容,如果未能解决你的问题,请参考以下文章

Oracle.ManagedDataAccess:TNS:无法解析指定的连接标识符

Oracle.ManagedDataAccess 错误地读取 DST 日期

ManagedDataAccess连数据库

ManagedDataAccess连数据库

C#工具类OracleHelper,基于Oracle.ManagedDataAccess.Client封装

如何使用 Oracle.ManagedDataAccess.EntityFramework 提供程序从不同的架构中选择表?