当前位置: 首页 > 知识库问答 >
问题:

如何使用TNS alias with Entity Framework 6连接到Oracle DB?

爱繁
2023-03-14

在我的设置中,我有一个。NET应用程序,使用Visual Studio 2015构建,尝试使用实体框架6访问Oracle 12c数据库上的数据。

我是这样做的:

  • 我在oracle学习了一个教程。com介绍如何使用nuget安装Oracle官方ODP。NET管理实体框架驱动程序及其依赖项
  • 我确保tnsnames。ora和sqlnet。可以找到ora。(正确配置了环境变量TNS\u ADMIN)
  • 我为oracle驱动程序启用了跟踪日志记录,以查看此处实际发生的情况
  • 我创建了一个映射某些实体的EDMX文件(这已经需要下面描述的解决方法

下面是我的应用程序。配置如下(引入换行符以提高可读性):

  <oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="TraceLevel" value="7" />
        <setting name="TraceOption" value="0" />
        <setting name="TraceFileLocation" value="C:\Temp" />
        <setting name="TNS_ADMIN" value="c:\Temp\tns" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="MyModel"  
         connectionString="metadata=res://*/UDBModel.csdl|res://*/UDBModel.ssdl|res://*/UDBModel.msl;
                           provider=Oracle.ManagedDataAccess.Client;
                           provider connection string=&quot;User Id=*****;Password=*****;Data Source=MYDATASOURCE.WORLD;&quot;" 
         providerName="System.Data.EntityClient" />

尝试访问数据库时失败,出现异常:

“ORA-12533:网络会话:Syntaxfehler bei verbindungstransortadrese”

根据oracle文档转换为

“ORA-12533:TNS:非法地址参数”

跟踪日志显示tnsnames。ora得到正确解决。

当使用IP地址和端口而不是TNS名称时,连接工作正常。但正如tnsnames所言。ora由我们公司的数据库管理员管理,不能使用其IP地址寻址服务器。

我还应该注意到,较旧的驱动程序(例如Oracle.DataAccess.dll)使用此设置访问数据库时没有问题。

编辑:这是tnsnames。我现在使用的ora文件:

MYDATASOURCE.WORLD = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
    (ADDRESS = (PROTOCOL = IPC)(KEY = MYDATASOURCE))
    (ADDRESS = (COMMUNITY = TCP.world)(PROTOCOL = TCP)(Host = myds.example.com)(Port = 1530)))
    (CONNECT_DATA = (SID = MYDATASOURCE))
  )

我到底做错了什么?

注:也有类似的问题。然而,在这种情况下有帮助的解决方案在这里没有帮助,在那里遇到的异常与这里遇到的不同:

  • 打开Oracle OleDb连接成功,而托管驱动程序连接失败

共有2个答案

汪鸿志
2023-03-14

我假设ODP. NET托管驱动程序没有找到您的tnsnames.ora文件。ODP. NET托管驱动程序使用此顺序来解析别名:

  1. 数据源别名,位于

请参见数据提供程序。NET开发人员指南

正如您看到的ODP。NET托管驱动程序不读取环境变量以确定TNS\U ADMIN的值。检查您的。NET配置文件(即,machine.configweb.configuser.config

顺便说一句,您可以运行set NLS\u LANG=AMERICAN\u GERMANY来获取英文错误消息。您也可以在注册表中的以下位置进行设置:HKLM\SOFTWARE\ORACLE\KEY\u%ORACLE\u HOME\u NAME%\NLS\u LANG

傅阿苏
2023-03-14

原因:指定了一组非法的协议适配器参数。在某些情况下,当无法连接到协议传输时,会返回此错误
操作:验证是否可以使用指定的协议到达目标。检查TNSNAMES地址部分中的参数。奥拉。您的平台的Oracle操作系统特定文档中可以找到合法的地址参数格式。如果未正确配置或名称拼写错误,则在传输层解析名称的协议(如DECnet对象名称)容易发生此错误。

社区是tnsnames中不受支持的网络参数。Oracle版本10g之后的ora。因此,删除此参数并仅保留(协议=tcp),这应该可以修复。另外,删除第一个为Oracle侦听器指定的地址参数。ora文件。

不支持的参数

 类似资料:
  • 问题内容: 我正在使用Weblogic,Ejb3.0。Java 1.6 我需要通过Java代码访问Active Directory。我读了几种方法(Kerberos,LDAP) 有人可以建议我这样做的舒适​​方式吗?在哪里可以找到一些完整的代码示例, 谢谢,雷。 问题答案: 这是一个简单的代码,用于在W2K3上的JNDI中进行身份验证并进行LDAP搜索:

  • 问题内容: 我想将无头铬用于使用selenium的自动化测试。(https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md) 我确实已经在9222上运行了无头版本。因此,如果我打开http://10.252.100.33:9222/json/,我会得到 下一步,我想将selenium连接到无头铬上。但是当我尝试

  • 问题内容: 我想将无头铬用于使用硒的自动化测试。(https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md) 我确实已经在9222上运行了无头版本。因此,如果我打开http://10.252.100.33:9222/json/,我会得到 下一步,我想将硒连接到无头铬上。但是当我尝试 我确实得到以下注销 问题是:

  • 这是我的: 和Dockerfile goparser: 连接MongoDB需要使用哪个地址?

  • JDK 1.8.0_66 域模式 专用远程处理套接字 null 调试[org.jboss.remoting.Remote.connection](默认I/O-5)JBREM000200:远程连接失败:java.io.ioException:XNIO000804:收到无效消息长度为1195725856 我想在Windows客户端上使用VisualVM进行连接,所以我使用了Wildfly jconso

  • 问题内容: 文件包含和及其说明(+ )。 是否可以依靠上述文件建立连接?(仅提供数据库名称即可): 为了找到该文件,我必须知道默认的Oracle主目录,我需要在Windows注册表中检入然后具有所有文件,然后检查哪个文件首先出现在上。有没有办法在客户端计算机上自动找到此文件? 问题答案: 我什至不知道可以在瘦驱动程序中使用tnsnames,但是显然它是在版本10中添加的: http://docs.

  • 问题内容: 我们知道不建议在Amazon实例外部访问ElastiCache,因此我们仅在Amazon EC2实例内部进行尝试。 我们有一个具有9个节点的ElastiCache Redis集群 。当我们尝试使用常规redis实现连接到它时,它会引发一些Moved错误 根据@Miller尝试了重试策略方法。还尝试过使用不稳定和稳定(可怜的人)实现的RedisCluster。 这些实现均无作用。有什么建

  • 我正在尝试使用连接到。我正在使用和。 我在Gradle中添加了这些依赖项 配置文件如下所示: 应用yml 我得到了以下错误: