プロバイダーは、Oracleクライアントのバージョンと互換性がありません


157

ASP.netプロジェクトでOracle ODP.NET 11g(11.1.0.6.20)インスタントクライアントデータプロバイダーとして使用しようとしていますが、aspxページを実行すると「プロバイダーはバージョンと互換性がありませんOracleクライアントの "エラーメッセージ。任意の助けいただければ幸いです。

Visual Studio 2005でデータプロバイダーを参照しましたが、背後のコードは次のようになります。

using Oracle.DataAccess.Client;
..

OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
    "Data Source=MyOracleServerName;" +
    "Integrated Security=SSPI";
oOracleConn.Open();

//Do Something

oOracleConn.Close();

ページのエラーは次のようになります。

Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client

Source Error: 
Line 21: 
Line 22: 
Line 23:             OracleConnection oOracleConn = new OracleConnection();
Line 24:             oOracleConn.ConnectionString =
Line 25:                 "Data Source=MyOracleServerName;" +

[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
   Oracle.DataAccess.Client.OracleInit.Initialize() +494
   Oracle.DataAccess.Client.OracleConnection..cctor() +483

Stack Trace: 
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
   Oracle.DataAccess.Client.OracleConnection..ctor() +0
   Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

回答:


91

私はこの問題をさらに調査してきましたが、ODP.Netは同じダウンロードバージョンのODP.Netからすべての適切なDLLを取得し、Exeファイルと同じフォルダーに配置する必要があります。バージョン番号。

ここでこれを行う方法を説明しました:http : //splinter.com.au/using-the-new-odpnet-to-access-oracle-from-cここにそれの要点があります:

  • ODP.Netをダウンロード
  • ファイルを解凍します
  • その中のすべてのJARを解凍します
  • 解凍したこれらのdllを取得します。
    • oci.dll(「oci.dll.dbl」から名前変更)
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll(「ociw32.dll.dbl」から改名)
  • すべてのDLLをC#実行可能ファイルと同じフォルダーに配置します。

4
あなたの解決策は私にとってうまくいきました-私がこれを見つける前にあなたのブログ投稿を見つけました。あなたは男です。ありがとう!:-)また、ODACの最新バージョンを使用して、JARを解凍する必要はありませんでした。.dllファイルは、Oracleホームのさまざまなディレクトリにありました。単純なウィンドウ検索で、それらはすぐに見つかりました。
Pandincus、2010

10
また、開発マシンでは最新バージョンのODAC(11.2.0.1.2)を使用しており、必要なファイルはoci.dll、Oracle.DataAccess.dll、oraociei11.dll、OraOps11w.dllのみでした。Chrisが指摘するように、実行可能ファイルと同じフォルダーにあることを確認してください。;-)
Pandincus 2010

1
新しいバージョンのように聞こえると、DLLを見つけやすくなります。すごい!オラクルがそれらを1つの単純なDLLにまとめるまでの時間...
Chris

Chrisの戦略とPandincusのライブラリーセットは私に役立ちました。PowerShellを介してOracleクライアントを呼び出すので、ライブラリセットをPowerShell実行可能ディレクトリに配置します。
キルブレーカー、2011

1
可能であれば、最近はC#マネージドドライバーを使用する必要があります:)
Chris

47

最初にここですべてのx86 / x64トークを「無視」し、代わりにODP.NETマネージドドライバーを試してください(.Net v4 +を使用している場合)。

https://www.nuget.org/packages/Oracle.ManagedDataAccess/

https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

Oracle ODP.netマネージドドライバーとアンマネージドドライバー

アーキテクチャが問題とする「管理されていない」DLLはすべて避けてください。:D(Oracleについて)。

NuGetパッケージ(11gでも機能):

ここに画像の説明を入力してください

古い/手動の方法:

マネージライブラリを使用するように変換する方法については、以下をご覧ください。

  • まず、ここでの偉大なコードの比較である管理アンマネージドhttp://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • ODP.NET、Managed Driver Xcopyバージョンのみをダウンロードしたことを確認してください
  • ダウンロードしたzipファイルから、コピーしてプロジェクトディレクトリに貼り付けます。
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Oracle.ManagedDataAccess.dllへの参照を追加します
  • 両方のdllでexeがリリースされている(VS2010のアプリケーションフォルダーに追加されている)ことを確認します。

3
オラクルがついにフルマネージドのドライバーを手に入れたことは朗報です。その100mb dllを持ち歩くことは、実際の負担です。
Jafin 2013

1
管理されたドライバーは私にとって素晴らしい働きをします-それに移動して以来問題はありませんでした/プロジェクトをAnyCPUなどに戻すことができ、それは素晴らしい働きをします:)
Tod Thomson

5
誰もが知っているように、マネージプロバイダーは優れていますが、フルプロバイダーが許可する多くの機能が不足しています。つまり、Oracleの組み込み暗号化です。
Justin Skiles 14年

1
Oracleのドキュメントは控えめに言っても「散在」する傾向があります。サポートされていないいくつかのメソッドへの良いリンクがあります。さらに、ドライバー自体には、readmeいくつかの制限の概要を示すが付属しています。
ジャスティンスキーズ2014

2
マネージドドライバーの使用が最終的なソリューションです!型の不一致があったときに費やす時間は
いつもnitghtmareでした

35

私はインストールされ、.NET 2.0(11.1.0.6.20)用のOracleデータプロバイダを、私はインストールしていないOracleインスタント・クライアント(11.1.0.6.0)を

インストールしたところ、エラーが消えました!


3
クライアントをインストールする代わりに、4つのインスタントクライアントDLLをEXEと同じフォルダーに単にコピーできますか?(これらのファイル:oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris

2
@クリス:はい、できます。ただし、私の経験では、oci.dll、oranznzbb11.dll、oraociicus11.dll、oraops11w.dll、oracle.dataaccess.dllが必要です。
Pakman

私にとっては他の方法-クライアントをインストールしましたが、プロバイダーはインストールしませんでした
Ev。

33

これは、32ビットのOracleクライアントに対して64ビットの.NETランタイムを実行することで発生する可能性があります。これは、64ビットでアプリを実行しているサーバーで発生する可能性があります。.NETアプリを64ビットランタイムで実行します。VSのプロジェクトでCPUフラグを設定して、32ビットランタイムで実行できます。


ちょうどこれに遭遇しました。(32ビット)テストアプリで作業した後、IISに転職しました。関連するすべてのアセンブリを32ビットである必要はなく、32ビットのAppPoolに変更しました。
anton.burger 2011

22

ある種の要約を作ってみましょう:

「プロバイダーがOracleクライアントのバージョンと互換性がない」というエラーメッセージ、いくつかの理由で発生します。

  • Oracleクライアントがインストールされていません。この場合、エラーメッセージは間違いです。

    Oracle Data Provider for .NET(ODP.NET、つまりfile Oracle.DataAccess.dll)はOracle Instant Clientに含まれていないため、個別にインストールする必要があります(32ビットOracle Data Access Components(ODAC)または64ビットOracle Data Access Componentsからダウンロード( ODAC)ダウンロード)またはOracle Universal Installer(OUI)でオプションを選択する必要があります。

    Oracleデータプロバイダー> = 12.1をインストールする場合、プロバイダーはGACに自動的に登録されないことに注意してください。必要に応じて手動で登録する必要があります。OracleDoc 2272241.1を参照してください。

  • ODP.NETのバージョンが、インストールされているOracleクライアントのバージョンと一致しません。マイナーバージョン番号も確認する必要があります。たとえば、Oracle.DataAccess.dllバージョン4.112.3.0はOracle Client 11.2.0.4と互換性がありません。ODP.NETおよびOracleクライアントのバージョンを注意深く確認してください。および/またはsigcheckを使用できますoraociei*.dllOraOps*w.dll Oracleのクライアントのバージョンを取得します。

    異なる番号付けスキームに注意してください。ファイルバージョン4.112.3.0の意味:.NET Frameworkバージョン4、Oracleリリース11.2.0.3.x

    ODP.NETバージョン「1.x」、「2.x」、「4.x」があります。これらの番号は、Microsoft .NET Frameworkバージョン1.0.3705 / 1.1.4322、2.0.50727および4.0.30319に関連しています。バージョン「1.x」は、Oracle Client 11.1まで利用可能でした。バージョン「4.x」はOracle Client 11.2で導入されました

  • ODP.NETのアーキテクチャ(32ビットまたは64ビット)がアプリケーションアーキテクチャと一致しません。32ビットアプリケーションは、32ビットOracleクライアント/ODP.NETでのみ機能します。64ビットアプリケーションには、64ビットOracleクライアント/ODP.NETが必要です。(ODP.NETマネージドドライバーを使用する場合を除く

  • .NET Frameworkのバージョンが一致しません。たとえば、Target .NET Framework 2.0でアプリケーションをコンパイルする場合、ODP.NETバージョン4.xは使用できません。.NET Frameworkのターゲットバージョンは、ODP.NETのバージョン以上である必要があります。

  • バージョンOracle.DataAccess.dll開発マシン上では(つまりコンパイル時にロードされているバージョン)は、ターゲット・マシン上のバージョンよりも高くなっています。

  • は、ローカルで提供されるファイルよりもデフォルトで優先Oracle.DataAccess.dllされるGACから読み込まれる可能性があることに注意してください。

ソリューション

  • ODP.NETマネージドドライバーの使用を検討してください。これは、Oracleのページからダウンロードできます。64ビットのOracleデータアクセスコンポーネント(ODAC)ダウンロード。そこではOracle.ManagedDataAccess.dll、アプリケーションディレクトリにファイルをコピーするだけでよく、それ以外は必要ありません。32ビットと64ビットの両方で動作します。

  • *.csproj、それぞれ。*.vbproj次のようにODP.NETへの参照を編集します:

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>

    Version=...またはprocessorArchitecture=...などの属性は必須ではありません。アプリケーションはOracle.DataAccess.dll、選択したアーキテクチャとターゲットの.NETフレームワークに応じて適切にロードされます(適切にインストールされている場合) -> 100%検証されていません

  • ターゲットマシン上のOracleクライアントのバージョンがわからない場合(たとえば、お客様のマシンである可能性があります):上記のダウンロードページに移動し、Oracle Data Access Componentsの最小のXCopyバージョンをダウンロードします。zipを解凍し、Oracle.DataAccess.dllファイルのみをローカルマシンにコピーします。VSプロジェクトで、このDLL(ほとんどの場合は古い)を参照します。このDLLのバージョンは、アプリケーションが動作するODP.NETの最小バージョンです。アプリケーションを実行すると、GACの発行者ポリシーが実際にインストールされているバージョンにリダイレクトされます。

  • 単一のDLLを取得して特定のフォルダーにコピーするのは、賢いアプローチではないと思います。「ネイキッド」マシンで動作する可能性がありますが、ターゲットマシンにOracle製品がインストールされている場合は、バージョンの不一致のリスクが高くなります。マシンからOracle製品をアンインストールして、新規インストールを行います。見ていアンインストールする/完全にOracle 11gの(クライアント)を削除する方法を?それは本当にきれいな機械を得るために命じます。

  • 32ビットと64ビットのアプリケーションを同時に操作する必要がある場合は、次の手順に従って、1つのマシンに両方のバージョンをインストールします。

前提条件:Oracleホームはと呼ばれOraClient11g_home1、クライアントバージョンは11gR2です。

  • オプションで、インストール済みのOracleクライアントを削除します

  • Oracle x86クライアントをダウンロードしてインストールします。 C:\Oracle\11.2\Client_x86

  • Oracle x64 Clientをダウンロードして別のフォルダにインストールします。 C:\Oracle\11.2\Client_x64

  • コマンドラインツールを開き、通常はフォルダー%WINDIR%\ System32にC:\Windows\System32移動ora112し、フォルダーへのシンボリックリンクを作成しますC:\Oracle\11.2\Client_x64(以下を参照)

  • フォルダー%WINDIR%\ SysWOW64に変更し、通常C:\Windows\SysWOW64ora112フォルダーへのシンボリックリンクを作成しますC:\Oracle\11.2\Client_x86(以下を参照)

  • 変更しPATH、環境変数を同様にすべてのエントリを置き換えるC:\Oracle\11.2\Client_x86C:\Oracle\11.2\Client_x64によりC:\Windows\System32\ora112、それぞれその\binサブフォルダ。注:C:\Windows\SysWOW64\ora112PATH環境であってはなりません。

  • 必要に応じて、yor ORACLE_HOME環境変数をC:\Windows\System32\ora112

  • レジストリエディタを開きます。レジストリ値HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112

  • レジストリ値HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112(ではないC:\Windows\SysWOW64\ora112)に設定します

  • 完了です!これで、x86とx64 Oracleクライアントをシームレスに一緒に使用できます。つまり、x86アプリケーションはx86ライブラリーをロードし、x64アプリケーションはシステムをさらに変更することなくx64ライブラリーをロードします。

シンボリックリンクを作成するコマンド:

cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86

いくつかのメモ:

  • 両方のシンボリックリンクは同じ名前でなければなりませんora112

  • 後でODP.NETを手動でインストールする場合は、インストールに適切なフォルダーを選択するように注意してください。

  • その名前にもかかわらず、フォルダーC:\Windows\System32にはx64ライブラリーがC:\Windows\SysWOW64含まれていますが、x86(32ビット)ライブラリーが含まれています。混乱しないでください。

  • たぶん、TNS_ADMIN環境変数(TNS_ADMINレジストリのエントリなど)を共通の場所(たとえば)に設定するのが賢明なオプションでしょうTNS_ADMIN=C:\Oracle\Common\network


このIMOには、実際の答えよりも多くの知識があります。したがって、.net 4用のx86アプリケーションがあり、データベースのバージョンが9iである場合、32ビットまたは64ビットのWindowsを使用している場合、ユーザーはどのクライアントバージョンを使用する必要がありますか?Oracleは、どのクライアントバージョンもどのdbバージョンとも互換性があると述べています。32ビットユーザーが32ビットバージョンをインストールし、64ビットユーザーが64ビットバージョンをインストールし、ODP.NETマネージドドライバーを使用して、どのOSと通信しているのかを判断する答えはありますか?
ルミナス

1
ODP.NETマネージドドライバーを使用する場合、Oracleクライアントをインストールする必要はありません。これが主な利点です。x86とx64の両方のアプリケーションで動作します。「ODP.NETマネージドドライバー」を使用しない場合、x86アプリケーションには、データベースサーバーアーキテクチャの種類に関係なく、x86(32ビット)Oracleクライアントも必要です。
Wernfried Domscheit 2014

「Microsoft Visual C ++ 2010再頒布可能パッケージをインストールする必要があります」に遭遇しました。これを要約に追加する必要があります。
Jay Sullivan、

1
このエラーはOracleまたはODP.NETに関連または原因があるとは思いません
Wernfried Domscheit

それは私がインストールし、私の作品Oracle.DataAccess.dllnugetパッケージからOracle.DataAccess.x86、そのDLLのバージョンがあり2.112.1.0、私はバージョンを使用してOracle Clientをインストール一致するので、Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) ここは その問題を解決しました!
ユー

6

数時間のトラブルシューティングを行った後、この問題はプロジェクトのbinディレクトリにOracle.DataAccess.dll(v4.0)が含まれていることが原因であることがわかりましたが、ランタイムもGACからOracle.DataAccess.dll(v2.x)をロードしています。プロジェクト参照のOracle.DataAccessエントリを削除して再度追加すると、問題が解決しました。

ここで言及されている他のファイルは、私の状況では必要ないようです。

更新

「プロバイダーがOracleクライアントのバージョンと互換性がない」というエラーの根本的な原因は、(一般的に)マネージアセンブリがバージョンと一致しないアンマネージライブラリをロードしようとしていることです。web.configでライブラリパスを指定することにより、Oracleドライバーに正しいライブラリを使用させることができるようです1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>

ありがとう!あなたの解決策は2日後に機能するという考えを与えます(私はVisual Studio 2010 Net 4、Oracle 10gクライアントを持っています)...私はGACを見て、もちろん私はOracle.DataAccess.dllの3つのバージョンをインストールしました、私はすべてをアンインストールしました(そして「DbProviderFactories」の無効なmachine.configキーを削除し、ODAC1120320 x64のみを再インストールします。そしてそれは機能します。
Hernaldo Gonzalez 2014

5

ターゲットマシンにODP.Netをインストールすると、問題が解決するはずです... DLLをコピーするのは良い考えではありません...


5

Oracle 11g(11.1.0.7.20)の場合、Exeとともに次のDLLを追加して機能させる必要がありました。

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll(30MBにかなり大きい)
  4. Oracle.DataAccess.dll

130 MB
Elmue 2017

2

Oracle Istant ClientでODPを使用している場合でも、ODPが実際のOracle Clientを代わりに使用しようとしているように思われます。マシンに標準のOracleクライアントもインストールされていますか?同じマシン上の複数のクライアントに関しては、Oracleがかなりうるさいことを覚えています。


2

私はまったく同じ問題を抱えていました。アプリケーションをコンパイルした後、oraociei11.dllを削除しました(削除したことを忘れていました)。そして、実行しようとしたときにこのエラーを出していました。そのため、oraociei11.dllというDLLが見つからない場合、このエラーが表示されます。このエラーが発生するケースは他にもあるかもしれませんが、これはそれらの1つであるようです。


2

また、IISアプリケーションプールの32ビットのtrueまたはfalseフラグを有効にするを探します。このメッセージが表示されたら、いくつかのオラクルフォーラムから指示がありました。


2

私は同じ問題を抱えていますが、私の場合、dllをbinフォルダーに単にコピーすることはできません。その後、アセンブリバージョンのみを「再バインド」します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>    
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
        <bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

2

3時間以上続いたこの問題を解決するために私がしたことは次のとおりです。

  1. あるOracleホームの下に、Windows 64ビット用のビットを以前にインストールした場所とC:\oracle\product\11.2.0呼ばれるフォルダがclient_1ありましたODP.NET

  2. 後でVisual Studio 2012でASP.NET Web APIアプリをデバッグしようとすると、次のエラーメッセージが表示され続けました:プロバイダーはOracleクライアントのバージョンと互換性がありません

  3. Googleを検索したところ、ODP.NET64ビットを使用していたため、これが発生していることがわかりました。次にODP.NET、Windows 32ビットを入手してインストールしましたが、同じエラーメッセージが表示され続けました。

  4. client_1解決策フォルダを削除し、ODP.NET32ビットを再インストールしました。インストーラーは、64ビットバージョンのビットと32ビットバージョンのビットを混在させていました。図に行く...

  5. これでまた幸せになり、新しいを開くことができますOracleConnection。最後に!:)


2

この問題をまだ抱えている人のために:この記事に基づいて

http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html

サーバーにMicrosoft C ++ Visual Runtime Libraryがないことがわかりました。VisualStudioがインストールされているため、開発マシンにインストールしました。ライブラリの(現在)最新バージョンをここからダウンロードしてインストールしました。

http://www.microsoft.com/en-us/download/details.aspx?id=13523

セットアップを実行し、C#からのoracle呼び出しで成功しました!


1
おい…オラクル……ちょっと話してもいい?角に来て 聞いてくれ、私は一日中、「プロバイダ互換性がない」という地獄が何を意味するのかを理解するのに費やしました。いいえ-いいえ-私は、インストール時にこれらの依存関係をインストーラーに確認せ、満たされていない場合はユーザーに警告することを要求します。ありがとう。
Jay Sullivan

3
ところで、私は何度もこのスタックオーバーフローの質問に戻る必要があり、毎回異なる答えが当てはまります。これにより、時間とお金が無駄になりました。
Jay Sullivan

2

TLDRバージョン:

  • 12c 100%マネージドプロバイダーを使用する代わりに。
  • 古いプロバイダーを使用する必要がある場合は、Oracle.DataAccess.dllが正しいバージョンのアンマネージOracleクライアントDLLを指すようにする必要があります。マシンに複数のOracleクライアントがインストールされていて、アプリ構成に「DllPath」構成変数(以下を参照)を含めるだけの簡単な場合がありますが、新しい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環境変数で指定されたディレクトリ。

したがって、あなたの場合、アプリは上記のプロセスに従い、使用しているOracle.DataAccess.dllアセンブリに対して相対的に古すぎる、管理されていないdllを含むパスを見つけました。

そのマシンにインストールされている唯一のOracleクライアントが古すぎる可能性があります。ただし、これは、マシンに複数のクライアントがインストールされていて、管理されていないファイルが最初に別の古いインストールで見つかった場合に役立ちます。後者の場合は、構成でdllPath構成変数を使用して、正しいOracleホームBinフォルダを指すようにするのが簡単です。

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

クライアントの新しいコピーをインストールする場合は、xcopyバージョンが最も小さく、「インスタントクライアント」が含まれており、上のDllPathがこの新しい場所を指すようにします。ただし、Oracleクライアントのインストールは機能します。

しかし、このアンマネージクライアントの解決策をすべて回避したい場合は、代わりに100%マネージプロバイダーを使用するようにアプリを更新できるかどうかを確認してください。アンマネージファイルに依存することなく、1つまたは2つのマネージアセンブリにすぎません。

binディレクトリとGACの両方にインストールされている場合は、Oracle.DataAccess.dllがロードされていない可能性もありますが、それはあまりありそうもないシナリオだと思います。詳細については、アセンブリの解決プロセスを参照してください。


1

IIS / IWAMユーザーはOracleディレクトリに対する権限を持っていますか?ExcelやAccessなどの別のアプリを使用してこのデータソースに接続できますか?


1

ネットワーク共有上のOracle.Data.dllアセンブリがDBAによって更新されたため、同じ問題が発生しました。プロジェクトから参照を削除し、再度追加すると問題が解決しました。


1

この問題を解決するための2つのステップ。

  1. アプリケーションプールの詳細設定に移動し、「32ビットアプリケーションを有効にする」フラグをTrueに設定します。
  2. Bin内のすべてのDLLが32ビットバージョンであることを確認してください...

幸運を祈ります。


@ mazhar-abbas、よろしくお願いします。「32ビットアプリケーションを有効にする」を設定できる場所を指摘してください。IISとプロジェクトのどちらにありますか?
hiFI 2014

1

新しいDLLを入手する道を歩みませんでした。完璧に機能する既存のプロジェクトがたくさんあり、頭痛の種を与えていたのは私の新しいプロジェクトだけだったので、別の方法を試すことにしました。

私のプロジェクトは、Oracle.DataAccess.dllに依存する内部開発のInternal.dllを使用していましたv4.112.3.0。何らかの理由で、公開時にVisual Studioは常にアップロードされましたv4.121.0.0、構成ファイルで明示的に指定されていませんでした。そのため、エラーが発生しました。

だから私がしたことは:

  1. /bin安全に実行するために、正常に実行されているプロジェクトの1つからWebサイトにInternal.dllをコピーしました。
  2. 正常に実行されているプロジェクトの1つから自分のWebサイトにOracle.DataAccess.dllをコピーしました/bin
  3. 私のWebサイトから両方に参照を追加します。
  4. 最後にOracle.DataAccess参照がで現れたmyWebSite.csprojが、それは間違ったバージョンを示した:v4.121.0.0代わりにv4.112.3.0
  5. で参照を手動で変更したmyWebSite.csprojので、次のようになりました。

    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>bin\Oracle.DataAccess.dll</HintPath>
    </Reference> 

2
binフォルダーにdllへの参照を追加することは、本当に悪い考えです。
Jay Sullivan

1
フォルダがあり、出力フォルダ。これは、プロジェクトをビルドするときにDLLが移動する場所です。これらのフォルダは、競合を発生させることなくいつでも削除できるはずです。通常、これらのフォルダはソース管理では無視されます。標準的な方法は、参照されるDLLを置くフォルダを作成することです。binobjExternal References
Jay Sullivan

@notfedあなたは正しいようです。これを私の心に留めておきます。
Robotron、2015年

名前のとおり、これはコンパイラーのヒントパスにすぎず、強制的な参照ではありません。まず、GACでOracle.DataAccess.dllが検索されます。HintPath完全に削除しても動作するはずです。
Wernfried Domscheit 2015

1

この問題は、Oracle Data Tools for Visual Studio 2015をインストールした後、Oracleと十分な時間をかけて戦いました。私は、ファイルのコピーや構成の変更などを伴うこの混乱の代わりに、Oracleクライアントを再インストールしてみることにしましたが、それでうまくいきました。


1

私は同様の問題に直面し、根本的な原因は、GACに2つのoracle.dataaccessバージョン、つまりv4.0_4.112.2.0とv4.0_4.112.4.0があったことです。私のアプリケーションはv4.0_4.112.2.0を参照していたため、GACからv4.0_4.112.4.0を削除したところ、問題なく動作しました。

GACパス:C:\ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

前 : ここに画像の説明を入力してください

後: ここに画像の説明を入力してください

バージョンを削除するには、GACから対応するフォルダーを削除するだけです。


0

最近、私はソリューションと含まれるすべてのプロジェクトがx32プラットフォームを対象とした古いプロジェクトに取り組む必要がありました。私はOracle.DataAccess.dllと他のすべての推奨Oracleファイルをすべての場所にコピーしようとし続けましたが、毎回壁にぶつかりました。最後に、ヘッドの電球が点灯し(8時間後:))、インストールされているODACアセンブリとそのプラットフォームを確認するように求められました。64ビット(x64)ODACクライアントはすべてインストール済みですが、32ビット(x32)クライアントはインストールしていません。32ビットODACをインストールし、問題は解消しました。

インストールされているODACのバージョンを確認する方法:フォルダーC:\ Windows \ assemblyを確認します。「Processor Architecture」プロパティは、インストールされているODACをプラットフォームに通知します。

電球が点灯するまでの時間は8時間です。私はいつも仕事でスローガンしなければならないのも不思議ではありません:)。


注、C:\Windows\assemblies.NET Frameworkバージョン2.0までのアセンブリのみを示しています。バージョン3.xの/ 4.xの表示されていない、見stackoverflow.com/questions/28213105/...
Wernfried Domscheit

0

クリスの解決策も私にとってうまくいきました。ただし、次のようなエラーメッセージが表示されました。

Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.

どうやら、Oraclishの外国語では、プログラムがすべてのプラットフォームまたは32ビットマシンをターゲットにしていることを意味します。プロジェクトのプロパティでターゲットプラットフォームを64ビットに変更するだけで、最高の結果が期待できます。


3
これは実際には.NETishであり、Oraclishではありません
Jay Sullivan

0

Oracle.DataAccess.dll v4.121.2.0でも同じ問題が発生しました。2家のインストール(32および64ビットバージョン)。32ビットバージョンはworkerd、64ビットバージョンはしませんでした。

私の場合(2日間試行した後)、問題は64ビットホームバージョンのアクセス許可にあることがわかりました。そのバージョンの多くのディレクトリには、「Authenticated Users」の役割に「読み取り」アクセス権がなく、親ディレクトリにデフォルトで設定されているアクセス許可のみが上書きされていました。これらのサブディレクトリには、「bin」、「network / admin」、「nls」、「oracore」、「RDBMS」などが含まれていました。sysinternalsの "Process Monitor"(Procmon.exe)ユーティリティで "ACCESS DENIED"の結果を除外することでそれらを見つけました。アクセス許可が親ディレクトリから子サブディレクトリに継承されると、すべてが機能し始めました。

私はOracleホーム全体の権限をオーバーライドするために何もしなかったので、一度に1つのディレクトリを作成しましたが、セキュリティについてそれほど心配しない場合は、対応するOracleホームディレクトリ全体でそれをリセットできます。



-3

ここには理論的な答えがたくさんありますが、すぐにコピーして貼り付けてテストできるコードを使用した実際の例を次に示します。

  1. Oracle ExpressデータベースOracleXE112をインストールしました。これには、いくつかのプレインストールされたデモテーブルが付属しています。
  2. インストーラーを起動すると、パスワードの入力を求められます。パスワードに「xxx」を入力しました。(生産では使用されません)
  3. 私のサーバーはマシン192.168.1.158で実行されています
  4. サーバーでは、Windows ファイアウォールでプロセスTNSLSNR.exeへのアクセスを明示的に許可する必要があります。このプロセスはポート1521でリッスンします。以下のコードからタイムアウトエラーが発生した場合は、ファイアウォールを確認してください。
  5. オプションA: C#(.NET2または.NET4)の場合、ODAC11をダウンロードできます。ここから、プロジェクトにOracle.DataAccess.dllを追加する必要があります。さらに、このDLLは、OraOps11w.dll、oci.dll、oraociei11.dll(130MB!)、msvcr80.dllに依存しています。これらのDLLは、EXEと同じディレクトリにあるか、DLLパスを次の場所に指定する必要があります。HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath。64ビットマシンでは、さらに書き込みますHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. オプションB:ODAC12をダウンロードした場合は、Oracle.DataAccess.dll、OraOps12w.dll、oci.dll、oraociei12.dll(160MB!)、oraons.dll、msvcr100.dllが必要です。レジストリパスはHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. オプションC: 100 MBを超える巨大なDLLが必要ない場合は、ODP.NET_Managed12.xxxxxxxx.zipをダウンロードしてください。Oracle.ManagedDataAccess.dllは、わずか4 MBであり、32ビットおよび64ビットプロセスで動作する純粋なマネージDLLです。同様に、他のDLLに依存せず、レジストリエントリを必要としません。
  8. 次のC#コードは、サーバー側で構成を行わなくても機能します(デフォルトのインストールのみ)。
Oracle.DataAccess.Clientを使用します。
または
Oracle.ManagedDataAccess.Clientを使用します。

....

string oradb = "Data Source =(DESCRIPTION ="
    + "(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.1.158)(PORT = 1521)))"
    + "(CONNECT_DATA =(SERVER = DEDICATED)));"
    + "ユーザーID = SYSTEM;パスワード= xxx;";

使用(OracleConnection conn = new OracleConnection(oradb)) 
{
    conn.Open();
    使用(OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "DBA_DATA_FILESからTABLESPACE_NAMEを選択";

        (OracleDataReader dr = cmd.ExecuteReader())を使用
        {
            while(dr.Read())
            {
                listBox.Items.Add(dr ["TABLESPACE_NAME"]);
            }
        }
    }
}

実行中のクライアントだけが必要なときに、Oracleデータベースサーバー全体をインストールするのはかなりやりすぎです。
Wernfried Domscheit 2017

とにかくあなたの答えは貧しい。Oracle dllをアプリケーションディレクトリにコピーする必要はありません。デフォルトのインストールでは、それらを‰PATH%から見つけます(自分で変更しない限り)。Registyヒントは.version 4.xにのみ適用され、 32ビットOracleクライアント。ただし、32ビットと64ビットのミスマッチがこの質問の主なトピックです
Wernfried Domscheit

コメントは、私の答えを読んでいないことを示しています。Oracleサーバーと通信するアプリケーションを作成したい場合、Oracleから何かをインストールする必要はありません。上記のDLLを使用して、アプリケーションに配布します。したがって、エンドユーザーのマシンのPATH変数には何もありません。ちなみに、PATH変数(1980年からの古いDOS時代に由来)の使用は、最新のソフトウェアでは非推奨です。私の回答では、レジストリパスを必要とせず、32ビットまたは64ビットに依存しないOPTION Cを推奨しています。完全を期すために、オプションAとBについてのみ言及しました。
Elmue 2017

適切な%PATH%設定がないと、Windowsはまったく機能しないと思います。バージョン10であっても、アプリケーションでOracle dllを手動でコピーするのは賢明ではないと私は答えました。私はこれらのDLLのソースコードを知らないが、私はしてトレースを行うと、より例えばあなたが表示されていない顧客側の依存関係、言語設定、文字セット、時間帯などによってトリガがあるかもしれませんOracle.DataAccess.dllそして、プログラムは合計35個のOracle DLLをロードします!もちろん、ODP.NETマネージドドライバーを使用しない限り、Oracleクライアントの通常のインストールを行うことをお勧めします。
Wernfried Domscheit 2017

1
私は私の懸念に言及したと思います:(1)データベースをインストールすることは役に立たない、すなわち過剰です。(2)オプションAとBは、特定の条件下でのみ機能します。たとえば、レジ​​ストリからNLS-Settingsを読み取らない(ファイルが必要な場合oracle.key)。互換性のために、マイナーバージョンも考慮する必要があります。たとえばOracle.DataAccess, Version=2.112.2.0OraOps11w.dllバージョン2.112.4.0 では機能しません。
Wernfried Domscheit 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.