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

C# ODP.NET Oracle.ManagedDataAccess导致ORA-12537网络会话文件结束 概述,c#,oracle,oracle11g,odp.net,C#,Oracle,Oracle11g,Odp.net,我想用Orcale.DataAccess替换Oracle.DataAccess。托管的DataAccess,但打开与后者的连接会引发ORA-12537网络会话文件结束异常 异常消息/堆栈跟踪 {OracleInternal.Network.NetworkException(0x000030F9):ORA-12537:Netzwerksession:Dateiende 在OracleInternal.Network.ReaderStream.Read(OraBuf OB)上 在OracleInte

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

异常消息/堆栈跟踪

{OracleInternal.Network.NetworkException(0x000030F9):ORA-12537:Netzwerksession:Dateiende 在OracleInternal.Network.ReaderStream.Read(OraBuf OB)上 在OracleInternal.TTC.OraBufReader.GetDataFromNetwork()上 在OracleInternal.TTC.OraBufReader.Read(布尔值bIgnoreData) 在OracleInternal.TTC.marshallingine.UnmarshalUB1(布尔值bIgnoreData) 在OracleInternal.TTC.TTCProtocolNegotiation.ReadResponse()上

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

工作测试应用程序(非托管) 使用Oracle.DataAccess工作正常

使用系统;
使用Oracle.DataAccess.Client;
命名空间App.Odp.Unmanaged
{
内部课程计划
{
私有静态void Main(字符串[]args)
{
//虚拟连接字符串。使用SID
string connectionString=“用户Id=***;密码=***;数据源=1.2.3.4:1521/sid01;”;
尝试
{
使用(var conn=新的OracleConnection(connectionString))
{
conn.Open();
使用(OracleCommand cmd=conn.CreateCommand())
{
cmd.CommandText=“从所有用户中选择*”;
使用(OracleDataReader=cmd.ExecuteReader())
{                            
WriteLine(“VisibleFieldCount:{0}”,reader.VisibleFieldCount);
WriteLine(“HiddenFieldCount:{0}”,reader.HiddenFieldCount);
}
}
}
}
捕获(例外情况除外)
{
WriteLine(“错误:{0}”,例如Message);
}
Console.ReadLine();
}
}
}
引用和依赖关系
  • Oracle.DataAccess(2.111.7.0)
  • oci.dll(11.1.0.1)
  • orannzsb11.dll(11.1.0.6)
  • oraociei11.dll(Oracle调用接口即时客户端)
  • OraOps11w.dll(2.111.7.0)
项目设置 平台目标x86
目标框架4.5

失败的测试应用程序(托管) 使用nuget包官方Oracle ODP.NET托管驱动程序 12.1.21

代码与上面相同。仅更改:

使用系统;
使用Oracle.ManagedDataAccess.Client;
//... 其余同上
引用和依赖关系 仅:

  • Oracle.ManagedDataAccess(4.121.2.0)
项目设置 平台目标任何CPU
目标框架4.5

App.config


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


原始答复:

在撰写本文(4/30/15)时,不支持使用ODP.NET托管驱动程序进行Oracle高级安全选项(ASO)加密,这正是导致错误的原因

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


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


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

我在CLR 4 GAC中安装了一个旧版本(C:\Windows\Microsoft.NET\assembly\GAC_MSIL for me),该版本随Oracle 12.1客户端一起安装

由于GAC中的dll:s总是首先使用,所以使用了旧的ASO不可压缩版本,但我认为我使用了新的版本

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

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

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

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

连接正在丢失-这可能是因为防火墙、Oracle网络设置或数据库中的错误。有几件事:在尝试托管之前,您是使用了与现在使用的相同的连接字符串,还是使用了TNS别名或其他数据库/sid?让DBA检查您尝试连接时出现的错误的警报日志。此外,在调试应用程序时检查内部异常。可能存在其他ORA错误,这些错误可能指向连接丢失的原因。是的,我使用了相同的连接字符串。我会让DBA检查错误。额外的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)))