ODP.Net経由でOracleに接続する場合のエラー対処法まとめです。
過去に幾度となく苦しめられてきたのでメモ。
System.TypeInitializationException: 'Oracle.DataAccess.Client.OracleCommand' のタイプ初期化子が例外をスローしました。 ---> Oracle.DataAccess.Client.OracleException: プロバイダは、このバージョンのOracleクライアントと互換性がありません
原因
クライアントにインストールしているOracle.DataAccess.dllと、参照しているOracle.DataAccess.dllのバージョンが異なる。
※いけるバージョン違いもある
発生例
インストールバージョン:4.121.2.0
参照バージョン:4.122.1.0
System.IO.FileNotFoundException: ファイルまたはアセンブリ名 'Oracle.DataAccess'、またはその依存関係の1つが読み込めませんでした。指定されたファイルが見つかりません。 (Could not load file or assembly 'Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. The system cannot find the file specified.)
原因
アプリケーションがOracle.DataAccess.dllを見つけれない状態。気をつけなければならないのが、単純にdll同梱漏れ&未インストールの他に、異なるプラットフォーム(x86, x64)版のODACをインストールした場合も対象となること。
発生例
64bitOSで、32bit版のODACをインストールしており、AnyCPUやx64でビルドされたアプリケーションで実行する。
System.BadImageFormatException: ファイルまたはアセンブリ名 'Oracle.DataAccess'、またはその依存関係の1つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。 (Could not load file or assembly 'Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format.) File name: 'Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342'
原因
プラットフォーム絡みの不一致。ターゲットCPUと、動作環境のOSビット数と異なる。事象②と違い、アプリケーションはOracle.DataAccess.dllを見つけられている。
発生例
1.x86でビルドしたが、64ビットOSで動かしている。
2.Webアプリの場合に、動作環境もOracleClientも64bitで動かしているが、プロジェクトのオプション「32bitを選ぶ」がONになっている。↓
System.TypeInitializationException: ‘Oracle.DataAccess.Client.OracleConnection’ のタイプ初期化子が例外をスローしました。 —> System.DllNotFoundException: DLL ‘OraOps12.dll’ を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E) 場所 Oracle.DataAccess.Client.OpsInit.CheckVersionCompatibility(String version) 場所 Oracle.DataAccess.Client.OracleInit.Initialize() 場所 Oracle.DataAccess.Client.OracleConnection..cctor()
原因
OracleConnection生成時に上記の例外が発生する。OraOpsXX.dllは、Oracle.DataAccess.dllから内部的に呼ばれるdll。要するにOracle.DataAccess.dllはあるが、OraOpsXX.dllが見つからない状態。
発生例
Oracleクライアントをインストールしていない。