しばたテックブログ

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

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:アプリケーションで分散トランザクションを使用する場合のみ必要になります

ODACインストーラーのカスタマイズ例

前のエントリで触れたODACインストーラーのカスタマイズについて、カスタマイズ例をツールの形でGithubに公開してみました。

Easy ODAC Installer

このツールの概要や使い方についてはGithubのREADMEを参照してください。 バッチファイルとPowerShellで作成してあります。

github.com

このツールでやっていること(インストール)

Install.batとInstall.ps1がインストーラーの実体になります。

Install.batからInstall.ps1を管理者権限で呼び出し、Install.ps1では前のエントリでも触れた通り、

  1. ODACのインストール(install.batの実行)

  2. ORACLE_HOMEレジストリの更新

  3. sqlnet.ora、tnsnames.oraの配置

を行っています。

このツールでやっていること(アンインストール)

UnInstall.batとUnInstall.ps1がアンインストーラーの実体になります。

UnInstall.batからUnInstall.ps1を管理者権限で呼び出し、ODACのアンインストール(uninstall.batの実行)を行っています。

オプションとしてORACLE_HOMEディレクトリやレジストリの強制削除機能を付けています。

Oracle Client(ODP.NET)を手っ取り早くインストールする方法について

縄神様が困っておられたので私の拙い知識がちょっとでも役に立てばと思い久々にブログを書きます。

こちらのつぶやきではInstantClientをご所望されてますが、実際は.NETアプリのインストールパッケージを探しておられたのでこのエントリではODP.NETのインストール方法について記載します。

前提

このエントリの内容はOracle 11g(11.2)〜12c(12.1)あたりを対象にしています。

記載している手順の詳細についてはマニュアルで確認してください。

ODP.NET Managed Driverを使う

多分これが一番早いと思います。

ODP.NET Managed DriverはOracle 12cになって登場したフルマネージドのODP.NETドライバです。

Oracleの文書では管理対象ドライバとかいう訳のわからない翻訳がされたりもしています。

こちらについての詳細や使い方は、こちらかるあさんのブログこちらのチュートリアルを参考にすると良いと思います。

※(2014/11/02追記) ODP.NET Managed Driverに関する私的まとめを書きました。よろしければ ODP.NET Managed Driver(管理対象ドライバ)についての私的まとめ - しばたテックブログ もご覧ください。

以下の条件を満たせる場合はこれを利用する事をお勧めします。

  • .NET 4以降のアプリケーションである。
  • ODP.NETの名前空間を Oracle.ManagedDataAccess.* に変更できる。

インストール方法

ダウンロードサイト(32bit64bit)よりManaged Driverをダウンロードします。

ダウンロードしたZipファイルを任意のディレクトリに展開し、.¥odp.net¥managed¥x64"または".¥odp.net¥managed¥x86フォルダにあるconfigure.batを実行するればインストール完了になります。 展開したディレクトリがそのままODP.NETのインストール先になります。

このconfigure.batではOraProvCfgによるOracle.ManagedDataAccess.dllのGACへの登録や、パフォーマンスカウンタの追加、イベントログの設定、Visual Studio連携のための設定などを行っています。

configure.batを叩かなくても作成したアプリケーションにOracle.ManagedDataAccess.dllを同梱するだけで最低限動作させることはできる様です。

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

Visual Studioのパッケージマネージャーコンソールから以下のコマンドを入力することでVisual StudioのプロジェクトにOracle.ManagedDataAccess.dllを追加することができます。

PM> Install-Package Oracle.ManagedDataAccess

追記ここまで ----

インストール後の設定

インストール後はネットワーク設定をする必要がありますが、EZCONNECT接続を使うのであれば接続文字列を設定するだけなのでこれ以上の設定は不要になります。 TNS接続を使う場合、Managed Driverではapp.configにTNSのエントリやTNS_ADMINのパスを指定することができ、アプリケーションの配置以外の設定は不要になります。 app.configを使わずにTNS_ADMIN環境変数を指定しtnsnames.oraファイルを使用することも可能です。

Xcopy版ODACを使う

Managed Driverが使えない場合は通常のXcopy版のODACをインストールするのが手っ取り早いです。

インストール方法

ダウンロードサイト(32bit64bit)よりXcopy版のODACをダウンロードします。

ダウンロードしたZipファイルを任意のディレクトリに展開し、展開したフォルダの中にあるinstall.batを実行するとインストールできます。ちなみに要管理者権限です。

このinstall.batは以下の4つの引数をとります。

install.bat [インストールするコンポーネント] [ORACLE_HOMEのパス] [ORACLE_HOME名] [依存コンポーネントをインストールするか否か]

インストール可能なコンポーネントは以下。

  • asp.net2 : ASP.NET Providers 2 (.NET 2.0-3.5) ※ODP.NET 2,Instant Clientを含みます。
  • asp.net4 : ASP.NET Providers 4 (.NET 4-) ※ODP.NET 4,Instant Clientを含みます。
  • odp.net2 : ODP.NET 2 (.NET 2.0-3.5) ※Instant Clientを含みます。
  • odp.net4 : ODP.NET 4 (.NET 4-) ※Instant Clientを含みます。
  • oledb : OraOLEDB ※Instant Clientを含みます。
  • oramts : ORAMTS ※Instant Clientを含みます。
  • all : すべてのコンポーネントをインストール

実行例

install.bat odp.net2 "C:\oracle\product\12.1.0\client_1" OraClient12Home1 true

またinstall.batの実行中に同じディレクトリにあるconfigure.batを呼び出しており、カレントディレクトリがinstall.batのあるディレクトリでないとインストールエラーとなるので注意してください。

インストール後の設定

インストールが完了するとinstall.batで指定したORACLE_HOME配下にODACのモジュールが展開され、ORACLE_HOMEのレジストリキーが追加されます。

レジストリキーは¥¥HKLM¥Software¥Oracle¥KEY_{ORACLE_HOME名}(WOW64の場合は¥¥HKLM¥Software¥Wow6432Node¥Oracle¥KEY_{ORACLE_HOME名})になります。

XCopy版のODACではNLS_LANGの値がAMERICAN_AMERICA.WE8MSWIN1252固定なので必要に応じて変更する必要があります。

また、環境変数は変更されないので必要に応じてORACLE_HOMEへのPATHを通すなどしてください。

ネットワーク設定については、EZCONNECT接続を使うのであればManaged Driver同様これ以上の設定は不要になります。 TNS接続を使う場合はTNS_ADMINにtnsnames.oraファイル配置をするなどの作業が必要になります。

アンインストールについて

XCopy版のODACはアンインストール方法に癖があるのでここで補足しておきます。

アンインストールはZipを展開したフォルダの中にあるuninstall.batを以下の引数で実行することで行えます。

uninstall.bat [削除するコンポーネント] [ORACLE_HOMEのパス または ORACLE_HOME名]

実行例

uninstall.bat all "C:\oracle\product\12.1.0\client_1"

 or

uninstall.bat all OraClient12Home1

ただし、カレントディレクトリがORACLE_HOMEにないとアンインストールに失敗するので注意が必要です。

さらにこのバッチを実行してもインストールしたファイルやレジストリは完全には消えないので、完全な削除をしたい場合は自前でファイルとレジストリを削除する必要があります。

手っ取り早くインストールするには

正直なところ、どちらの方法をとってもインストーラーを叩いて一発でドーンと完了という訳にはいきません。

なのでインストール作業を省力化するにはバッチファイルやPowerShellなどで独自のインストーラーを作る必要があります。

私はPowerShellでインストーラーを作っていますが一度インストーラーを作ると以降は流用が出来るのでお勧めです。

[2014/01/24追記]
PowerShellで作ったインストーラーの例を以下のエントリで挙げています。


新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)

新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)

  • 作者: 小田圭二,大塚信男,五十嵐建平,谷敦雄,宮崎博之,神田達成,村方仁
  • 出版社/メーカー: 翔泳社
  • 発売日: 2012/08/17
  • メディア: 単行本(ソフトカバー)
  • 購入: 2人 クリック: 5回
  • この商品を含むブログ (1件) を見る