Microsoft.Jet.OLEDB.4.0的提供程序未在本地计算机上注册


191

我在32位Windows 2008服务器中创建了一个用.NET 3.5开发的Windows应用程序。在64位服务器上部署应用程序时,它显示错误“ Microsoft.Jet.OLEDB.4.0'提供程序未在本地计算机上注册”。

因此,作为此问题的解决方案,我将项目的build属性更改为X86,以便它将以32位模式进行构建,并在32位计算机上重建该项目。但是,同一项目使用其他数据库驱动程序(DB2,SQL等)连接到其他数据库。因此,当我再次在64位操作系统上部署我的应用程序时,它会抛出异常“试图在32位平台上加载64位程序集。”

我正在使用Microsoft.Jet.OLEDB.4.0驱动程序来读写Excel(.xls)

Answers:


238

我找到了解决此问题的方法。我在问题中描述的问题基本上是由于64位操作系统中的Microsoft.Jet.OLEDB.4.0驱动程序不兼容而出现的。

因此,如果我们在64位服务器中使用Microsoft.Jet.OLEDB.4.0驱动程序,则必须强制我们的应用程序以32位模式进行构建(这是我在广泛搜索此已知问题时发现的答案)这会导致我代码的其他部分中断。

幸运的是,现在Microsoft已经发布了64位兼容的2010 Office System驱动程序,该驱动程序可以替代传统的Microsoft.Jet.OLEDB.4.0驱动程序。它既可以在32位服务器上运行,也可以在64位服务器上运行。我已将其用于Excel文件操作,并且在两种环境下均对我有效。但是此驱动程序位于BETA中

您可以从Microsoft Access Database Engine 2010 Redistributable下载此驱动程序


6
也要特别注意该链接上的说明:)
标记

4
我遇到过同样的问题。我将应用程序配置更改为x86,然后成功了!
skpaul

9
我也不得不将连接字符串从使用Microsoft.Jet.OLEDB.4.0更改为Microsoft.ACE.OLEDB.12.0
Spikolynn

16
是的,尽管可以使用64位兼容的Access Database Engine,但它要求系统上尚未安装32位版本的MS Office产品(例如32位MS Word),这是一个大问题。解决方法是使用32位版本的Access Database Engine 2010,并强制.NET应用程序以32位模式运行(例如,通过在Configuration Manager中选择x86平台)。正确的解决方案是用更好的替代方法替代MS Access。
Massood Khaari 2013年

2
菜鸟问题:我可以像在“我的应用程序内”那样分发此驱动程序吗?还是每个想要使用我的应用程序的用户都必须手动安装它?
philx_x 2016年

117

如果问题仍然存在于ASP.NET中,我所要做的就是在“应用程序池”的“高级设置”中将“启用32位应用程序”设置更改为True。


我使用的是64位ODBC,并且此更改开始使我出现数据库错误。我改正了。万一有人也遇到这种情况,您将必须安装32位ODBC驱动程序,然后在其中创建DSN。
Farhan Hafeez 2013年

2
现在很有可能完全用64位代码完成此操作。安装neo的答案中的可再发行链接,然后使用Iqbal的答案中建议的Provider字符串。然后对这两个答案进行投票。而已!
罗曼·斯塔科夫

在安装32位Access DB Engine Redist之后,这在Windows Server 2008 R2上为我解决了该问题。
克里斯·皮克福德

2
缺点是该池将以32位模式运行。我们将改用ACE以避免这种情况。
wtjones 2014年

Windows Forms也为我工作。根本没有ASP.NET代码
philx_x 2016年

52

我也有同样的问题

Microsoft.Jet.OLEDB.4.0的提供程序未在本地计算机上注册

我应用了neo的答案,但直到将提供者更改为“ Provider = Microsoft.ACE.OLEDB.12.0;”,该方法才起作用在连接字符串中。

希望如果有人遇到同样的问题,这会有所帮助。


4
就是这个!对于64位服务器,请安装由neo(显然是64位变体)链接的可再发行组件,然后按照此答案中的指定更改提供程序,然后它将起作用。
罗曼·斯塔科夫

你是正确的romkyns。我已经说过我应用了neo解决方案,然后更改了提供者。但是,谢谢您的评论使它更加清晰。非常感谢romkyns
Iqbal

将Microsoft.Jet.OLEDB.4.0替换为Microsoft.ACE.OLEDB.12.0;在app.config中,一切正常。
AVEbrahimi

1
我发现这可行,尽管将应用程序限制为32位,但没有任何区别。
Ryan Lundy

在我的情况:“Microsoft.ACE.OLEDB.12.0未注册”,:(
塞萨尔·莱昂

29

我知道这是一个很老的问题,很多人都回答了。但我正在总结一些东西,以供理解:

如果文件扩展名是xls并且OS是32位,则只有您可以使用“ Microsoft.Jet.OLEDB.4.0”。Microsoft尚未发布此驱动程序的64位版本。

如果文件扩展名为xlsx或OS为64位,则必须使用“ Microsoft.ACE.OLEDB.12.0”。以32/64位模式编译的应用程序不会影响驱动程序的选择。

始终Microsoft.ACE.OLEDB.12.0在OS 64位上安装64位驱动程序。如果您已经安装了Office 32位,则需要使用/ passive参数从cmd运行驱动程序。该黑客攻击仅在Office 2013之前有效,Microsoft从Office 2016 for Microsoft.ACE.OLEDB.16.0驱动程序停止了此替代方法。

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位Access驱动程序,在32位OS上寻找32位Access驱动程序。


1
感谢您的回答,但是,我在Windows 10上使用VS2015并使用X64。当我将项目配置从AnyCPU更改为X86时,问题消失了。我不必安装任何其他驱动程序。
NoChance 2016年

@NoChance我认为您已经在计算机上安装了Office 64位,并且已经包含Microsoft.ACE.OLEDB.12.0驱动程序。
Romil Kumar Jain

谢谢您的答复,我只有Office 2007。
NoChance

19

我同样的消息,我有在Visual Studio 2010中做一个网页,我读了file.xls在该网页上,在我的项目视觉也没有任何问题,当我把它放在我的IIS的本地扔我一个“微软.Jet.OLEDB.4.0'提供程序未在本地计算机上注册' ,我按照以下步骤修复了该问题,


1.- 打开IIS 2.-在“ 高级设置”中更改appPool
3.-true,以启用到32位应用程序。

就这样

ps.I在Active Solution Platform上将Configuration Manager更改为X86


这会强制您的应用以32位模式运行。如果您希望能够避免4GB的障碍,则需要将此设置关闭。
Brain2000

18

如果您的应用程序在localIIS上运行,则可以通过在AppPool的“ 高级设置”中启用32位应用程序来解决此问题。

在此处输入图片说明




5

我们在桌面应用中遇到了这个问题。

开发环境: Windows 7 Ultimate-64位.Net Framework 4.5 Provider = 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. 安装时,您所需要做的就是CorLibs.exe,所以只需检查Windows开发工具即可
  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/zh-cn/download/details.aspx? displaylang=en& id=23734

  • 但是我不知道如果您需要返回Jet来使用32位应用程序,那将如何工作。

但是,您可以将Express版本的项目切换到32位(我没有尝试过,也没有以任何方式安装2008)

也许是时候完全废弃Access数据库,硬着头皮转而使用SQL Server了?



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导入和导出数据(64位)”时,我遇到了同样的异常。

为了解决这个问题,我做了以下工作

已启动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。

在遇到此错误消息错误:“找不到可安装的ISAM”之后,我决定对内容进行如下更改:

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

是的,我已经完成了该讨厌的事情,但是在这里,我又收到一条消息,Microsoft Access数据库引擎无法打开或写入文件“ time_zone”。它已经由另一个用户独占打开,或者您需要权限才能查看和写入其数据。这告诉我我离解决它不远。

也许还有另一个进程同时打开了文件,而我要做的就是重新启动,并且所有启动都会按预期顺利运行。


0

转到“开始”->“运行”并键入cmd,这将启动命令提示符(也可从“开始”->“程序”->“附件”->“命令提示符”中获得)

键入cd ..并按回车键键入cd ..并再次按return键(继续执行直到提示显示:>)

现在您需要转到一个特殊的文件夹,它可能是c:\ windows \ system32或它可能是c:\ winnt \ system32或它可能是c:\ windows \ sysWOW64尝试键入以下每个文件,例如cd c:\ windows \ sysWOW64(如果显示“系统找不到指定的路径,请尝试下一个路径”)。cd c:\ windows \ system32 cd c:\ winnt \ system32当其中一个没有引起错误时,停止,您已经找到了。正确的文件夹。

现在您需要通过键入以下命令并在每个命令之后按回车键来注册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在内的多个数据库源,则至少需要应用程序的那部分才能在32位进程中运行。

为x86编译时遇到的错误有点奇怪。我看不到在这种情况下如何最终引用64位程序集。


安东尼,我如何才能使项目的某些部分仅以32位模式运行?所有这些数据库连接,包括Excel,都将属于一个项目。当我尝试在64位OS中运行它时,我也遇到了x86错误。我认为这是因为安装在64位操作系统中的DB2驱动程序是64位版本,并且从配置为以32位模式运行的应用程序引用时,会导致错误。

如果将项目拆分为多个exe文件比其价值更麻烦,那么您仅需编译为32位。关于DB2问题,您可能会寻找一些DB2专家来解决这个也许是另一个DB2特定问题。通常,诸如SQL Server之类的事情会在64位计算机上同时安装32位和64位提供程序。
AnthonyWJones

感谢安东尼的评论。从对这个问题的大量搜索以及您的评论中,我理解的是,我必须创建项目的一部分,该部分将excel工作表作为一个单独的项目进行处理,并使其以32位版本进行编译。

3
众所周知,A2010将配备64位Jet。
David-W-Fenton,2010年

感谢大卫,2010确实有64位驱动程序
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.