プロバイダーはOracleクライアントのバージョンと互換性がありません
-
20-08-2019 - |
質問
ASP.netプロジェクトで Oracle ODP.NET 11g(11.1.0.6.20)Instant Client をデータプロバイダーとして使用しようとしていますが、 aspxページを実行すると、<!> quot; プロバイダはOracleクライアントのバージョンと互換性がありません <!> quot;エラーメッセージ。助けていただければ幸いです。
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
解決 3
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 ただし、その要点は次のとおりです。
- 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#実行可能ファイルと同じフォルダーに入れます
<!> quot; ignore <!> quot;すべての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マネージドドライバーとアンマネージドドライバー
すべての<!> quot; unmanaged <!> quot;どのDLLがどのアーキテクチャを発行するか! :D(約Oracle)。
NuGetパッケージ(11gでも動作します):
古い/手動の方法:
マネージドライブラリを使用するように変換する方法に関する情報:
- まず、 managed と unmanaged の優れたコード比較を次に示します。 http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
- ODP.NET、マネージドドライバーXcopyバージョンのみをダウンロードしたことを確認
- ダウンロードしたzipファイルから、プロジェクトディレクトリにコピーして貼り付けます。
- Oracle.ManagedDataAccessDTC.dll
- Oracle.ManagedDataAccess.dll
- Oracle.ManagedDataAccess.dllへの参照を追加
- 両方のdllでexeがリリースされている(VS2010の Application Folder に追加されている)ことを確認します
これは、32ビットOracleクライアントに対して64ビット.NETランタイムを実行することにより発生する可能性があります。これは、サーバーで64ビットでアプリを実行している場合に発生する可能性があります。 64ビットランタイムで.NETアプリを実行します。 VSのプロジェクトでCPUフラグを設定して、32ビットランタイムで実行できます。
要約を作成しましょう:
エラーメッセージ <!> quot;プロバイダーはOracleクライアントのバージョンと互換性がありません<!> quot; は、いくつかの理由で発生する可能性があります。
-
Oracle Clientがインストールされていません。この場合、エラーメッセージは確かに誤解を招きます。
Oracle Data Provider for .NET(ODP.NET、つまりファイル
Oracle.DataAccess.dll
)はOracle Instant Clientに含まれていません。個別にインストールする必要があります( 32ビットOracle Data Access Components(ODAC)または 64ビットOracle Data Access Components(ODAC)ダウンロード)またはOracle Universalのオプションに従って選択する必要がありますインストーラー(OUI)。注:Oracle Data Provider <!> gt; = 12.1をインストールする場合、プロバイダーはGACに自動的に登録されません。必要に応じて手動で登録する必要があります。OracleDoc 2272241.1 。
-
ODP.NETのバージョンは、インストールされているOracle Clientのバージョンと一致しません。マイナーバージョン番号も確認する必要があります。たとえば、
oraociei*.dll
バージョン 4.112.3.0 はOracleクライアント 11.2.0.4 と互換性がありません。 ODP.NETおよびOracle Clientのバージョンを慎重に確認してください。OraOps*w.dll
および/またはOracle.ManagedDataAccess.dll
で sigcheck を使用できます。 Oracleクライアントのバージョンを取得します。異なる番号付けスキームに注意してください。ファイルバージョン 4.112.3.0 は、 .NET Frameworkバージョン4、Oracleリリース11.2.0.3.x を意味します。
ODP.NETバージョン<!> quot; 1.x <!> quot;、<!> quot; 2.x <!> quot;があります。および<!> quot; 4.x <!> quot;。これらの番号は、Microsoft .NET Frameworkバージョン1.0.3705 / 1.1.4322、2.0.50727および4.0.30319に関連しています。バージョン<!> quot; 1.x <!> quot; Oracle Client 11.1まで利用可能でした。バージョン<!> quot; 4.x <!> quot; 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のバージョン以上である必要があります。
-
開発マシンの
*.csproj
のバージョン(つまり、コンパイル中にロードされるバージョン)は、ターゲットマシンのバージョンよりも高いです。 -
*.vbproj
は GAC から読み込まれる可能性があることに注意してくださいローカルで提供されるファイルよりも優先されます。
ソリューション
-
ODP.NET Managed Driverの使用を検討してください。Oracleページからダウンロードできます: 64ビットOracle Data Access Components(ODAC)ダウンロード。 そこで、
Version=...
ファイルをアプリケーションディレクトリにコピーするだけでよく、他には何も必要ありません。 32ビットと64ビットの両方で機能します。 -
processorArchitecture=...
で、それぞれ。OraClient11g_home1
ODP.NETへの参照を次のように編集します。<Reference Include="Oracle.DataAccess"> <SpecificVersion>False</SpecificVersion> <Private>False</Private> </Reference>
C:\Oracle\11.2\Client_x86
やC:\Oracle\11.2\Client_x64
などの属性は不要です。アプリケーションは、選択したアーキテクチャとターゲット.NETフレームワークに応じて、正しい-<!> gt; 100%検証されていないC:\Windows\System32
をロードします(適切にインストールされている場合) -
ターゲットマシン上のOracleクライアントのバージョンがわからない場合(たとえば、お客様のマシンである可能性があります):上記のダウンロードページに移動し、 XCopy Oracle Data Access Componentsのバージョン。 zipを解凍し、
ora112
ファイルのみをローカルマシンにコピーします。 VSプロジェクトで、この(ほとんどの場合古い)DLLへの参照を作成します。このDLLのバージョンは、アプリケーションが動作するODP.NETの最小バージョンです。アプリケーションを実行すると、GACの発行者ポリシーは実際にインストールされたバージョンにリダイレクトされます。 -
単一のDLLを取得して特定のフォルダーにコピーするのは賢明な方法ではないと思います。 <!> quot; naked <!> quot;で動作する場合があります。ただし、ターゲットマシンにOracle製品がインストールされている場合は、バージョンの不一致のリスクが高くなります。マシンからOracle製品をアンインストールし、新規インストールを行います。 Oracle 11g(クライアント)をアンインストール/完全に削除する方法をご覧ください。 本当にきれいな機械を注文する。
-
32ビットアプリケーションと64ビットアプリケーションを同時に使用する必要がある場合は、次の手順に従って1台のマシンに両方のバージョンをインストールします。
仮定:OracleホームはC:\Windows\SysWOW64
と呼ばれ、クライアントバージョンは11gR2です。
-
オプションで、インストールされているOracleクライアントを削除します
-
たとえば、
PATH
にOracle x86 Clientをダウンロードしてインストールします
-
Oracle x64 Clientをダウンロードして、たとえば
C:\Windows\System32\ora112
などの別のフォルダーにインストールします。
-
コマンドラインツールを開き、フォルダー%WINDIR%\ System32に移動します。通常は
\bin
で、フォルダーC:\Windows\SysWOW64\ora112
へのシンボリックリンクORACLE_HOME
を作成します(以下を参照) -
フォルダー%WINDIR%\ SysWOW64に変更します。通常は
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
で、フォルダーHKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
へのシンボリックリンクTNS_ADMIN
を作成します(以下を参照)。 -
TNS_ADMIN=C:\Oracle\Common\network
環境変数を変更し、<=>や<=>などのすべてのエントリをそれぞれ<=>サブフォルダーの<=>に置き換えます。注:<=>はPATH環境に存在してはなりません。 -
必要に応じて、yor <=>環境変数を<=>
に設定します
-
レジストリエディターを開きます。レジストリ値<=>を<=>
に設定します
-
レジストリ値<=>を<=>に設定(<=>ではなく)
-
これで完了です!これで、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
注意事項:
-
両方のシンボリックリンクは同じ名前である必要があります。 <=>。
-
ODP.NETを後で手動でインストールする場合は、インストールする適切なフォルダーを選択するよう注意してください。
-
名前にもかかわらず、フォルダ<=>にはx64ライブラリが含まれ、<=>にはx86(32ビット)ライブラリが含まれます。混同しないでください。
-
たぶん、<=>環境変数(またはレジストリ内の<=>エントリ)を共通の場所、たとえば<=>に設定するのが賢明なオプションかもしれません。
ODP.Netをターゲットマシンにインストールすると、問題が解決するはずです... dllをコピーするのは良い考えではありません...
Oracle 11g(11.1.0.7.20)の場合、次のDLLをExeとともに追加して動作させる必要がありました。
- oci.dll
- OraOps11w.dll
- oraociicus11.dll(30MBに近いかなり大きい)
- Oracle.DataAccess.dll
これに3時間を費やした後、私の問題は次のようになりました。
OraOps11w.dllの欠落
なぜ<!> quot;を生成する必要があるか;プロバイダはOracleクライアントのバージョンと互換性がありません<!> quot;エラーメッセージ? Oracleによるコーディング/テストの質が低い必要があります。 1994年からOracleを使用し、2002年から.Netで何度も使用しています。これは、ほとんど常に苦痛です。
誰もがOracleをアンインストールし、上記のChrisのソリューションに従う必要があります(トップアンサー)。それは毎回動作するはずです
StackOverflowの別の投稿から、これはOracleをアンインストールする方法です(Oracleアンインストールツールは正しく機能しないため忘れてください):
- Oracle Universal Installer(OUI)を使用して、すべてのOracleコンポーネントをアンインストールします。
- regedit.exeを実行し、HKEY_LOCAL_MACHINE / SOFTWARE / ORACLEキーを削除します。これには、すべてのOracle製品のレジストリ全体が含まれます。
- レジストリの次の部分に残っているOracleサービスへの参照を削除します。 HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / Ora * どちらがOracleに関連するかは明らかです。
- マシンを再起動します。
- <!> quot; C:\ Oracle <!> quot;を削除します。ディレクトリ、またはORACLE_BASEのディレクトリ。
- <!> quot; C:\ Program Files \ Oracle <!> quot;を削除します。ディレクトリ。
- <!> quot; c:\ temp <!> quot;の内容を空にします。ディレクトリ。
- ごみ箱を空にします。
Chrisは、Server 2003(32ビット)よりもDLLの数が少ない。これは私が持っているものです:
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)が含まれているが、ランタイムがOracle.DataAccess.dll(v2.x)をGAC。プロジェクト参照のOracle.DataAccessエントリを削除して再追加すると、問題が解決しました。
ここに記載されている他のファイルは、私の状況では必要ないようでした。
更新
<!> quot;の根本的な原因;プロバイダはOracleクライアントのバージョンと互換性がありません<!> quot;エラーは、(一般的に)マネージアセンブリがバージョンと一致しないアンマネージライブラリをロードしようとしていることです。 web.config 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が非常にうるさいことを思い出します。
まったく同じ問題がありました。アプリケーションのコンパイル後にoraociei11.dllを削除しました(削除したことを忘れました)。そして、実行しようとしたときにこのエラーが発生していました。したがって、oraociei11.dllというDLLを見つけることができない場合、このエラーが表示されます。このエラーが発生するケースは他にもあるかもしれませんが、これはそのうちの1つと思われます。
また、IISアプリケーションプールの32ビットtrueまたはfalseフラグを有効にしてください。このメッセージが表示された場合、いくつかのOracleフォーラムがこれを指示しました!
この問題を解決するために3時間続いたものを次に示します。
-
C:\oracle\product\11.2.0
にあるOracleホームの下に、以前にWindows 64ビット用のclient_1
ビットをインストールしたODP.NET
というフォルダーがありました。 -
ASP.NET Web APIアプリをVisual Studio 2012でデバッグしようとした後、次のエラーメッセージが表示され続けました: このプロバイダーはOracleクライアントのバージョンと互換性がありません 。
-
Googleの検索
OracleConnection
64ビットを使用していたため、これが起こっていることがわかりました。次に、Windows 32ビット用に<=>を取得してインストールしましたが、同じエラーメッセージが表示され続けました。 -
解決策:フォルダー<=>を削除し、<=> 32ビットを再インストールしました。インストーラーは、64ビットバージョンのビットと32ビットバージョンのビットを混在させていました。図に移動...
-
これでまた嬉しくなり、新しい<=>を開くことができます。最後に! :)
この問題が解決しない場合:この記事に基づいて
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 = 13523
セットアップを実行し、C#からのoracle呼び出しが成功しました!
TLDRバージョン:
- 12c 100%管理プロバイダーを使用する代わりに。
- 古いプロバイダーを使用する必要がある場合は、Oracle.DataAccess.dllが正しいバージョンの管理されていないOracle Client Dllを指すようにする必要があります。マシンに複数のOracleクライアントがインストールされている場合は、<!> quot; DllPath <!> quot; app configの構成変数(以下を参照)を参照しますが、指すように新しいOracleクライアントをインストールする必要がある場合もあります。
フルバージョン:
まず、古い管理されていないプロバイダー(新しい12c 100%マネージドプロバイダーではない)のコンポーネントを理解するようにします。 2つの部分で構成されています。
- マネージ.netコンポーネント-Oracle.DataAccess.dll
- アンマネージド(非.net)クライアント
簡単に言えば、Oracle.DataAccess.dllはほぼ単なるラッパーであり、.net命令をアンマネージクライアント用のORACLE-NET命令に変換します。
つまり、Oracle.DataAccessをロードすると、必要なアンマネージクライアントdllを見つけようとする順序があります。 Oracleドキュメントから:
Oracle.DataAccess.dllは、依存するアンマネージDLL(たとえば、 次の順序に基づきます:
1。アプリケーションまたは実行可能ファイルのディレクトリ。
2.application configまたは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 Home Binフォルダを指すようにすることです。
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
</oracle.dataaccess.client>
</configuration>
クライアントの新しいコピーをインストールする場合は、 xcopyバージョンは最小で、<!> quot;インスタントクライアント<!> quot;上記のDllPathがこの新しい場所を指すようにします。ただし、Oracleクライアントのインストールはすべて機能します。
しかし、このアンマネージドクライアントの解決をすべて避けたい場合は、代わりに100%マネージドプロバイダーを使用するようにアプリを更新できるかどうかを確認してください-マネージドファイルに依存しない、1つまたは2つのマネージドアセンブリのみです。
また、binディレクトリとGACの両方にインストールされていると思われるOracle.DataAccess.dllをロードしていない可能性もありますが、これはあまりありそうもないシナリオだと思います。 アセンブリ解決プロセスを参照してください。
IIS / IWAMユーザーはOracleディレクトリに対する権限を持っていますか? ExcelやAccessなどの別のアプリを使用してこのデータソースに接続できますか?
ネットワーク共有上のOracle.Data.dllアセンブリがDBAによって更新されたため、同じ問題が発生しました。プロジェクトから参照を削除して再度追加すると、問題が解決しました。
私も同じ問題を抱えていますが、私の場合、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つのステップ。
- アプリケーションプールの設定を進め、「32ビットアプリケーションを有効にする」フラグをTrueに設定します。
- ビンのすべてのDLLが32ビットバージョンであることを確認してください...
幸運を祈ります。
新しいDLLを入手する道をたどりませんでした。完璧に機能する既存のプロジェクトがたくさんありましたが、頭痛の種になったのは私の新しいプロジェクトだけだったので、他のことを試してみることにしました。
私のプロジェクトは、Oracle.DataAccess.dll v4.112.3.0
に依存する内部開発されたInternal.dllを使用していました。何らかの理由で、どの構成ファイルでも明示的に指定されていなくても、発行時にVisual Studioは常にv4.121.0.0
をアップロードしました。だからエラーが発生しました。
だから私がやったことは:
- 正常に実行されているプロジェクトの1つからInternal.dllをWebサイトの
/bin
にコピーしました(念のため) - 正常に実行されているプロジェクトの1つからOracle.DataAccess.dllをWebサイトの
myWebSite.csproj
にコピーしました。 - 私のウェブサイトから両方への参照を追加します。
- 最後にOracle.DataAccess参照が<=>に表示されましたが、間違ったバージョンが表示されました:<=>ではなく<=>。
-
<=>の参照を手動で変更したため、次のようになりました。
<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と十分に戦った後にこの問題が発生しました。ファイルをコピーしたり、設定を変更したりするなど、この混乱の代わりにOracleクライアントを再インストールすることにしました。
最近、ソリューションと含まれるすべてのプロジェクトがx32プラットフォームを対象とした古いプロジェクトで作業する必要がありました。私はOracle.DataAccess.dllと他のすべての推奨Oracleファイルをすべての場所にコピーしようとし続けましたが、毎回壁にぶつかりました。最後に、頭部の電球が点灯し(8時間後:))、インストールされたODACアセンブリとそのプラットフォームを確認するように求められました。 64ビット(x64)ODACクライアントはすべてインストール済みですが、32ビット(x32)のものはインストールされていません。 32ビットODACをインストールすると、問題はなくなりました。
インストールされているODACのバージョンを確認する方法:C:\ Windows \ assemblyフォルダーを確認します。 <!> quot; Processor Architecture <!> quot;プロパティは、インストールされた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ビットホームバージョンのアクセス許可であることがわかりました。そのバージョンの多くのディレクトリには、<!> quot;認証済みユーザー<!> quot;ロールには<!> quot; Read <!> quot;がありませんでした。アクセス。デフォルトで親ディレクトリに設定されます。これらのサブディレクトリには、<!> quot; bin <!> quot;、<!> quot; network / admin <!> quot;、<!> quot; nls <!> quot;、<!> quot; oracore < !> quot;、<!> quot; RDBMS <!> quot;そしておそらく他の人。 <!> quot; ACCESS DENIED <!> quot;を除外してそれらを見つけました。 <!> quot; Process Monitor <!> quot; (Procmon.exe)sysinternalsのユーティリティ。アクセス許可が親ディレクトリからそれらの子サブディレクトリに継承されると、すべてが機能し始めました。
Oracleホーム全体のパーミッションをオーバーライドすることはしなかったので、一度に1つのディレクトリを作成しましたが、セキュリティについてそれほど心配しないのであれば、対応するOracleホーム全体でリセットできると思いますディレクトリ。
- 64ビットマシンでは、<!> quot; msvcr71.dll <!> quot;をコピーします。 C:\ Windows \ SysWOW64から アプリケーションのbinディレクトリ。
- 32ビットマシンでは、<!> quot; msvcr71.dll <!> quot;をコピーします。 C:\ Windows \ System32から アプリケーションのbinディレクトリ。
http://randomdevtips.blogspot。 com / 2012/06 / provider-is-not-compatible-with-version.html
Lots of theoretical answers here, but here comes a working example with code that you can copy and paste and test immediately:
- I installed the Oracle Express database OracleXE112 which already comes with some preinstalled demo tables.
- When you start the installer you are asked for a password. I entered "xxx" as password. (not used in production)
- My server runs on the machine 192.168.1.158
- On the server you must explicitely allow access for the process TNSLSNR.exe in the Windows Firewall. This process listens on port 1521. If you get a timeout error from the below code check your firewall.
- OPTION A: For C# (.NET2 or .NET4) you can download ODAC11, from which you have to add Oracle.DataAccess.dll to your project. Additionally this DLL depends on: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), msvcr80.dll.
These DLLs must be in the same directory as the EXE or you must specify the DLL path in:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
. On 64 bit machines write additionally toHKLM\SOFTWARE\Wow6432Node\Oracle\...
- OPTION B: If you have downloaded ODAC12 you need Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), oraons.dll, msvcr100.dll. The Registry path is
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
- OPTION C: If you don't want huge DLL's of more than 100 MB you should download ODP.NET_Managed12.x.x.x.xxxxx.zip in which you find
Oracle.ManagedDataAccess.dll
which is only 4 MB and is a pure managed DLL which works in 32 bit and 64 bit processes as well and depends on no other DLL and does not require any registry entries. - The following C# code works for me without any configuration on the server side (just the default installation):
using Oracle.DataAccess.Client; or using Oracle.ManagedDataAccess.Client; .... string oradb = "Data Source=(DESCRIPTION=" + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)));" + "User Id=SYSTEM;Password=xxx;"; using (OracleConnection conn = new OracleConnection(oradb)) { conn.Open(); using (OracleCommand cmd = new OracleCommand()) { cmd.Connection = conn; cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES"; using (OracleDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { listBox.Items.Add(dr["TABLESPACE_NAME"]); } } } }