213

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

所以作为这个问题的解决方案,我已经将项目的构建属性更改为 X86,这样它将以 32 位模式构建,并在 32 位机器上重建项目。但是,同一个项目使用其他数据库驱动程序(DB2、SQL 等)连接到其他数据库。因此,当我在 64 位操作系统中再次部署我的应用程序时,它会引发异常“尝试在 32 位平台上加载 64 位程序集。”

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

4

21 回答 21

262

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

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

幸运的是,现在微软已经发布了兼容 64 位的2010 Office System 驱动程序,可以替代传统的 Microsoft.Jet.OLEDB.4.0 驱动程序。它适用于 32 位和 64 位服务器。我已将它用于 Excel 文件操作,并且在这两种环境中对我来说都很好。但是这个驱动程序处于测试阶段

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

于 2010-01-02T16:13:10.303 回答
127

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

于 2011-08-24T21:26:25.027 回答
63
于 2013-04-20T06:28:54.597 回答
36

我知道这是很老的问题,很多人已经回答了。但我正在总结一些事情以供理解:

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

如果文件扩展名是 xlsx 或操作系统是 64 位,那么您必须使用“ Microsoft.ACE.OLEDB.12.0”。以 32/64 位模式编译的应用程序不影响驱动程序的选择。

始终Microsoft.ACE.OLEDB.12.0在 OS 64 位上安装 64 位驱动程序。如果您已经安装了 Office 32 位,那么您需要使用 /passive 参数从 cmd 运行驱动程序。此 hack 仅在 Office 2013 之前有效,Microsoft 从 Office 2016 停止了针对 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 位操作系统上查找 64 位访问驱动程序,在 32 位操作系统上查找 32 位访问驱动程序。

于 2016-03-11T09:11:18.123 回答
22

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

在此处输入图像描述

于 2016-12-08T11:30:38.887 回答
21

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

1.-打开 IIS 2.-在高级设置
中更改 appPool 3.-true 以启用 32 位应用程序。就这样


ps.我在活动解决方案平台上将配置管理器更改为 X86

于 2012-06-06T22:57:52.053 回答
8

我遇到过同样的问题。我将应用程序配置更改为x86,然后它工作了!

于 2012-02-07T13:43:18.250 回答
7

我刚刚将我的项目属性更改为 x64 格式

项目--->属性--->构建--->目标框架---> X64

于 2012-08-09T11:28:00.823 回答
7

我们在桌面应用程序中遇到过这个问题。

开发环境: Windows 7 Ultimate - 64 位 .Net Framework 4.5 Provider=Microsoft.Jet.OLEDB.4.0

它已通过将平台目标从任何 CPU 更改为 X86 来解决。项目属性>>构建>>平台目标。

在此处输入图像描述

于 2017-07-06T14:23:14.457 回答
3

我的桌面应用程序遇到了这个问题(“Microsoft.Jet.OLEDB.4.0”提供程序未在本地计算机上注册)。我没有选择构建为 32 位应用程序。希望这会帮助其他处于相同情况的人。

我做了以下事情,问题就消失了:

  1. 按照 neo 的建议,安装了 64 位版本的Microsoft Access Database Engine 2010 Redistributable

  2. 将我的提供商更改为 Microsoft.ACE.OLEDB.12.0

于 2016-01-14T12:57:54.657 回答
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。

于 2017-07-26T21:13:53.860 回答
1

更改 IIS 设置应用程序池高级设置。启用 32 位应用程序

于 2013-08-04T02:40:55.633 回答
1

只需根据您的机器更改属性即可:-)

项目--->属性--->构建--->目标框架---> X64

或者

项目--->属性--->构建--->目标框架---> X86

于 2015-01-10T06:23:51.010 回答
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'。

于 2016-03-17T03:25:04.053 回答
0

确实没有 Jet 的 64 位版本 - 并且(显然)没有计划生产一个。

您也许可以使用 ACE 64 位驱动程序: http: //www.microsoft.com/en-us/download/details.aspx? displaylang=en&id=23734

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

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

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

于 2014-04-05T20:45:44.257 回答
0

我正在为 Winforms 使用 VS2013,以下解决方案对我有用。

于 2014-12-25T18:38:36.397 回答
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

参考:这里

于 2015-01-21T11:23:57.123 回答
0

在我的 Windows 8.1 上运行“SQL Server 2014 导入和导出数据(64 位)”时遇到了同样的异常。

为了解决这个问题,我做了以下事情

启动了 SQL Server 2014 导入和导出数据(32 位)而不是 64 位,它对我有用。我没有更改任何 IIS 设置,也没有安装任何额外的软件。

于 2015-03-15T14:34:31.370 回答
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;';"; 

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

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

于 2015-08-25T08:56:40.293 回答
0

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

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

现在你需要去一个特殊的文件夹,它可能是 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

于 2019-06-13T02:56:22.420 回答
-2

Jet 没有 64 位提供程序。如果您想支持包括 Jet 到 Excel 在内的多个数据库源,您至少需要应用程序的该部分在 32 位进程中运行。

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

于 2010-01-02T14:16:48.613 回答