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

How to connect to Oracle DB using TNS alias with Entity Framework 6?

在我的设置中,我有一个使用 Visual Studio 2015 构建的 .NET 应用程序试图使用 Entity Framework 6.

访问 Oracle 12c 数据库上的数据

这是我为实现这一目标所做的工作:

这是我的 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" />

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

"ORA-12533: Netzwerksession: Syntaxfehler bei Verbindungstransportadresse"

根据 the oracle docs 转换为

"ORA-12533: TNS: illegal ADDRESS parameters"

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

我做错了什么?

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

我假设 ODP.NET Managed Driver 找不到您的 tnsnames.ora 文件。 ODP.NET Managed Driver 使用此命令解析别名:

  1. .NET 配置文件中 <oracle.manageddataaccess.client> 部分下的 dataSources 部分中的数据源别名。
  2. tnsnames.ora 文件中的数据源别名,位于 .NET 配置文件中 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

的注册表中进行设置

ORA-12533: TNS:illegal ADDRESS parameters

Cause: An illegal set of protocol adapter parameters was specified. In some cases, this error is returned when a connection cannot be made to the protocol transport.

Action: Verify that the destination can be reached using the specified protocol. Check the parameters within the ADDRESS section of TNSNAMES.ORA. Legal ADDRESS parameter formats may be found in the Oracle operating system specific documentation for your platform. Protocols that resolve names at the transport layer (such as DECnet object names) are vulnerable to this error if not properly configured or names are misspelled.

COMMUNITY 是 Oracle 版本 10g 之后 tnsnames.ora 中不支持的网络参数。所以删除此参数并仅保留 (PROTOCOL=tcp),这应该可以解决。同时删除第一个 ADDRESS 参数,该参数是为 Oracle Listener.ora 文件指定的。

Unsupported Parameters