ODP.NET Oracle.ManagedDataAccess 导致 ORA-12537 网络会话文件结束 [英] ODP.NET Oracle.ManagedDataAccess causes ORA-12537 network session end of file

查看:73
本文介绍了ODP.NET Oracle.ManagedDataAccess 导致 ORA-12537 网络会话文件结束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to replace Oracle.DataAccess with Orcale.ManagedDataAccess, but opening a connection with the latter throws an ORA-12537 network session end of file exception.

异常消息/堆栈跟踪

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

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

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

I am trying to connect to a Oracle 11g database and do not have a client installed on my local machine.

使用 Oracle.DataAccess 工作正常.

Using Oracle.DataAccess works fine.

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 调用接口即时客户端)
  • OraOps11w.dll (2.111.7.0)
  • 平台目标 x86
    目标框架 4.5

    Plattform target x86
    Target Framework 4.5

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

    Using the nuget package Official Oracle ODP.NET, Managed Driver 12.1.21

    代码与上面相同.只改变:

    Code is identical to above. Only change:

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

    引用和依赖

    仅:

    • Oracle.ManagedDataAccess (4.121.2.0)

    平台目标 任何 CPU
    目标框架 4.5

    Plattform target Any CPU
    Target Framework 4.5

    <?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;,但错误保持不变.

    I have tried different settings (NTS, none, all) and changed the connection string to User Id=XXX;password=XXX;Data Source=MyDataSource;, but the error stays the same.

    • 什么可能导致 ORA-12537 网络会话文件结束异常?
    • 是否缺少引用/依赖项?
    • 是否需要在数据库服务器上配置一些东西?

    在服务器上,我们在 alert.log 中收到 ORA-12679: Native services disabled but required 错误.

    On the server we are getting an ORA-12679: Native services disabled by other process but required error in the alert.log.

    好像跟加密有关系.在服务器 sqlnet.ora 中注释掉以下几行即可解决问题.

    It seems to have something to do with the encryption. Commenting out the following lines in the servers sqlnet.ora solves the issue.

    #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 使其与加密一起工作?

    New question

    How do we configure ManagedDataAccess so it works with the encryption?

    现在似乎可以与 ODP 托管驱动程序 12c 一起使用:
    https://www.nuget.org/packages/Oracle.ManagedDataAccess/

    Seems to work now with ODP Managed Driver 12c:
    https://www.nuget.org/packages/Oracle.ManagedDataAccess/

    推荐答案

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

    ASO is now supported. Upgrade to ODAC 12c Release 4 or later. If this does not fix your problem, check the alert.log on the database server and investigate (google) any errors that occur there when you attempt to connect.

    原答案:

    截至撰写本文时(2015 年 4 月 30 日),不支持使用 ODP.NET 托管驱动程序的 Oracle 高级安全选项 (ASO) 加密,这是导致您出错的原因.

    As of this writing (4/30/15) there is no support for Oracle Advanced Security Option (ASO) encryption with ODP.NET Managed Driver which is what is causing your errors.

    这很可能在未来的某个时候得到支持,因此如果您在以后阅读本文,请查看最新的 ODP.NET 文档以了解是否需要升级 ODP.NET.

    This is very likely to be supported at some point in the future so if you are reading this at a later date, check the latest ODP.NET docs to see if an upgrade of ODP.NET is needed.

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

    这篇关于ODP.NET Oracle.ManagedDataAccess 导致 ORA-12537 网络会话文件结束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆