.net

【.net】Oracle.DataAccessの例外と原因まとめ

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クライアントをインストールしていない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です