.NetアプリケーションがOracleデータベースに接続しようとすると、次のようなエラーが発生します。
エラーによると、「この問題は、32ビットのOracleクライアントコンポーネントがインストールされた状態で、64ビットモードで実行した場合に発生します」とあります。しかし、クライアントが32ビットではなく、64ビットでインストールされていることを何度も確認しました。
Date Time: 6/8/2014 10:57:55 AM: System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at System.Data.Common.UnsafeNativeMethods.OCILobCopy2(IntPtr svchp, IntPtr errhp, IntPtr dst_locp, IntPtr src_locp, UInt64 amount, UInt64 dst_offset, UInt64 src_offset)
at System.Data.OracleClient.OCI.DetermineClientVersion()
--- End of inner exception stack trace ---
at System.Data.OracleClient.OCI.DetermineClientVersion()
at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OracleClient.OracleConnection.Open()
at CustomizedSetupInstaller.Runscripts.InitializeDBObjects(String connectionString, String dbProvider)
1つの解決策は、x86(32ビット)とx64の両方のOracleクライアントをマシンにインストールすることで、アプリケーションがどちらのアーキテクチャで実行されているかは関係ありません。
ここでは、1台のマシンにx86とx64のOracleクライアントをインストールする方法を説明します。
前提条件Oracle Home は OraClient11g_home1
と呼ばれ、クライアントのバージョンは 11gR2 です。
オプションとして、インストールされているOracleクライアントを削除する(問題がある場合は https://stackoverflow.com/questions/8450726/how-to-uninstall-completely-remove-oracle-11g-client を参照)。
Oracle x86 Client をダウンロードし、インストールします。
Oracle x64 Client をダウンロードしてインストールしてください(例:C:001.2Client_x64`)。
コマンドラインツールを起動し、 %WINDIR%%%System32 (C:˶‾᷄ -̫ ‾᷅˵) に移動し、シンボリックリンク ora112
を作成してください。
WINDIR%\SysWOW64」フォルダに移動し、シンボリックリンク「ora112」を「C:Oracle\11.2Client_x86」フォルダに作成します。
環境変数「PATH」を変更し、「C:̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶*」の部分を「C:̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶*」に置き換えてください。C:Windows\SysWOW64\ora112」はPATHに含まれていません。
必要に応じて、環境変数「ORACLE_HOME」を「C:Windows\System32\」に設定してください。
レジストリエディタを開きます。レジストリの値として、`HKLM\\\\\\\\\\\\\ />を設定してください。
Set Registry value HKLM\\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
to C:˶‾᷅᷅˵ (not
C:˶‾᷄˶‾᷅˵)
これで完了です。これで、x86とx64のOracleクライアントをシームレスに併用できるようになりました。つまり、x86アプリケーションはx86のライブラリをロードし、x64アプリケーションはx64のライブラリをロードすることになります。
おそらく、環境変数「TNS_ADMIN」(レジストリの「TNS_ADMIN」エントリ)を共通の場所に設定するのが賢明な選択でしょう。例えば、「TNS_ADMIN=C:Oracle\Common\network」のように設定します。
シンボリックリンクを作成するコマンドです。
cd C:\System32
cd C:Windows\SysWOW64 mklink /d ora112 C:\\\\\\
注意事項
2つのシンボリックリンクは同じ名前でなければなりません(例:ora112
フォルダの名前は同じでも、「C:Windows\System32」にはx64用のライブラリが、「C:Windows\SysWOW64」にはx86(32ビット)用のライブラリが入っています。勘違いしないでくださいね。
私の場合、Oracle 11.2の32ビットクライアント *は、64ビットのWindows 2008 R2 OSにインストールされていました。
解決方法:ASP.NETアプリケーションに割り当てられているアプリケーションプールの詳細設定で、32ビットアプリケーションを有効にするをTrue**に設定しました。
Oracleへの接続機能をテストするために使用したスタンドアロンの.ashxテストスクリプトは以下を参照してください。アプリケーションプールを変更する前の応答は次のとおりです。
[Running as 64-bit] Connection failed.
...と、Application Poolの変更後。
[Running as 32-bit] Connection succeeded.
TestOracle.ashx - System.Data.OracleClient:によるOracle接続をテストするスクリプト
使用方法:ユーザー、パスワード、ホスト変数を適切に変更してください。
なお、このスクリプトはASP.NET Webアプリケーションのプロジェクトファイルに影響を与えることなく、スタンドアロンで使用することができます。アプリケーションフォルダにドロップするだけです。
<%@ WebHandler Language="C#" Class="Handler1" %>
<%@ Assembly Name="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" %>
using System;
using System.Data.OracleClient;
using System.Web;
public class Handler1 : IHttpHandler
{
private static readonly string m_User = "USER";
private static readonly string m_Password = "PASSWORD";
private static readonly string m_Host = "HOST";
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string result = TestOracleConnection();
context.Response.Write(result);
}
public bool IsReusable
{
get { return false; }
}
private string TestOracleConnection()
{
string result = IntPtr.Size == 8 ?
"[Running as 64-bit]" : "[Running as 32-bit]";
try
{
string connString = String.Format(
"Data Source={0};Password={1};User ID={2};",
m_Host, m_User, m_Password);
OracleConnection oradb = new OracleConnection();
oradb.ConnectionString = connString;
oradb.Open();
oradb.Close();
result += " Connection succeeded.";
}
catch
{
result += " Connection failed.";
}
return result;
}
}
Windows 10 PCでも同じ問題が発生しました。古いコンピューターから新しいコンピューター(どちらも64ビット)にプロジェクトをコピーし、Oracle Client 64ビットを新しいマシンにインストールしました。 同じエラーメッセージが表示されましたが、効果のない多くの解決策を試した後、実際に機能したのはこれです。 Visual Studio(私のものは2017)に移動します。 ツール>オプション>プロジェクトとソリューション>ウェブプロジェクト。
そのページで、次のオプションを確認してください。 IIS Expressの64ビットバージョンをWebサイトおよびプロジェクトに使用します。
IISを改訂する。
1。 アプリケーションプールを選択します。 2。 ASP .NET V4.0クラシックのクリック。 3。 [詳細設定]を選択します。 5。 一般に、オプションEnable 32ビットアプリケーションでは、デフォルトはfalseです。 TRUEを選択します。 6。 リフレッシュしてサイトをチェックしてください。
コメント:
プラットフォーム:Windows Server 2008 R2 Enterprise-64Bit-IIS 7.5。
コメントで指摘されたように、System.Data.OracleClientは非推奨です。 ゲームの後半で使用を開始する理由はほとんどありません。
また、コメントで指摘されているように(私はこれをコミュニティwikiとして注意してマークしました)、odp.netパッケージの12c以降のバージョンの一部としてマネージドプロバイダーがあります。 このプロバイダーは管理されていないdllを必要としないため、その場合、これは問題になりません。
Oracleの古い管理されていないOracle.DataAccessプロバイダーを使用したい場合、最も簡単な解決策は、「DllPath」構成変数を設定することです。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="C:\oracle\bin"/>
</oracle.dataaccess.client>
</configuration>
詳細については、http://docs.oracle.com/database/121/ODPNT/InstallODP.htmの「管理されていないDLLの検索順序」を参照してください。
このソリューションは私のために機能します。
IISを改訂する。
Select Application Pools.
Clic in ASP .NET V4.0 Classic.
Select Advanced Settings.
In General, option Enable 32-Bit Applications, default is false. Select TRUE.
Refresh and check site.
コメント:
プラットフォーム:Windows Server 2012 Standart- 64Bit-IIS 8。
SSIS 2008でも同じ問題がありました。 ODAC 12c 32ビットを使用してOracle 11gに接続しようとしました。 ODAC 12c 64ビットもインストールしようとしました。 SSISは実際にテーブルをプレビューすることができましたが、パッケージを実行しようとしたときに、このエラーメッセージが表示されていました。 何も助けにはならなかった。 VS 2013に切り替えられましたが、現在はデバッグモードで実行されていましたが、dtexec / f filenameを使用してパッケージを実行したときに同じエラーが発生しました。 次に、このページを見つけました。 http://sqlmag.com/comment/reply/17881。
簡単に言うと、次のように書かれています(ページがまだある場合は、ページに移動して、指示に従ってください。..)。 1)Oracleサイトから最新バージョンのodac 64ビットxcopyをダウンロードしてインストールします。 2)Oracleサイトから最新バージョンのodac 32ビットxcopyをダウンロードしてインストールします。 どうやって? adminSTARTORとしてcmdシェルを開いて実行します。 c:\ 64bitODACLocation> install.bat oledb c:\ odac \ odac64。 最初のパラメータは、インストールするコンポーネントです。 2番目のパラメータは、どこにインストールするかです。 32バージョンも次のようにインストールします。c:\ 32bitODACLocation> install.bat oledb c:\ odac \ odac32。 3)システムのパスをc:\ odac \ odac32を含むように変更します。 c:\ odac \ odac32 \ bin; c:\ odac \ odac64; c:\ odac \ odac64 \ binこの順序で. 4)マシンを再起動します。 5)odac32 \ admin \ networkとodac64 \ admin \ networkの両方のフォルダー(または少なくとも接続に同じエントリー)に同じtnsnames.oraがあることを確認します。 6)次に、ビジュアルスタジオでSSISを開きます(ssisパッケージで無料の2013バージョンを使用しました)-OLEDBを使用して、接続タイプとしてOLE DBプロバイダーのOracleプロバイダーを選択します。 tnsnames.oraのエントリの名前を「サーバーまたはファイル名」に設定します。 ユーザー名はスキーマ名(db名)で、パスワードはスキーマのパスワードです。 完了です。!
繰り返しになりますが、非常に詳細なソリューションなどを元のサイトで見つけることができます。
これは私のために働いた唯一のものであり、私の環境を台無しにしませんでした。
乾杯。! gcr。
Oracle dbを接続するためのsystem.data.oracleclientとともに2.0フレームワークを備えたC#.netを使用してデスクトップアプリケーションを開発し、同様のエラーメッセージに直面していました。「Oracleクライアントライブラリをロードしようとすると、BadImageFormatExceptionがスローされました。 この問題は、32ビットOracleクライアントコンポーネントがインストールされた状態で64ビットモードで実行されているときに発生します。"。
以下のソリューションが適用されました。
プロジェクト、プロパティ、TABの構築、プラットフォームターゲットの選択:x86。 プロジェクト、クリーンビルド、ReBuildソリューション。
これで、アプリケーションがWin2012 R2サーバーにインストールされた32ビットおよびoracle 32ビットクライアントに設定されているため、機能します。うまくいけば、うまくいくでしょう。
コンソールアプリケーションでこの問題が発生しました。
私の場合、プラットフォームターゲットを"に変更しました。;任意のCPU "。; ソリューションを右クリックしてプロパティをクリックすると表示されます。 , Tab"が見つかります。;Build"。; それをクリックします。, "が表示されます。;プラットフォームターゲット:"。; "に変更します。;CPU"。; これで問題が解決します。
Windows 2012 R2にインストールされているDNNアプリケーションでこのエラーが発生しました。 約32ビットdllを使用しており、Oracle.DataAccess.dll x32のみが機能していました。 私の解決策は:
1。 古いOracle Client \ ODACをアンインストールします。 2。 Oracle 11 Client x32をインストールします。 3。 Oracle ODAC 12 x64をインストールします。 4。 IISアプリケーションプール(クラシックバージョン)にオプション「32ビットアプリケーションを有効にする」= trueがあることを確認します。
Mineはコンソールアプリケーションであり(Windowsアプリケーションでも動作するはずです)、同じ問題がありました。 それを解決するために、システムとしてx64としてPlatformTargetを使用しました。Data.OracleClient.dll(64ビットファイル)はC:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5です。 これは、Oracle Clientの64ビットバージョンを明示的に使用します。 これは、ソリューションが64ビットでのみ機能し、VBで作成されたdllのような32ビットdllを使用していない場合に役立ちます。 それがあなたを助けることを願っています。
apcが述べたように、エラーは「32ビットdllが64ビットdllを呼び出すか、またはその逆の場合」に発生します。 問題は、AnyCPUを使用してビルドし、64ビット環境で実行している場合、アプリケーションが64ビットとして実行されることです。 32ビットと64ビットを明示的に再構築することがオプションではない場合は、Windows SDKに付属の corflags.exe と呼ばれるマイクロソフトユーティリティを使用できます。基本的に。, 実行しているプログラムのexeでフラグを変更して、環境が64ビットであっても32ビットとして実行するように指示できます。
使用方法については、hereを参照してください。
うまくいった解決策を追加したいと思います。 セットアップ:Windows 2008 R2(64ビットOS)で実行されているOracle 11g 64ビット。
クライアントは、x86プラットフォーム設定でコンパイルされた.netフレームワーク3.5アプリケーション(2.0からポート)です。
BadImageFormatExceptionとまったく同じ問題がありました。 64ビットにコンパイルすると例外がなくなりますが、アプリが64ビットでは機能しない32ビットactivxコンポーネントを使用しているため、オプションではありませんでした。
Oracle Instant Client 11(これはxcopyできるよりもDLLの集まりです)をOracle Webサイトからダウンロードし、アプリケーションファイルディレクトリ内のファイルをコピーすることで問題を解決しました。 ここを参照してください:http://www.oracle.com/technetwork/database/features/oci/instant-client-wp-131479.pdf。
これで問題が解決しました。ProcMonツールから、ローカルにコピーされたoci.dllがSystem.Data.OracleClientによってロードされ、すべてが問題ないことがわかります。
これはおそらく上記のように環境設定を変更することで実行できますが、この方法にはサーバー構成の設定を変更しないという利点があります。
同じエラーが発生していて、システムが64ビットにあり、oracleを使用していたことを確認しました。32ビットバージョンのDataAccess正しい64バージョンを追加しましたが、解決しました。 Oracle.DataAccess.dllの参照の下のパス。
64ビットOS- C:\ Oracle \ 11g_64 \ product \ 11.2.0 \ client_64 \ odp.net \ bin \ 4 \ Oracle.DataAccess.dll
の正しいパス。
32ビットOS- C:\ Oracle \ 11g_32 \ product \ 11.2.0 \ client_64 \ odp.net \ bin \ 4 \ Oracle.DataAccess.dll
の正しいパス。
BadImageFormatExceptionは、32ビット(x86)のDLLが64ビットのDLLを呼び出した場合、またはその逆の場合に発生します。エントリ実行ファイルにAnyCPUを使用している場合、64ビットマシンで実行すると64ビットとして動作しますが、32ビットのDLLを呼び出すと例外が発生します。
VB6(32bit(x86))で作成された古いコンポーネントとのインターフェイスがまだあるので、私はすべてを32bit(x86)で構築する傾向があります。もしAnyCPUを組み込んだ場合、64bitマシンの方がパフォーマンスは良いかもしれませんが、私たちにとっては信頼性の方が重要です。
私は、すべてのコンポーネントを32bit(x86)で構築することをお勧めします。