しばたテックブログ

気分で書いている技術ブログです。

ODP.NET Managed Driver(管理対象ドライバ)についての私的まとめ

ODP.NET Managed Driverについて自分の欲しい形でまとまった資料がなかったのでここでまとめておきます。

ODP.NET Managed Driver(管理対象ドライバ)とは

ODP.NET Managed Driver(管理対象ドライバ)とはOracle 12cから追加された新しい形のODP.NETで、すべてがマネードコードで記述されているフルマネージドなドライバになります。 このため、これまでのODP.NETとは違いネイティブなドライバ(Instant Clientなど)を必要としない軽量なドライバになっています。

ちなみにこれまでのODP.NETはUnmanaged Driver(管理対象外ドライバ)という呼称になっています。

管理対象ドライバや管理対象外ドライバという呼称は誤訳としか思えないのでここではManaged DriverとUnmanaged Driverで統一します。

Managed DriverとUnmanaged Driverの違い

これまでのUnmanaged DriverはOracle.DataAccess.*名前空間に各種クラスがありましたが、Managed Driverでは名前空間が Oracle.ManagedDataAccess.*に変わります。

Unmanaged Driver、Managed Driverともに同じクラス、メソッドを持ち互換性を確保する様になっています。

ただし、Managed Driverの一部のクラスについては機能が制限されていたり機能そのものがサポートされていません。これは今後のバージョンで改善されると思います。

現時点でのUnmanaged DriverとManaged Driverの相違点は ODP.NET管理対象ドライバと管理対象外ドライバの相違点 に記載されています。

Managed Driver独自の機能として、app.configにTNS_ADMINのパスやTNS接続エントリ情報を記載することができ、TNS接続する場合にtnsnames.oraの設定をせずに済ますことができます。 この機能によりアプリケーションの配布と同時にネットワーク設定も済ますことが出来る様になります。

また、サポートする.NETのバージョンがUnmanaged Driverは.NET 2.0以降であるのに対し、Managed Driverは.NET 4以降のみのサポートとなります。

インストール方法

公式な手順についてはこちらを参照してください。

通常のインストール

Managed Driverは通常、OUIでインストールするかXCopyでインストールするか2通りの方法があります。

OUIでのインストールは画面の指示に従うだけですので問題ないと思います。

Xcopy版のインストールについてはこのエントリでも触れた通り、ダウンロードサイト(32bit64bit)よりManaged Driverをダウンロードし、ダウンロードしたZipファイルを展開した先の".¥odp.net¥managed¥x64"または".¥odp.net¥managed¥x86"フォルダにあるconfigure.batを実行するればインストール完了になります。 展開したディレクトリがそのままODP.NETのインストール先になります。

このconfigure.batでは以下のことが行われています。

  1. OraProvCfgによるmachine.configの書き換え

  2. OraProvCfgによるOracle.ManagedDataAccess.dllOracle.ManagedDataAccessDTC.dllのGACへの登録

  3. Visual Studio連携のための各種設定

  4. イベントログ用のメッセージ定義の追加

アプリケーションの展開

アプリケーションと共にManaged Driverを展開する場合、展開先の環境に対して前述の通常のインストールの他にアプリケーションに以下のdllを同梱することでManaged Driverを動作させることができます。

  • Oracle.ManagedDataAccess.dll

  • Oracle.ManagedDataAccessDTC.dll*1

この場合、インストーラーを使用しないためDLLはGACに登録されず、machine.configの書き換えも行われません。

Nuget

Manage DriverのNugetがここで公開されていますが、公式なものでなくただOracle.ManagedDataAccess.dllをダウンロードしてくるだけのものですので使用はお勧めできません。

Nugetを使うのは開発環境であることがほとんどでしょうから、このNugetを使うよりはVisual Studio連携の設定が行われる通常のインストールを行った方が良いでしょう。

2015/05/09更新
今年の1月にOracle公式のNugetパッケージが公開されていました。

www.nuget.org

Visual Studioのパッケージマネージャーコンソールから以下のコマンドを入力することでOracle.ManagedDataAccess.dllのダウンロードとapp.configおよびweb.configの設定を行ってくれる様になっています。

PM> Install-Package Oracle.ManagedDataAccess

ちなみにパッケージをインストールした時点でOTN開発者ライセンスに同意したものとみなされます。

アプリケーション開発

Managed Driverにおける開発方法はUnmanaged Driverとほぼ同等になります。名前空間をOracle.ManagedDataAccess.*に変える以外は全く同じと言って差し支えないと思います。

開発手順

公式な手順としてはこのチュートリアルを参考にするのが良いと思います。

基本的に開発するアプリケーションでOracle.ManagedDataAccess.dllを参照させるだけで準備は完了となります。 Oracle.ManagedDataAccessDTC.dllはOracle.ManagedDataAccess.dllが内部的に使用するの参照する必要はありません。

コード例

以下に簡単なコード例を示します。

app.config以外はほぼUnmanaged Driverの場合の実装と同じなので特に説明することもないと思います。

みんな大好きDapperも使う事ができます。

App.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Dapper;
using Oracle.ManagedDataAccess.Client;

namespace ODPManagedSample
{
    /// <summary>
    /// ODP.NET Managed Driver Sample Program
    /// </summary>
    class App
    {
        /// <summary>
        /// Main Function
        /// </summary>
        static void Main(string[] args)
        {
            // 
            // ODP.NET Managed Driverを使うにはOracle.ManagedDataAccess.dllを参照します。
            // 分散トランザクションを使用する場合はOracle.ManagedDataAccess.dllと同じディレクトリ
            // にOracle.ManagedDataAccessDTC.dllを配置します。
            // ※Oracle.ManagedDataAccessDTC.dllを参照する必要はありません。
            // 
            using( var Connection = new OracleConnection()){
                //Data SourceにApp.configの設定を参照することができます。
                Connection.ConnectionString = "User ID=SCOTT; Password=TIGER; Data Source=ORCL;";
                Connection.Open();
                
                //
                //接続した後はこれまでのODP.NETと同じ操作を行えます。
                //Managed Driverとの機能差については以下のURLを参照。
                //http://docs.oracle.com/cd/E57425_01/121/ODPNT/intro004.htm#CEGEJIFD
                //
                //ちなみにDapperも使えます。
                Connection.Query("SELECT EMPNO, ENAME FROM EMP ORDER BY 1")
                          .ToList()
                          .ForEach(r => Console.WriteLine(String.Format("{0} : {1}", r.EMPNO, r.ENAME)));
            }
            Console.ReadLine();
        }
    }
}

app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!--
  インストール時にconfigure.batを実行しなかった場合、以下のconfigSectionの定義が必要になります。
  configre.batを実行した場合はmachine.configに以下の定義が追加されていますのでapp.configでの記載は不要になります。
  このセクションに記載するOracle.ManagedDataAccess.dllのバージョンとPublicKeyTokenはインストールしたバージョンに合わせてください。
  -->
  <configSections>
    <section name="oracle.manageddataaccess.client"
             type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>
  
  <oracle.manageddataaccess.client>
    <!-- 設定を反映させるバージョンを指定することができます。すべてのバージョンを対象とする場合は*を指定します。 -->
    <version number="*" >
      <dataSources>
        <!-- TNSの接続エントリ内容を記載します。複数記載可能です。 -->
        <dataSource alias="ORCL" descriptor="(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )" />
      </dataSources>
      <settings>
        <!-- TNS_ADMINのパスを指定することもできます -->
        <!-- <setting name="TNS_ADMIN" value="C:¥oracle¥product¥12.1.0¥client_1¥network¥admin¥" /> -->
      </settings>
    </version>
  </oracle.manageddataaccess.client> 
</configuration>

app.configの設定について

app.configの設定について、上記のコード例にも書いていますが、インストール時にconfigure.batを実行しなかった場合はconfigSectionの記述が必須となります。

この記述はcongifure.batを実行した場合はmachine.configに追加されるもので、oracle.manageddataaccess.clientセクションをパースするために必要な部分になります。
この記載がないとプログラムの起動時に例外が発生します。

Managed Driverに関する設定はこのoracle.manageddataaccess.clientセクション配下に記載します。

versionセクション

versionセクションはoracle.manageddataaccess.clientセクション直下に記述し、設定を反映させるバージョンを指定することができます。 すべてのバージョンを対象とする場合は*とします。

このversionセクションの下にdataSoucessettingsセクションを記述します。

dataSoucesセクション

dataSoucesセクションにはTNSのエントリと対になるdataSourceセクションを記述します。

dataSourceセクションは複数記載でき、コード例の様にTNSエントリのAlias名とDescriptorの内容をそのまま記載します。

ただし、Descriptorの内容についてすべてのキーワードがサポートされてはおらず、一般的に使用される一部のキーワードのみサポートとなっています。

settingsセクション

settingsセクションにはその他の設定を記載します。

現時点で設定可能な項目は、

  • DbNotificationPort

  • DemandOraclePermission

  • FetchSize

  • LDAP_ADMIN

  • MaxStatementCacheSize

  • MetaDataXml

  • NAMES.DIRECTORY_PATH

  • NAMES.LDAP_AUTHENTICATE_BIND

  • NAMES.LDAP_CONN_TIMEOUT

  • NODELAY

  • ORACLE_SID

  • PerformanceCounters

  • SelfTuning

  • SQLNET.AUTHENTICATION_SERVICES

  • StatementCacheSize

  • SSL_VERSION

  • TNS_ADMIN

  • TraceFileLocation

  • TraceLevel

  • TraceOption

  • TCP.CONNECT_TIMEOUT

  • WALLET_LOCATION

になります。

各セクションに設定可能な項目の詳細は、Oracle Data Provider for .NETの構成 を参照してください。

各種リンク

*Introduction to Building ODP.NET, Managed Driver Applications

絵で見てわかるOracleの仕組み (DB Magazine SELECTION)

絵で見てわかるOracleの仕組み (DB Magazine SELECTION)

*1:アプリケーションで分散トランザクションを使用する場合のみ必要になります