如何使用TNS别名与Entity Framework 6连接到Oracle DB?

时间:2016-10-05 09:00:30

标签: .net oracle visual-studio-2015 entity-framework-6 oracle-manageddataaccess

在我的设置中,我使用Visual Studio 2015构建了一个.NET应用程序,尝试使用Entity Framework 6访问Oracle 12c数据库上的数据。

这就是我为此所做的努力:

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

以下是我的App.config的样子(引入了改进可读性的换行符):

  <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" />

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

  

&#34; ORA-12533:Netzwerksession:Syntaxfehler bei Verbindungstransportadresse&#34;

根据the oracle docs转换为

  

&#34; ORA-12533:TNS:非法ADDRESS参数&#34;

跟踪日志显示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))
  )

我在这里做错了什么?

注意:有类似的问题。但是,在这种情况下帮助的解决方案在这里没有帮助,遇到的例外与此处遇到的例外有所不同:

2 个答案:

答案 0 :(得分:2)

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

  1. .NET配置文件中dataSources部分下的<oracle.manageddataaccess.client>部分中的数据源别名。
  2. .NET配置文件中tnsnames.ora指定位置的TNS_ADMIN文件中的数据源别名。位置可以包含绝对或相对目录路径。
  3. tnsnames.ora位于同一目录中的.exe文件中的数据源别名。
  4. 请参阅Data Provider for .NET Developer's Guide

    如您所见,ODP.NET托管驱动程序未读取环境变量以确定TNS_ADMIN的值。检查您的.NET配置文件(例如machine.configweb.configuser.config

    顺便说一句,你可以运行set NLS_LANG=AMERICAN_GERMANY来获取英文错误消息。您也可以在HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG

    的注册表中进行设置

答案 1 :(得分:2)

  

ORA-12533:TNS:非法ADDRESS参数

     

原因:指定了一组非法的协议适配器参数。在一些   例如,当无法与协议传输建立连接时,将返回此错误   操作:验证是否可以使用指定的协议访问目标。检查TNSNAMES.ORA的ADDRESS部分中的参数。可以在适用于您的平台的Oracle操作系统特定文档中找到Legal ADDRESS参数格式。解析传输层名称的协议(如DECnet对象名称)如果配置不正确或名称拼写错误,则容易受到此错误的影响。

在Oracle版本10g之后,override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 中的

COMMUNITY是不受支持的网络参数。所以删除此参数并仅保留tnsnames.ora,这应该修复。同时删除第一个(PROTOCOL=tcp)参数,该参数与Oracle ADDRESS文件不同。

Unsupported Parameters