Oracle ODP.NET 11g(11.1.0.6.20)Instant ClientをASP.netプロジェクトでData Providerとして使用しようとしていますが、 aspxページ「Theプロバイダーは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
Oracle Data Provider for .NET 2.0(11.1.0.6.20)のみをインストールし、Oracle Instant Client(11.1.0.6.0)をインストールしませんでした。
インストールしたばかりでエラーが消えました!
私はこの問題をさらに調査してきましたが、ODP.Netはミキシングしないことにうるさいため、ODP.Netの同じダウンロードバージョンからすべての適切なDLLを取得し、Exeファイルと同じフォルダに配置するだけです。バージョン番号。
ここでこれを行う方法を説明しました: http://splinter.com.au/using-the-new-odpnet-to-access-Oracle-from-c ここにその要点があります:
最初にここですべてのx86/x64トークを「無視」し、代わりにODP.NET Managed Driverを試してください(.Net v4 +を使用している場合):
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
Oracle ODP.net Managed vs Unmanaged Driver
すべての「アンマネージド」なDLLアーキテクチャの問題を避けてください! :D(約Oracle)。
NuGetパッケージ(11gでも動作):
古い/手動の方法:
managedライブラリを使用するように変換する方法に関する情報:
これは、32ビットOracleクライアントに対して64ビット.NETランタイムを実行することにより発生する可能性があります。これは、サーバーで64ビットでアプリを実行している場合に発生する可能性があります。 64ビットランタイムで.NETアプリを実行します。 VSのプロジェクトでCPUフラグを設定して、32ビットランタイムで実行できます。
ある種の要約を作成しましょう。
エラーメッセージ "プロバイダはOracleクライアントのバージョンと互換性がありません"はいくつかの理由で発生する可能性があります。
Oracle Clientがインストールされていません。この場合、エラーメッセージは確かに誤解を招きます。
Oracle Data Provider for .NET(ODP.NET、つまりファイルOracle.DataAccess.dll
)はOracle Instant Clientに含まれていません。別途インストールする必要があります( 2ビットOracle Data Access Components(ODAC) または 64ビットOracle Data Access Components(ODAC)ダウンロード )または、Oracle Universal Installer(OUI)のオプションに従って選択する必要があります。
Oracle Data Provider> = 12.1をインストールする場合、プロバイダーはGACに自動的に登録されません。必要に応じて手動で登録する必要があります。OracleDoc 2272241.1 を参照してください。
ODP.NETのバージョンが、インストールされているOracle Clientのバージョンと一致しません。マイナーバージョン番号も確認する必要があります。たとえば、Oracle.DataAccess.dll
バージョン4.112.3.0はOracleクライアントと互換性がありません11.2.0.4。 ODP.NETおよびOracle Clientのバージョンを慎重に確認してください。 oraociei*.dll
またはOraOps*w.dll
で sigcheck を使用して、Oracle Clientのバージョンを取得できます。
異なる番号付けスキームに注意してください。ファイルバージョン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 Client/ODP.NETでのみ動作します。64ビットアプリケーションには64ビットOracle Client/ODP.NETが必要です。 (ODP.NET Managed Driverを使用しない限り)
.NET Frameworkのバージョンが一致しません。たとえば、Target .NET Framework 2.0でアプリケーションをコンパイルする場合、ODP.NETバージョン4.xは使用できません。 .NET Frameworkのターゲットバージョンは、ODP.NETのバージョン以上である必要があります。
開発マシンのOracle.DataAccess.dll
のバージョン(つまり、コンパイル中にロードされるバージョン)は、ターゲットマシンのバージョンよりも高いです。
Oracle.DataAccess.dll
は GAC からロードされる可能性があることに注意してください。デフォルトでは、ローカルで提供されるファイルよりも優先されます。
ソリューション
ODP.NET Managed Driverの使用を検討してください。Oracleページからダウンロードできます: 64ビットOracle Data Access Components(ODAC)Downloads 。そこでは、Oracle.ManagedDataAccess.dll
ファイルをアプリケーションディレクトリにコピーするだけでよく、他には何も必要ありません。 32ビットと64ビットの両方で機能します。
*.csproj
で、それぞれ。 *.vbproj
ODP.NETへの参照を次のように編集します。
<Reference Include="Oracle.DataAccess">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
</Reference>
Version=...
やprocessorArchitecture=...
などの属性は必要ありません。 アプリケーションは、選択したアーキテクチャとターゲット.NETフレームワークに応じて、適切な -> 100%検証されていませんOracle.DataAccess.dll
をロードします(適切にインストールされている場合)
ターゲットマシン上のOracleクライアントのバージョンがわからない場合(たとえば、お客様のマシンである可能性があります):上記のダウンロードページに移動し、最小XCopyOracle Data Access Componentsのバージョン。 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 Clientをダウンロードして、たとえば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\SysWOW64
)に変更し、フォルダーora112
へのシンボリックリンクC:\Oracle\11.2\Client_x86
を作成します(以下を参照)
PATH
環境変数を変更し、C:\Oracle\11.2\Client_x86
やC:\Oracle\11.2\Client_x64
などのすべてのエントリをそれぞれC:\Windows\System32\ora112
サブフォルダーである\bin
に置き換えます。注:C:\Windows\SysWOW64\ora112
をPATH環境に含めることはできません。
必要に応じて、yor Oracle_HOME
環境変数をC:\Windows\System32\ora112
に設定します
レジストリエディターを開きます。レジストリ値HKLM\Software\Oracle\KEY_OraClient11g_home1\Oracle_HOME
をC:\Windows\System32\ora112
に設定します
レジストリ値HKLM\Software\Wow6432Node\Oracle\KEY_OraClient11g_home1\Oracle_HOME
をC:\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
に設定するのが賢明なオプションかもしれません。
Oracle 11g(11.1.0.7.20)の場合、次のdllをExeとともに追加して動作させる必要がありました。
oDP.Netをターゲットマシンにインストールすると、問題が解決するはずです... dllをコピーすることはお勧めできません...
これに3時間を費やした後、私の問題は単に:
OraOps11w.dllがありません
「プロバイダはOracleクライアントのバージョンと互換性がありません」というエラーメッセージが表示されるのはなぜですか? Oracleによるコーディング/テストの質が低いことが必要です。 1994年からOracleを使用し、2002年から.Netで何度も使用しています。それは事実上常に苦痛です。
誰もがOracleをアンインストールし、上記のChrisのソリューションに従ってください(トップアンサー)。それは毎回動作するはずです
StackOverflowの別の投稿から、これはOracleをアンインストールする方法です(正常に動作しないため、Oracleアンインストールツールを忘れてください)。
Chrisは私よりもDLLが少ない Server 2003(32ビット)。これは私が持っているものです:
C:\Oracle\instantclient>dir /b
oci.dll
ociw32.dll
Oracle.DataAccess.dll
orannzsbb11.dll
oraocci11.dll
oraociei11.dll
OraOps11w.dll
Orasqlplusic11.dll
sqlplus.exe
tnsnames.ora
C:\ Oracle\instantclientは、グローバルパスおよびOracle_HOME環境変数にあります。 .Netコード参照C:\ Oracle\instantclient\Oracle.DataAccess.dll
数時間のトラブルシューティングの後、この問題はプロジェクトの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>
Oracle Istant ClientでODPを使用していても、ODPは実際のOracle Clientを代わりに使用しようとしているように思えます。マシンにも標準のOracleクライアントがインストールされていますか?同じマシン上の複数のクライアントに関して、Oracleが非常にうるさいことを思い出します。
以下は、この問題を3時間にわたって解決するために行ったことです。
C:\Oracle\product\11.2.0
にあるOracleホームの下に、以前にWindows 64ビット用のclient_1
ビットをインストールしたODP.NET
というフォルダーがありました。
後でVisual Studio 2012でASP.NET Web APIアプリをデバッグしようとしたときに、次のエラーメッセージが表示され続けました:The provider is the version of the Oracle client。
Googleを検索すると、ODP.NET
64ビットを使用していたため、これが起こっていることがわかりました。その後、Windows 32ビット版のODP.NET
を取得してインストールしましたが、同じエラーメッセージが表示され続けました。
SOLUTION:フォルダclient_1
を削除し、ODP.NET
32ビットを再インストールしました。インストーラーは、64ビットバージョンのビットと32ビットバージョンのビットを混在させていました。図を行く...
これで再び幸せになり、新しいOracleConnection
を開くことができます。最後に! :)
まだこの問題を抱えている方へ:この記事に基づいて
http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html
サーバーにMicrosoft C++ Visual Runtime Libraryがないことがわかりました-Visual Studioがインストールされているため、開発マシンに持っていました。ここからライブラリの(現在の)最新バージョンをダウンロードしてインストールしました。
http://www.Microsoft.com/en-us/download/details.aspx?id=1352
セットアップを実行し、C#からのOracle呼び出しが成功しました!
私はまったく同じ問題を抱えていました。アプリケーションのコンパイル後にoraociei11.dllを削除しました(削除したことを忘れました)。そして、実行しようとしたときにこのエラーが発生していました。したがって、oraociei11.dllというDLLを見つけることができない場合、このエラーが表示されます。このエラーが発生する場合は他にもあるかもしれませんが、これはそのうちの1つと思われます。
TLDRバージョン:
完全版:
まず、古い管理されていないプロバイダー(新しい12c 100%管理プロバイダーではない)のコンポーネントを理解していることを確認しましょう。次の2つの部分で構成されています。
簡単に言えば、Oracle.DataAccess.dllはほぼ単なるラッパーであり、.net命令を管理対象外クライアントのOracle-NET命令に変換します。
つまり、Oracle.DataAccessをロードすると、必要なアンマネージクライアントdllを見つけようとする順序があります。 Oracleドキュメント から:
Oracle.DataAccess.dllは、次の順序に基づいて、依存するアンマネージDLL(Oracle Clientなど)を検索します。
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 Clientが古すぎるということだけかもしれません。ただし、マシンに複数のクライアントがインストールされており、管理されていないファイルが別の古いインストールで最初に見つかった場合に、これが機能します。後者の場合、実行する簡単なことは、構成でdllPath構成変数を使用し、正しいOracle Home Binフォルダを指すようにすることです。
<configuration>
<Oracle.dataaccess.client>
<add key="DllPath" value="c:\Oracle\product\1.1.0-xcopy-dep\BIN"/>
</Oracle.dataaccess.client>
</configuration>
クライアントの新しいコピーをインストールする場合、 xcopy version が最小であり、「インスタントクライアント」が含まれ、上記のDllPathがこの新しい場所を指すようにします。ただし、Oracleクライアントのインストールはすべて機能します。
しかし、このアンマネージドクライアントの解決をすべて回避したい場合は、代わりに100%マネージドプロバイダーを使用するようにアプリを更新できるかどうかを確認してください-マネージドファイルに依存しない、1つまたは2つのマネージドアセンブリだけです。
また、binディレクトリとGACの両方にインストールされていると思われるOracle.DataAccess.dllをロードしていない可能性もありますが、それはあまりありそうもないシナリオだと思います。詳細については、 アセンブリ解決プロセス を参照してください。
また、IIS Application pool Enable 32ビットのtrueまたはfalseフラグを探してください。このメッセージが表示された場合、Oracleフォーラムがこれを指示しました。
この問題を解決するためのわずか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>
新しいDLLを入手する道をたどりませんでした。完璧に機能する既存のプロジェクトがたくさんありましたが、頭痛の種になったのは私の新しいプロジェクトだけだったので、他のことを試してみることにしました。
私のプロジェクトは、Oracle.DataAccess.dll v4.112.3.0
に依存する内部的に開発されたInternal.dllを使用していました。何らかの理由で、公開時にVisual Studioは、v4.121.0.0
を常にアップロードしましたが、どの構成ファイルでも明示的に指定されていませんでした。そのため、エラーが発生していました。
だから私がやったことは:
/bin
にコピーしました(念のため)。/bin
にコピーしました。myWebSite.csproj
に表示されましたが、間違ったバージョン:v4.121.0.0
ではなくv4.112.3.0
が表示されました。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>
Visual Studio 2015用のOracle Data Toolsをインストールしてから、Oracleとの1時間の戦いの後、この問題が発生しました。ファイルのコピー、構成の変更などを行うこの混乱の代わりに、Oracleクライアントを再インストールすることにしました。
IIS/IWAMユーザーには、Oracleディレクトリに対する権限がありますか? ExcelやAccessなどの別のアプリを使用して、このデータソースに接続できますか?
ネットワーク共有上のOracle.Data.dllアセンブリがDBAによって更新されたため、同じ問題が発生しました。プロジェクトから参照を削除して再度追加すると、問題は解決しました。
最近、私はソリューションと含まれるすべてのプロジェクトがx32プラットフォームを対象とした古いプロジェクトで作業しなければなりませんでした。私はOracle.DataAccess.dllと他のすべての推奨Oracleファイルをすべての場所にコピーしようとし続けましたが、毎回壁にぶつかりました。最後に、頭部の電球が点灯し(8時間後:))、インストールされたODACアセンブリとそのプラットフォームを確認するように求められました。 64ビット(x64)ODACクライアントはすべてインストール済みですが、32ビット(x32)のものはインストールされていません。 32ビットODACをインストールすると、問題はなくなりました。
インストールされたODACのバージョンを確認する方法:C:\ Windows\Assemblyフォルダーを探します。「Processor Architecture」プロパティは、インストールされたODACのプラットフォームを通知します。
8時間は電球が点灯するのに長い時間です。私はいつも職場でスローしなければならないのも不思議ではありません:)。
Chrisのソリューションも同様に機能しました。ただし、次のエラーメッセージが表示されました。
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ビットに変更するだけで、最適な結果が得られます。
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ホーム・ディレクトリ全体でリセットできると思います。