0

現在、バックエンドで Oracle 10g データベースと通信する WCF サービスの実装に取り​​組んでいます。サービス内からデータベースに接続しようとすると、次の例外が発生します: System.TypeInitializationException.

  • 私はWindows 7(64ビットマシン)で実行しています。

  • 私はVS2010を使用しています。

  • バックエンドで Oracle 10g を使用しています。

  • 私は、次のインストール済みインスタンスの Oracle.DataAccess.dll (ODP.Net) です。

     c:\oracle\product\10.2.0\.....\ODP.NET\bin\1.x\Oracle.DataAccess.dll
    
  • この DLL を WCF サービスのリファレンスに含めました。

  • このサービスを VS WPF ソリューション内のプロジェクトとして含めました。

  • VS 2010 で WPF アプリケーションを起動すると、サービスが自動的に起動します。

実行時に、デバッグ出力ウィンドウに次の出力が表示されます。

'WcfSvcHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\assembly\GAC\Oracle.DataAccess\1.102.2.20__89b483f429c47342\Oracle.DataAccess.dll' タイプ 'System.TypeInitializationException' の最初のチャンス例外' Oracle.DataAccess.dll で発生

案の定、デバッガーで例外の詳細を確認すると、次の情報が表示されます (これは、新しい ORACLE 接続を作成しようとしたときに発生します)。

「'Oracle.DataAccess.Client.OracleConnection' の型初期化子が例外をスローしました。」InnerException {"プロバイダは Oracle クライアントのバージョンと互換性がありません"} System.Exception {Oracle.DataAccess.Client.OracleException}

少し背景:

基本的に、データ層を WCF サービスに移行しています。同じサービス レイヤーが以前に WinForm アプリケーションに存在していました。私のWinFormアプリケーションではすべてうまくいきます。私は Oracle.DataAccess.dll への同じ参照を含め、データベースでのすべての読み取り/書き込みは正常に機能します。

WCF と WinForm のアクセス/DLL の使用に明らかに違いはありますか? 私が気付いていない制限はありますか?デバッガーで VS2010 を介してこれを実行する際に問題はありますか?

ここで何が起こっているのかまったくわかりません。ヒント/方向性は大歓迎です。

4

1 に答える 1

1

いいえ、.NET 側で特に注意する必要はありません。
この特定のエラーの理由のいくつかは次のとおりです。

  1. アプリケーションは .NET 4 をターゲットにしていますが、ODP.NET for .NET 2 または .NET 1 しかインストールされていません
  2. ローカルの Oracle Instant Client を使用しており、管理されていない DLL の一部が不足しています。

実際、例外メッセージには、バージョン番号 1.102.2.20 の GAC から Oracle.DataAccess.dll をロードしようとしたことが示されています。.NET 2 のバージョンは2 .102.2.20 で、.NET 4のバージョンは4 .102.2.20 であるため、これは ODP.NET の.NET 1バージョンのようです。

Winform アプリケーションの bin フォルダに Oracle.DataAccess.dll のバージョンがあり、GAC の代わりにそれを使用していたのではないでしょうか?


これらの問題が、プロジェクトでローカルの Oracle Instant クライアントに切り替えた理由です。これにより、私の展開に 130 MB が追加されますが、すべて企業のソフトウェアであるため、問題ではありません。

于 2012-08-21T18:08:50.980 に答える