「 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に変更してコンパイルすればよいだろう。
0 件のコメント:
コメントを投稿