2013年5月10日金曜日

The provider is not compatible with the version of Oracle client

「 The provider is not compatible with the version of Oracle client 」
または、
「 プロバイダは、このバージョンのOracleクライアントと互換性がありません 」
というエラーが出た場合についての対処について
 
■原因
ODACをインストールした際に、「Instant Client」にチェックを付け導入した。
これにより参照順序が変わり、 「Instant Client」がインストールされたフォルダを
参照するようになった。(先にDB本体をインストール済みであった。)
 
マニュアルを見ると、
.NET Framework 2.0用のOracle.DataAccess.dllおよび.NET Framework 4用の
Oracle.DataAccess.dllは両方とも同じ非管理DLL(OraOps11w.dll)を使用するとある。
 
しかし、 「Instant Client」は、「OraOps11w.dll」が同梱されていないようである。
 
さらにマニュアルを見ると、
Oracle.DataAccess.dllアセンブリの非管理DLLの正しいバージョンでの使用を
強制するため、Oracle.DataAccess.dllが依存する非管理DLLと異なるバージョンを
ロードすると例外が発生するとある。
 
この例外が、先に書いたエラーメッセージである。
 
■対処
「OraOps11w.dll」を 「Instant Client」が導入されているフォルダにコピーする。

具体的には、※各自の環境により変化するが・・
 「C:\app\ユーザー名\product\11.1.0\db_1\BIN」配下の
  ・ OraOps11.dll
  ・ OraOps11w.dll
 を以下にコピーする。
 「C:\app\ユーザー名\product\11.1.0\client_1\ODP.NET\bin\2.x」

この作業により、 「Oracle.DataAccess.dll」は、 「OraOps11w.dll」を
正しく参照できるようになり、問題は解決するはずである。

■対策
今回のケースでは、エラーメッセージが分かりにくく、根本原因を突き止めにくい。
より分かりやすいエラーメッセージを望むとともに、再発防止策として、
あらかじめアプリのインストーラーに必要なDLLを含めておくとよいであろう。

■追記
別の原因が見つかったので追記します。

サーバーOSが64bitの場合、
・ODAC(11.2.0.3.0)の場合、64bit用のDLLがインストールされる。
・ODAC(11.2.0.2.1)の場合、32bit用のDLLがインストールされる。

この違いに気がつかず、アプリ側をx86指定でコンパイルしていると
ODAC(11.2.0.3.0)の場合、先のエラーが発生する。
(x64とx86は、互換性がないためである)

解決策は、
32bitで進める場合、ODAC(11.2.0.3.0)をアンインストール、ODAC(11.2.0.2.1) をインストール
64bitで進める場合、x86→x64に変更してコンパイルすればよいだろう。