ODP.NET Oracle.ManagedDataAccess导致ORA-12537网络会话结束文件

时间:2015-04-24 12:21:54

标签: c# oracle oracle11g odp.net

概述

我想用Orcale替换Oracle.DataAccess。托管 DataAccess,但是打开与后者的连接会引发 ORA-12537网络会话结束文件异常。< / p>

异常消息/堆栈跟踪

  

{OracleInternal.Network.NetworkException(0x000030F9): ORA-12537 :Netzwerksession:Dateiende        在OracleInternal.Network.ReaderStream.Read(OraBuf OB)        在OracleInternal.TTC.OraBufReader.GetDataFromNetwork()        at OracleInternal.TTC.OraBufReader.Read(Boolean bIgnoreData)        at OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData)        在OracleInternal.TTC.TTCProtocolNegotiation.ReadResponse()}

我正在尝试连接到Oracle 11g数据库,并且我的本地计算机上没有安装客户端。

工作测试应用程序(非托管)

使用Oracle.DataAccess 正常运行

using System;
using Oracle.DataAccess.Client;

namespace App.Odp.Unmanaged
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            //dummy connection string. using SID 
            string connectionString = "User Id=***;password=***;Data Source=1.2.3.4:1521/sid01;";

            try
            {
                using (var conn = new OracleConnection(connectionString))
                {
                    conn.Open();
                    using (OracleCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "select * from all_users";

                        using (OracleDataReader reader =     cmd.ExecuteReader())
                        {                            
                            Console.WriteLine("VisibleFieldCount: {0}", reader.VisibleFieldCount);
                            Console.WriteLine("HiddenFieldCount: {0}", reader.HiddenFieldCount);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error:{0}", ex.Message);
            }

            Console.ReadLine();
        }
    }
}

引用和依赖

  • Oracle.DataAccess(2.111.7.0)
  • oci.dll(11.1.0.1)
  • orannzsbb11.dll(11.1.0.6)
  • oraociei11.dll(Oracle Call Interface Instant Client)
  • OraOps11w.dll(2.111.7.0)

项目设置

Plattform目标 x86
目标框架4.5

测试应用程序失败(托管)

使用nuget包官方Oracle ODP.NET,托管驱动程序 12.1.21

代码与上述相同。只有改变:

using System;
using Oracle.ManagedDataAccess.Client;
//... rest the same as above

引用和依赖

  • Oracle.ManagedDataAccess(4.121.2.0)

项目设置

Plattform目标任何CPU
目标框架4.5

的App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.data>
    <DbProviderFactories>
      <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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <!--<dataSource alias="MyDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=1.2.3.4)(PORT=1521))(CONNECT_DATA=(SID=sid01)))" />-->
      </dataSources>
      <settings>
        <!--<setting name="SQLNET.AUTHENTICATION_SERVICES" value="NTS"/>-->
      </settings>
    </version>
  </oracle.manageddataaccess.client>
</configuration>

我尝试了不同的设置(NTS,none,all)并将连接字符串更改为 User Id = XXX; password = XXX; Data Source = MyDataSource; ,但错误保持不变。

问题

  • 什么可能导致 ORA-12537网络会话结束文件异常?
  • 是否缺少参考/依赖?
  • 是否必须在数据库服务器上配置某些内容?

更新

在服务器上,我们收到了一个 ORA-12679:其他进程禁用了本机服务但在alert.log中需要错误。

似乎与加密有关。在服务器sqlnet.ora中注释掉以下行可以解决问题。

#SQLNET.AUTHENTICATION_SERVICES=(NTS)
#SQLNET.ENCRYPTION_TYPES_SERVER = (rc4_128, rc4_256)
#SQLNET.ENCRYPTION_SERVER=REQUIRED
#ENCRYPTION_WALLET_LOCATION=
#          (SOURCE=(METHOD=FILE)(METHOD_DATA=
#                  (DIRECTORY=...\%ORACLE_SID%\wallet)))

新问题

我们如何配置ManagedDataAccess以便它与加密一起使用?

更新2

现在似乎与ODP管理驱动程序12c一起工作:
https://www.nuget.org/packages/Oracle.ManagedDataAccess/

6 个答案:

答案 0 :(得分:3)

截至2015年10月5日,Oracle.ManagedDataAccess驱动程序(ODAC 12c Release 4)支持ASO。

https://apex.oracle.com/pls/apex/f?p=18357:39:18138408495219::NO::P39_ID:28201

答案 1 :(得分:2)

编辑:现在支持ASO。升级到ODAC 12c版本4或更高版本。如果这不能解决您的问题,请检查数据库服务器上的alert.log并调查(谷歌)您尝试连接时出现的任何错误。

原始答案:

在撰写本文时(2015年4月30日),不支持使用ODP.NET托管驱动程序进行Oracle高级安全保护选项(ASO)加密,这是造成错误的原因。

这很可能在将来的某个时候得到支持,所以如果您以后再阅读,请查看最新的ODP.NET文档,看看是否需要升级ODP.NET。

http://docs.oracle.com/cd/E56485_01/win.121/e55744/InstallConfig.htm#CHDJIDIG

答案 2 :(得分:1)

确保您在GAC中没有旧版本的Oracle.ManagedDataAccess。似乎dll的几个版本具有相同的AssemblyVersion。

我在CLR 4 GAC(对我来说是C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL)中安装了旧版本,并安装了Oracle 12.1客户端。

由于GAC中的dll:s始终首先使用旧的ASO无法使用的版本,但我认为我使用的是较新的版本。

解决方案是从GAC卸载旧版本。 12.1.2400 Nuget Package自述文件中的第一个安装步骤是&#34; Un-GAC并取消配置任何现有的程序集&#34;。

答案 3 :(得分:0)

我也很难接受这个错误。 最后我尝试使用Oracle.ManagedDataAccess.dll for 12c(版本4.122.1.0)。从ODAC安装目录(\ odp.net \ managed \ common)为上面的dll创建了一个引用,它工作了...... !!!分享我的解决方案

答案 4 :(得分:0)

有一些相同的问题。在注册表中找到一个条目: HKEY_LOCAL_MACHINE \ SOFTWARE \ wow6432 \ ORACLE。 如果此部分包含ODP.NET.managed条目,则可以使用另一个密钥(名称版本dependend)检查此entyr是否包含名为TNS_ADMIN的字符串。应删除此字符串或将值更改为不存在的目录。如果字符串存在并指向有效目录,则受管客户端不使用配置文件中的设置并失败。 应该使用进一步的调查,但是我的工作正常,并且必须推迟其余的工作....

答案 5 :(得分:0)

我遇到了这个错误,这很简单,我正在运行的查询有一个错误。