ODP.NET

Oracleへの接続はODPを使用している。未だに9.2.0.2102だ。さらに社内共通で使用しているODPのラッパーライブラリがある。接続先DBが10gだとしても9iのクライアントをインストールしODPも前述の物を使っていた。だが今回の納品先では既に10gのクライアントがインストールされてしまっているため社内ライブラリを10gに対応させビルドする必要が出てきた。この時点で知っていたこと。

  • Oracle ClientはHomeを別にすれば共存可能である。
  • しかしODPの共存は無理らしい(Webでさらっと調べた結果)

とりあえず開発環境とは別に確認環境としてVirtualPC上にXpSP2、.NET Framework 1.1、Oracle 9i、ODP.NET 9.2.0.2102の環境を作った。これは今までの環境なのでアプリケーションは問題なく動作した。
次にOracle 10gをインストールし(この時点で9i、10gの共存)アプリケーションフォルダにあるOracle.DataAccess.dllをバージョン10.1.0.200に差し替えてみたところ、予想通り動作しなくなった。これは社内ライブラリが9iのアセンブリを参照して動作するように作られているからだと予想した。ちなみにassemblyフォルダ内のOracleは以下のようになっていた。

グローバルアセンブリ バージョン
Oracle.DataAccess 9.2.0.2102
Oracle.DataAccess 10.1.0.200
Oracle.DataAccess.resources 9.2.0.2102
Policy.9.2.Oracle.DataAccess 9.2.0.2102

今度は開発環境に10gをインストール(こちらも共存)し社内ライブラリをビルドした。この時もともと9.2.0.2.102だったOracle.DataAccessのバージョンは10.1.0.200に自動で変わっていたのを確認した。*1
ビルドしたライブラリを確認環境に持っていき既存と置き換えると無事動作した。この時点でODPのDLLと社内ライブラリのセットが9i、10g2種類でできた事になりセットで入れ替えれば問題なく動作する事が確認できた。
最後に確認環境から9iを、開発環境から10gをアンインストールした所、assemblyフォルダは以下のようになった。

  • 確認環境
グローバルアセンブリ バージョン
Oracle.DataAccess 10.1.0.200
Oracle.DataAccess.resources 10.1.0.200
  • 開発環境
グローバルアセンブリ バージョン
Oracle.DataAccess 9.2.0.2102
Oracle.DataAccess.resources 9.2.0.2102
Policy.9.2.Oracle.DataAccess 9.2.0.2102

開発環境の方は後から入れたのを削除するためODPの再インストールが必要かと思ったのだが、ちゃんと9に戻っていた。
社内ライブラリをMSIL逆アセンブラで覗いてみるとMANIFEST部分に以下の内容があった。


.assembly extern Oracle.DataAccess
{
.publickeytoken = (89 B4 83 F4 29 C4 73 42 ) // ....).sB
.ver 10:1:0:200
}
ここで参照する物が決まっているのだろうか。
以上、忘れないようにメモとして残す。


開発環境の方だが、ODPを参照している既存のプロジェクトを開くと、ODPの参照が見つからないエラーが発生した。参照を張り直そうとしたが参照の追加ダイアログボックスに見つからなかった。GACに存在は確認できるものの一覧には表示されていない状態だ。ODPをインストールしなおしたら参照は元に戻り一覧にも表示されるようになった。

*1:assemblyフォルダのバージョンになる???