2

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

这是我为实现这一目标所做的事情:

  • 在 oracle.com上遵循了有关如何使用 nuget 安装官方 Oracle ODP.NET、托管实体框架驱动程序及其依赖项的教程。
  • 我确保可以找到 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" />

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

"ORA-12533: Netzwerksession: Syntaxfehler bei Verbindungstransportadresse"

根据oracle docs翻译为

“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))
  )

我在这里做错了什么?

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

4

2 回答 2

2

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

  1. .NET 配置文件中dataSources部分下的部分中的数据源别名。<oracle.manageddataaccess.client>
  2. .NET 配置文件中tnsnames.ora指定位置的文件中的数据源别名。TNS_ADMIN位置可以由绝对或相对目录路径组成。
  3. tnsnames.ora文件中的数据源别名与.exe.

请参阅.NET 开发人员指南的数据提供程序

如您所见,ODP.NET 托管驱动程序不会读取环境变量来确定TNS_ADMIN. 检查您的 .NET 配置文件(即machine.config, web.config, user.config

顺便说一句,您可以运行set NLS_LANG=AMERICAN_GERMANY以获取英文错误消息。您也可以在注册表中进行设置HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG

于 2016-10-05T10:01:03.953 回答
2

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

原因:指定了一组非法的协议适配器参数。在某些情况下,当无法与协议传输建立连接时会返回此错误。

行动:验证可以使用指定的协议到达目的地。检查 TNSNAMES.ORA 的 ADDRESS 部分中的参数。可以在您平台的 Oracle 操作系统特定文档中找到合法的 ADDRESS 参数格式。如果未正确配置或名称拼写错误,则在传输层解析名称(例如 DECnet 对象名称)的协议很容易受到此错误的影响。

COMMUNITYtnsnames.ora是Oracle 10g 之后不支持的网络参数。因此,删除此参数并仅保留(PROTOCOL=tcp),这应该可以解决。还要删除第一个ADDRESS用于 OracleListener.ora文件的参数。

不支持的参数

于 2016-10-05T11:15:03.690 回答