Microsoft.Jet.OLEDB.4.0 'プロバイダーがローカルマシンに登録されていません


191

.NET 3.5で開発されたWindowsアプリケーションを32ビットWindows 2008サーバーで作成しました。アプリケーションを64ビットサーバーにデプロイすると、「Microsoft.Jet.OLEDB.4.0」プロバイダーがローカルマシンに登録されていません」というエラーが表示されます。

この問題の解決策として、プロジェクトのビルドプロパティをX86に変更し、32ビットモードでビルドし、32ビットマシンでプロジェクトを再ビルドするようにしました。ただし、同じプロジェクトは他のDBドライバー(DB2、SQLなど)を使用して他のデータベースに接続します。そのため、64ビットOSにアプリを再度展開すると、「32ビットプラットフォームで64ビットアセンブリをロードしようとしました」という例外がスローされます。

Microsoft.Jet.OLEDB.4.0ドライバーを使用してExcel(.xls)の読み取りと書き込みを行っています

回答:


238

この問題の解決策を見つけました。質問で説明した問題は、基本的に64ビットOSのMicrosoft.Jet.OLEDB.4.0ドライバーの非互換性が原因で発生しました。

したがって、64ビットサーバーでMicrosoft.Jet.OLEDB.4.0ドライバーを使用している場合は、アプリケーションを強制的に32ビットモードでビルドする必要があります(これは、この既知の問題を徹底的に検索したときに見つけた答えです)そして、それは私のコードの他の部分を壊します。

幸いなことに、マイクロソフトは64ビット互換の2010 Office System Driverをリリースしました。これは、従来のMicrosoft.Jet.OLEDB.4.0ドライバーの代わりとして使用できます。32ビットサーバーと64ビットサーバーの両方で動作します。私はこれをExcelファイルの操作に使用しましたが、どちらの環境でも問題なく動作しました。しかし、このドライバーはベータ版です。

このドライバーは、Microsoft Accessデータベースエンジン2010再頒布可能パッケージからダウンロードできます。


6
また、そのリンクの説明に特別な注意を払ってください:)
Mark

4
同じ問題がありました。アプリケーション構成をx86に変更したところ、うまくいきました!
skpaul 2013

9
また、接続文字列をMicrosoft.Jet.OLEDB.4.0からMicrosoft.ACE.OLEDB.12.0に変更する必要がありました
Spikolynn 2013

16
はい、64ビット互換のAccessデータベースエンジンを利用できますが、システムに32ビットバージョンのMS Office製品(32ビットMS Wordなど)がインストールされていないことが大きな問題です。回避策は、32ビットバージョンのAccess Database Engine 2010を使用し、.NETアプリケーションを強制的に32ビットモードで実行することです(たとえば、Configuration Managerでx86プラットフォームを選択します)。そして、適切な解決策は、MS Accessをより良い代替手段に置き換えることです。
Massood Khaari 2013

2
noob質問:「アプリケーション内」のようにこのドライバーを配布できますか、それともアプリケーションを使用したいすべてのユーザーが手動でインストールする必要がありますか?
philx_x 2016

117

ASP.NETでも問題が解決しない場合は、アプリケーションプールの詳細設定で[32ビットアプリケーションを有効にする]設定をTrueに変更するだけで済みました。


私は64ビットODBCを使用していましたが、この変更によりデータベースエラーが発生し始めました。私はそれを修正しました。誰かがこれにも遭遇した場合は、32ビットODBCドライバーをインストールして、その中にDSNを作成する必要があります。
Farhan Hafeez 2013

2
現在、これを64ビットコードで完全に実行することは可能です。neoの回答にリンクされた再配布可能ファイルをインストールしてから、Iqbalの回答で提案されているプロバイダー文字列を使用します。次に、これらの両方の回答に賛成票を投じます。それでおしまい!
Roman Starkov 2013年

これにより、32ビットのAccess DBエンジンRedistをインストールした後、Windows Server 2008 R2で問題が解決しました。
Chris Pickford

2
欠点は、プールが32ビットモードで実行されることです。これを回避するために、代わりにACEに切り替えます。
wtjones 2014年

Windowsフォームでも私のために働いた。ASP.NETコードはまったくありません
philx_x 2016

52

私は同じ問題を抱えています

Microsoft.Jet.OLEDB.4.0 'プロバイダーがローカルマシンに登録されていません

neoによる回答を適用しましたが、プロバイダーを「Provider = Microsoft.ACE.OLEDB.12.0;」に変更するまで機能しませんでした接続文字列で。

誰かが同じ問題に直面した場合、これが役立つことを願っています。


4
これだよ!64ビットサーバーの場合は、インストールの再配布可能(明らかに64ビットのバリアント)ネオによってリンクをして、この答えに指定されているプロバイダを変更する、そしてそれは動作します。
Roman Starkov 2013年

あなたは正しいロムキンです。私はすでにneoソリューションを適用し、プロバイダーを変更すると述べました。しかし、コメントをありがとうございます。romkynsに感謝
Iqbal

Microsoft.Jet.OLEDB.4.0をMicrosoft.ACE.OLEDB.12.0に置き換えました。app.configですべてが働いた。
AVEbrahimi 2015年

1
アプリが32ビットに制限されているにもかかわらず、これは機能することがわかりました。
Ryan Lundy

私の場合には、「登録されていないMicrosoft.ACE.OLEDB.12.0」、:(
セザール・レオン

29

私はそれがかなり古い質問であることを知っており、多くの人が答えました。しかし、私は理解するために物事を要約しています:

ファイル拡張子がxlsでOSが32ビットの場合、「Microsoft.Jet.OLEDB.4.0」しか使用できません。マイクロソフトは、このドライバーの64ビットバージョンをリリースしていません。

ファイル拡張子がxlsxまたはOSが64ビットの場合、 " Microsoft.ACE.OLEDB.12.0" を使用する必要があります。32/64ビットモードでコンパイルされたアプリケーションは、ドライバーの選択に影響を与えません。

Microsoft.ACE.OLEDB.12.0OS 64ビットの64ビットドライバーを常にインストールします。Office 32ビットを既にインストールしている場合は、cmdから/ passive引数を指定してドライバーを実行する必要があります。このハッキングはOffice 2013までしか機能せず、MicrosoftはMicrosoft.ACE.OLEDB.16.0ドライバーのOffice 2016からこの回避策を停止しました。

AccessDatabaseEngine_x64.exe /passive

ドライバーのダウンロードMicrosoft.ACE.OLEDB.12.0

private void ProcessFile(string path)
{
    string connString = string.Empty;

    if (Path.GetExtension(path).ToLower().Trim() == ".xls" && Environment.Is64BitOperatingSystem == false)
        connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
    else
        connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
}

アプリケーションがAnyCPUフラグを使用してコンパイルされている場合、アプリケーションは64ビットOSでは64ビットアクセスドライバーを、32ビットOSでは32ビットアクセスドライバーを検索します。


1
回答ありがとうございます。私はWindows 10でVS2015を使用し、X64を使用しています。プロジェクト構成をAnyCPUからX86に変更すると、問題は解消しました。追加のドライバーをインストールする必要はありませんでした。
NoChance 2016年

@NoChanceマシンにOffice 64ビットが既にインストールされていて、Microsoft.ACE.OLEDB.12.0ドライバーがすでに含まれていると思います。
Romil Kumar Jain

お返事ありがとうございます。Office2007のみです。
NoChance 2016年

19

私は同じメッセージを持っています、Visual Studio 2010で実行するWebページがあります。そのページでfile.xlsを読み取ります。プロジェクトのビジュアルに問題はありません。IISローカルに配置すると、「Microsoft .Jet.OLEDB.4.0 'プロバイダーがローカルマシンに登録されていません' 、次の手順に従って問題を修正しました。

1.-IISを開く
2.- 詳細設定で appPoolを変更する
3.-trueで32ビットアプリケーション有効にします。

そしてそれはすべてです

ps。Active Solution PlatformでConfiguration ManagerをX86に変更


これにより、アプリは32ビットモードで実行されます。4GBの障壁を回避できるようにするには、この設定をオフにする必要があります。
Brain2000 2016年

18

アプリケーションがlocalIISで実行されている場合、AppPoolの詳細設定32ビットアプリケーションを有効にすることでこの問題を解決できます。

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


8

同じ問題がありました。アプリケーション構成をに変更したところx86、うまくいきました!


この構成を変更するには?ウェブサイトタイプのプロジェクトを作成しました
SHEKHAR SHETE 2017

7

プロジェクトのプロパティをx64形式に変更しました

プロジェクト--->プロパティ--->ビルド--->ターゲットフレームワーク---> X64


5

デスクトップアプリでこの問題に遭遇しました。

開発環境: Windows 7 Ultimate-64ビット.Net Framework 4.5プロバイダー= Microsoft.Jet.OLEDB.4.0

プラットフォームターゲットをAny CPUからX86に変更することで解決しました。プロジェクトのプロパティ>>ビルド>>プラットフォームターゲット。

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


2

デスクトップアプリケーションでこの問題に遭遇しました( 'Microsoft.Jet.OLEDB.4.0'プロバイダーがローカルコンピューターに登録されていません)。32ビットアプリとしてビルドするオプションがありませんでした。これが同じ状況の他の人を助けることを願っています。

私は次のことをしました、そして問題は消えました:

  1. neoによって提案されたように、64ビットバージョンのMicrosoft Access Database Engine 2010 Redistributableをインストールしました

  2. プロバイダーをMicrosoft.ACE.OLEDB.12.0に変更しました


2

より最適な解決策は、上記のように単純に再コンパイルすることですが、ソースコードにアクセスする必要があります。私の場合、完成した.exeしかなく、このソリューションを使用する必要がありました。CorFlags.exe.Net SDKから使用して、アプリケーションのロード特性を変更します。

  1. .Net Framework SDKをダウンロードします(個人的には3.5を使用しましたが、使用するバージョンは、アプリケーションに必要な.Net以上である必要があります。
  2. インストールするときに必要なのはWindows開発ツールCorLibs.exeだけをチェックすることだけです。
  3. インストール後、を見つけますCorFlags.exe。私の.Net Framework 3.5 SDKのインストールでは、にありましたC:\Program Files\Microsoft SDKs\Windows\v7.0\Bin
  4. コマンドプロンプトを開き、と入力しますpath/to/CorFlags.exe path/to/your/exeFile.exe /32Bit+

完了です!これにより、プログラムの開始フラグが設定され、32ビットWOW64モードで起動するため、microsoft.jet.oledb.4.0にアクセスできます。


1

IIS設定アプリケーションプールの詳細設定の変更。32ビットアプリケーションを有効にする


1

マシンに基づいてプロパティを変更するだけで、すべてが完了しました:-)

プロジェクト--->プロパティ--->ビルド--->ターゲットフレームワーク---> X64

または

プロジェクト--->プロパティ--->ビルド--->ターゲットフレームワーク---> X86


1

接続文字列を

var myConnectionString = string.Format( "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = {0}; Persist Security Info = True; Jet OLEDB:Database Password =;"、gisdbPath);

これに:

var myConnectionString = string.Format( "Provider = Microsoft.Jet.OLEDB.4.0; Mode = Share Deny None; Data Source = {0}; user id = Admin; password =;"、gisdbPath);

これは、Microsoft.Jet.OLEDB.4.0の登録を要求したことがない場合に機能します。


0

実際、Jetの64ビットバージョンはなく、(明らかに)作成する計画もありません。

ACE 64ビットドライバーを使用できる場合があります。http//www.microsoft.com/en-us/download/details.aspx?displaylang = en&id = 23734

  • しかし、32ビットアプリでJetに戻る必要がある場合、それがどのように機能するかはわかりません。

ただし、Expressバージョンでプロジェクトを32ビットに切り替えることができる場合があります(試していないため、2008をどのフレーバーでもインストールしていません)。

たぶん、Accessデータベースをまとめて解体し、弾丸を噛んで代わりにSQLサーバーに移行する時がきたのではないでしょうか。



0

IISの以前のバージョンでは、次のコマンドを実行Advance SettingsするEnable 32-bit Applications必要があるため、そのようにはなりません。

cscript%SYSTEMDRIVE%\ inetpub \ adminscripts \ adsutil.vbs SET W3SVC / AppPools / Enable32bitAppOnWin64 1

そして

%SYSTEMROOT%\ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_regiis.exe -i

参照:ここに


0

Windows 8.1で「SQL Server 2014 Import and Export Data(64-bit)」を実行しているときにも同じ例外が発生しました。

この問題を修正するには、この問題を次のようにしました

SQL Server 2014データのインポートとエクスポート(32ビット)を64ビットではなく開始し、それは私のために働いています。IIS設定を変更しておらず、追加のソフトウェアもインストールしていません。


0

このドライバーを使用してExcelファイルに接続しているため、新しいサーバーにアプリケーションを展開するときに、この問題が何度も発生することはわかっています。だからここで私が最近やっていることです。

Windows Server 2008 R2があり、私はx64ビットマシン用のAccessドライバーをインストールし、このメッセージを表示せずに別のものにぶつかっただけでとても満足しています。

以下のこれは私の開発マシンでうまく機能しますが、最新のODBCドライバーをインストールした後でもサーバーでエラーが発生します。これは問題だと思いますが、これは私がそれを解決した方法です。

private const string OledbProviderString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\OlsonWindows.xls;Extended Properties=\"Excel 8.0;HDR=YES\"";

以下のような新しいプロバイダーに置き換えます。

private const string OledbProviderString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\OlsonWindows.xlsx;Extended Properties='Excel 12.0;HDR=YES;';";

しかし、私がこれをするとき、あなたが気づくべき一つの事があります。.xlsxファイル拡張子とExcelバージョンの使用は12.0です。

このエラーメッセージError: "Could Not Find Installable ISAM"遭遇した後、以下のように少し変更することにします。

private const string OledbProviderString =      @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\OlsonWindows.xls;Extended Properties='Excel 8.0;HDR=YES;';"; 

はい、それで厄介なことは終わりましたが、ここで別のメッセージが表示されます。MicrosoftAccessデータベースエンジンがファイル 'time_zone'を開いたり、ファイルに書き込んだりできません。すでに別のユーザーによって排他的に開かれているか、そのデータを表示および書き込む権限が必要です。それは私がそれを解決するのにそれほど遠くないことを私に伝えます。

その間にファイルを開いた別のプロセスがあり、私がしなければならないすべては再起動であり、すべて期待どおりスムーズに実行を開始します。


0

スタート->ファイル名を指定して実行に移動し、cmdと入力してコマンドプロンプトを起動します(スタート->プログラム->アクセサリ->コマンドプロンプトからも利用できます)

cd ..と入力してreturnキーを押します。cd ..と入力してもう一度returnキーを押します(プロンプトが表示されるまでこれを繰り返します:>)

ここで、c:\ windows \ system32であるか、c:\ winnt \ system32であるか、c:\ windows \ sysWOW64である特別なフォルダーに移動する必要があります。たとえば、cd c:\ windows \をそれぞれ入力してみてください。 sysWOW64(指定されたパスが見つからない場合は、次のパスを試してください)cd c:\ windows \ system32 cd c:\ winnt \ system32これらのいずれかがエラーを引き起こさない場合は、停止してください。正しいフォルダ。

次に、これらのコマンドを入力し、それぞれの後でReturnキーを押して、OLE DB 4.0 DLLを登録する必要があります

regsvr32 Msjetoledb40.dll regsvr32 Msjet40.dll regsvr32 Mswstr10.dll regsvr32 Msjter40.dll regsvr32 Msjint40.dll


-2

Jetの64ビットプロバイダーはありません。Jet to Excelを含む複数のDBソースをサポートする場合は、少なくともアプリケーションのその部分を32ビットプロセスで実行する必要があります。

x86用にコンパイルするときに発生するエラーは少し奇妙です。この場合、64ビットアセンブリを参照する方法がわかりません。


アンソニー、プロジェクトの一部のみを32ビットモードで実行するにはどうすればよいですか?Excelを含むこれらすべてのDB接続は、1つのプロジェクトに属します。また、64ビットOSで実行しようとすると、x86でエラーが発生しました。これは、64ビットOSにインストールされているDB2ドライバーが64ビットバージョンであり、32ビットモードで実行するように構成されているアプリケーションから参照されるとエラーが発生するためだと思います。
neo

プロジェクトを複数のexeに分割することがその価値よりも面倒な場合は、32ビットにコンパイルするだけです。DB2の問題については、おそらく別のDB2固有の質問について、DB2の専門家を探す必要があります。通常、SQL Serverのようなものは、64ビットマシンに32ビットプロバイダーと64ビットプロバイダーの両方をインストールします。
AnthonyWJones 2010年

Anthony、コメントありがとうございます。この問題について多くの検索を行い、コメントから、私が理解したことは、Excelシートを別のプロジェクトとして処理するプロジェクトの一部を作成し、32ビットバージョンでコンパイルする必要があることです。
neo

3
人々が知っているように、A2010には64ビットJetが搭載されます。
David-W-Fenton、2010年

おかげでデビッド、2010年には、64ビットドライバを持っている
NEO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.