Oracle.DataAccessをOrcale。ManagedDataAccessに置き換えたいのですが、後者で接続を開くとORA-12537がスローされますネットワークセッションファイルの終わり例外。
例外メッセージ/スタックトレース
{OracleInternal.Network.NetworkException(0x000030F9):ORA-12537:Netzwerksession:Dateiende at OracleInternal.Network.ReaderStream.Read(OraBuf OB)at OracleInternal。 OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData)のOracleInternal.TTC.TTC.TTC.TTCProtocolNegotiation.ReadResponse()}のOracleInternal.TTC.OraBufReader.Read(Boolean bIgnoreData)のTTC.OraBufReader.GetDataFromNetwork()
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();
}
}
}
プラットフォームターゲットx86
ターゲットフレームワーク4.5
Nugetパッケージの使用公式のOracle ODP.NET、マネージドドライバー12.1.21
コードは上記と同じです。変更のみ:
using System;
using Oracle.ManagedDataAccess.Client;
//... rest the same as above
のみ:
プラットフォームターゲット任意のCPU
ターゲットフレームワーク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、なし、すべて)を試し、接続文字列をUser Id = XXX; password = XXX; Data Source = MyDataSource;に変更しましたが、エラーは同じ。
サーバーで、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を構成するにはどうすればよいですか?
ODP Managed Driver 12cで動作するようです:
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
編集:ASOがサポートされるようになりました。 ODAC 12cリリース4以降にアップグレードします。これで問題が解決しない場合は、データベースサーバーのalert.logを確認し、接続しようとしたときにそこで発生したエラーを調査(google)してください。
元の回答:
これを書いている時点(2015年4月30日)では、ODP.NETマネージドドライバーでのOracle Advanced Security Option(ASO)暗号化のサポートはありません。これがエラーの原因です。
これは将来サポートされる可能性が非常に高いため、後日読む場合は、最新のODP.NETドキュメントをチェックして、ODP.NETのアップグレードが必要かどうかを確認してください。
http://docs.Oracle.com/cd/E56485_01/win.121/e55744/InstallConfig.htm#CHDJIDIG
2015年10月5日の時点で、Oracle.ManagedDataAccessドライバー(ODAC 12cリリース4)はASOをサポートしています。
https://apex.Oracle.com/pls/apex/f?p=18357:39:18138408495219::NO::P39_ID:28201
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パッケージのReadmeファイルの最初のインストール手順は、「GACを解除して既存のアセンブリを構成解除する」ことです。
同じ問題がいくつかありました。レジストリにエントリが見つかりました:HKEY_LOCAL_MACHINE\SOFTWARE\wow6432\Oracle。この部分にODP.NET.managedエントリーが含まれている場合は、別のキー(バージョンのバージョンに依存)でこのエントリーがTNS_ADMINという文字列を含んでいるかどうかを確認してください。この文字列を削除するか、値を存在しないディレクトリに変更する必要があります。文字列が存在し、有効なディレクトリを指している場合、管理対象クライアントは構成ファイルの設定を使用せず、失敗します。さらなる調査が使用されるべきですが、私は私のものを機能させて、残りを延期する必要があります...
このエラーが発生していましたが、実行しているクエリに誤りがあるのは簡単なケースでした。
私もこのエラーに苦労しました。最後に、12c(バージョン4.122.1.0)のOracle.ManagedDataAccess.dllを試しました。 ODACがインストールされたディレクトリ(\ odp.net\managed\common)から上記のdllの参照を作成し、それが機能しました... !!!私のソリューションを共有しています。