web-dev-qa-db-ja.com

ODP.NET Oracle.ManagedDataAccessにより、ORA-12537ネットワークセッションのファイルの終わりが発生する

概観

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();
        }
    }
}

参照と依存関係

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

プロジェクト設定

プラットフォームターゲット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)

プロジェクト設定

プラットフォームターゲット任意の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、なし、すべて)を試し、接続文字列をUser Id = XXX; password = XXX; Data Source = MyDataSource;に変更しましたが、エラーは同じ。

ご質問

  • ORA-12537ネットワークセッションファイルの終わり例外の原因は何ですか?
  • 参照/依存関係がありませんか?
  • DBサーバーで何かを設定する必要がありますか?

更新

サーバーで、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 Managed Driver 12cで動作するようです:
https://www.nuget.org/packages/Oracle.ManagedDataAccess/

12
Greg

編集: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

2
Christian Shay

2015年10月5日の時点で、Oracle.ManagedDataAccessドライバー(ODAC 12cリリース4)はASOをサポートしています。

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

3
David Dindak

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を解除して既存のアセンブリを構成解除する」ことです。

1

同じ問題がいくつかありました。レジストリにエントリが見つかりました:HKEY_LOCAL_MACHINE\SOFTWARE\wow6432\Oracle。この部分にODP.NET.managedエントリーが含まれている場合は、別のキー(バージョンのバージョンに依存)でこのエントリーがTNS_ADMINという文字列を含んでいるかどうかを確認してください。この文字列を削除するか、値を存在しないディレクトリに変更する必要があります。文字列が存在し、有効なディレクトリを指している場合、管理対象クライアントは構成ファイルの設定を使用せず、失敗します。さらなる調査が使用されるべきですが、私は私のものを機能させて、残りを延期する必要があります...

0
Carl Høgstedt

このエラーが発生していましたが、実行しているクエリに誤りがあるのは簡単なケースでした。

0
Chris Hammond

私もこのエラーに苦労しました。最後に、12c(バージョン4.122.1.0)のOracle.ManagedDataAccess.dllを試しました。 ODACがインストールされたディレクトリ(\ odp.net\managed\common)から上記のdllの参照を作成し、それが機能しました... !!!私のソリューションを共有しています。

0