web-dev-qa-db-ja.com

「Oracle.DataAccess.dll」のどのバージョンを含めるかを決定する方法

私の.NET 3.5 Windowsフォームを別の環境に展開しているときに、多くの無効なプロバイダーの問題が発生しました。

一部では機能しますが、他では機能しません。

誰かが私を助けてくれませんか?どのバージョンの「Oralce.DataAccess.dll」を使用するかをどのようにして決定しますか、つまり9または10または11または9.1。*または10.1。*または11. *または12など.

  1. アプリケーションをインストールするサーバーに依存しますか?または

  2. バックエンドのOracleデータベースに依存していますか?

7
Nil Pun

100%マネージドプロバイダー を使用するという概念を次に説明します。これにより、これから説明する詳細を知る必要がなくなります。ここでの唯一の問題は、.net 4.0へのアップグレードが必要になる可能性があることです。

TLDRバージョン:

  • 代わりに12c 100%マネージドプロバイダーを使用してください。
  • 短い答えは、プロバイダー(Oracle.DataAccess.dll)を、管理されていないクライアントの異なるバージョン(少なくとも後方ではない)と混在させないことです。
  • そもそもクライアントにOracleプロバイダーを用意する必要がないサービスレイヤーを含めるように再設計することを検討してください。

完全版:

まず、古いアンマネージドプロバイダーのコンポーネント(新しい12c 100%マネージドプロバイダーではない)を確実に理解しましょう。それは2つの部分で構成されています。

  1. マネージド.netコンポーネント-Oracle.DataAccess.dll
  2. 管理されていない(非.net)クライアント

簡単に言えば、Oracle.DataAccess.dllはほぼラッパーにすぎず、.net命令を非管理対象クライアントのOracle-NET命令に変換します。

つまり、Oracle.DataAccessをロードすると、必要なアンマネージクライアントdllを見つけようとする順序があります。 Oracleドキュメント から:

Oracle.DataAccess.dllは、次の順序に基づいて、依存するアンマネージDLL(Oracleクライアントなど)を検索します。

1.アプリケーションまたは実行可能ファイルのディレクトリ。

2.アプリケーション構成またはweb.configで指定されたDllPath設定。

3. machine.configで指定されたDllPath設定。

4.Windowsレジストリで指定されたDllPath設定。

HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\version\DllPath

5.Windows PATH環境変数で指定されたディレクトリ。

これは、マシンに複数のクライアントがインストールされている場合に関係するため、問題の一部になる可能性があります。その場合は、構成でdllPath構成変数を使用するのが簡単です。

<configuration>
  <Oracle.dataaccess.client> 
    <add key="DllPath" value="c:\Oracle\product\1.1.0-xcopy-dep\BIN"/>
  </Oracle.dataaccess.client>
</configuration>

さて、あなたの質問に直接答えてください-OracleがOracle.DataAccess.dllをそのクライアントと一致させないことをサポートしているとは思いません(少なくとも後方では)あなたの最善の策は、アプリのインストールでODP.netをインストールすることです- xcopy version は最小であり、「インスタントクライアント」が含まれます。または、最小システム要件について考える必要があります。システムには、少なくともバージョンXのodp.netがインストールされている必要があります。その後、ターゲットシステムに新しいバージョンのクライアントがある場合、その最小DLLに対してコンパイルし、パブリッシャーポリシーのリダイレクトに依存できます。

もちろん、これは私に建築について尋ねるようにも促します。ユーザーにOracleアカウントの入力を求める予定はありますか?そうでない場合は、アプリケーションが使用する共有サービスアカウントを保護する方法に注意する必要があります。クライアントに代わってOracle呼び出しを行うWebサービスを呼び出す方がよい場合があります。これにより、別のセキュリティ層が提供され、クライアントの展開が簡素化されます。

ほとんどのバージョンのODP.netは、データベースサーバーと下位互換性があります。10gデータベースで11gプロバイダーを確実に使用できます。

5
b_levitt

システムにクライアントまたはOracleインスタンスがインストールされている場合。フォルダ名を確認してください

Oracle_HOME\product\11.2.0\dbhome_1\ODP.NET\bin\2.x

ここにファイルがあります-Oracle.DataAccess.dll

参照に含めてください。

2

時々あなたはCould not load file or Assembly 'Oracle.DataAccess' or one of its dependencies.正しいDLLがあり、問題は別の場所にあります。

それは私にも起こり(このトピックはそれを理解するのに大いに役立ちました)、それはIIS)のアプリケーションプールの構成でした(32ビットアプリケーションを許可しない人(詳細設定))。

0
SabineA

Oracleサーバーがバージョン10.2以降の場合は、Oracle 12で提供されるマネージドODP.NETバージョンの使用を検討してください。

どうやら、それは10 MB未満の1つの依存関係です。 Oracle(インスタント)クライアントに依存するODP.NETバージョンに比べて、アプリケーションをさまざまなシステムに簡単にデプロイできるはずです。また、インストールされているOracleクライアントを気にする必要もなくなります。

しかし、彼らはそれが「.NET Framework 4.5.1の最新バージョンで動作する」と述べているので、私が理解していることから、アプリケーションを4.5.1にアップグレードする必要がありますが、おそらくそれは特定の機能(Entity Frameworkサポートなど)。

http://www.Oracle.com/technetwork/topics/dotnet/index-085163.html

0
Aaron

実際、正解はないと思います。それはすべて、アプリケーションを実行するプロセッサアーキテクチャ(ビット)、使用するOCIクライアントのバージョンなどに依存します。

Oracleの相互作用を1つのクラスにラップし、Reflectionを使用して使用可能なバージョンを見つけることが最も有用であることがわかりました。

バージョン番号について:ODP.netアセンブリのバージョンは、OCIクライアントインストールのバージョンと一致している必要があります。 12. * OCIクライアントと10. * ODP.netアセンブリを混在させるのは悪い考えです。

たぶん この記事 も参考になります。

0
Patrick Hofman