“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机注册。

573

我正在尝试在按钮单击事件中从Excel文件中获取数据。我的连接字符串是:

 string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\source\\SiteCore65\\Individual-Data.xls;Extended Properties=Excel 8.0;";

当我点击按钮时,我得到了以下错误:

'Microsoft.ACE.OLEDB.12.0'提供程序未在本地计算机上注册。

我不知道如何解决这个问题。我的操作系统是Windows 7。


12
只是一个旁注:使用OLEDB读取Excel文件是过时的技术,速度非常慢,并且正如你所发现的,需要在目标计算机上手动安装额外的软件包。(诚然,这个问题是在2011年提出的。)最好使用ClosedXml(可在NuGet上获得),它可以直接使用。 - Shaul Behr
7
很抱歉,ClosedXML 只支持 .xlsx 格式的文件,不支持 .xls 格式。 - Jimmy
6
如果你正在导入到Sql Server中,你可以从ssms运行以下查询: execute master.dbo.xp_enum_oledb_providers它会告诉你它认为你有哪些提供商。它告诉我我有Microsoft.ACE.OLEDB.16.0和Microsoft.ACE.OLEDB.12.0两个提供商,但当我尝试导入数据时,对于Excel 16和Excel 2007文件格式(oledb.16.0和oledb.12.0),我得到了与OP相同的“未在本地计算机上注册”的错误。此时放弃微软软件是明智的选择。 - user1040323
1
还可以参考此答案 https://dev59.com/TGYq5IYBdhLWcg3wixJr#14401857,了解 Microsoft.Jet.OleDb 和 Microsoft.Ace.OleDb 之间的区别。 - Jeff Widmer
4
@user1040323,执行execute master.dbo.xp_enum_oledb_providers命令可以告诉你服务器上有哪些内容,而不是你的本地计算机 - Nathan Goings
6
这是可以工作的版本: 并没有真正记录,但我找到了一种安装32位和64位版本的方法。只需将命令行参数“/passive”添加到命令中即可:“C:\ directory path \ AccessDatabaseEngine_x64.exe” /passive_ - TaW
39个回答

665

61
我下载了这些组件,但它们对我无效,所以我不得不从这里下载Microsoft Access Database Engine 2010 Redistributable:http://www.microsoft.com/en-in/download/details.aspx?id=13255 我确信这是因为我使用的是MS Office 2013。感谢你指引我找到正确的方向。 - Sizons
7
我必须在这里安装访问数据库引擎和2007 Office System驱动程序:数据连接组件 https://www.microsoft.com/en-us/download/confirmation.aspx?id=23734 才能使它工作。 - Chris
8
我的情况很好,突然间出现了这个错误。所以是什么原因导致出现这个问题呢?代码没有改变。 - eetawil
38
在我的情况下,我不得不从“Any CPU”切换到x64以匹配我的架构。 - Rob Sedgwick
3
“Jack the Ripper”指的是答案本身提供的解决方案,而不是评论。安装“2007 Office System Driver: Data Connectivity Components”立即解决了这个问题。 - silkfire
显示剩余9条评论

202
一份64位的“Microsoft Access Database Engine 2010 Redistributable”版本已经发布,它将允许您使用“Microsoft.ACE.OLEDB.12.0”提供程序。您可以在此处获取下载链接:
http://www.microsoft.com/en-us/download/details.aspx?id=13255 如果您使用接受答案中提供的下载链接,则需要构建x86版本,正如@backtestbroker.com所指出的那样。

23
如果使用VS 2012,请确保在项目的属性>>生成>>常规配置中取消选中“首选32位”复选框。 - devstruck
3
我使用的是VS 2008(别问我为什么),在我阅读了post_erasmus的提示并将我的应用程序的“平台目标”设置为x64后,这个解决方案才起作用。非常感谢! - Resource
1
这个答案中的链接还允许您下载和安装32位版本。尽管我使用的是Windows 7 64位,但Visual Studio 2013的IIS Express默认运行在32位模式下,并且我已经安装了一些Office 2013组件的32位版本,因此我需要的是32位安装包。 - Eric Barr
4
为了回答这个问题,我还需要将“启用 32 位应用程序”设置为假,以便于应用程序池正常运行。 - iowatiger08
2
这帮助解决了我的问题。我的VS 2019应用程序是使用Any CPU编译的,因此生成了一个x64库。我安装了Office 2013的32位版本,这导致我无法安装x64 Access DB引擎。安装x64版本的Office后,我就能够安装x64引擎,现在一切都正常了。 DLL地狱还在继续。 - Mike Lowery
显示剩余4条评论

111
根据应用程序(32/64位)使用的连接,您可以仅安装以下其中一个:

摘要:

  • 所有从2007年到2016年的Office都包含提供程序“Microsoft.ACE.Oledb.12.0”
  • 根据您的应用程序架构选择适当的运行时引擎(32/64)6
  • 使用PowerShell命令从32位和64位shell检查您的提供程序:

  • (New-Object system.data.oledb.oledbenumerator).GetElements() | select SOURCES_NAME, SOURCES_DESCRIPTION 
    
  • 并且您将看到您的系统可以使用哪个提供程序

长话短说: 可以在http://live.sysinternals.com/strings.exe找到这些字符串。

例如,在安装了32位驱动程序的64位系统上。

strings.exe -u -n 10 "c:\Program Files (x86)\Common Files\microsoft shared\OFFICE12\MSO.DLL" | findstr "ACE.O"
strings.exe -u -n 10 "c:\Program Files (x86)\Common Files\microsoft shared\OFFICE14\MSO.DLL" | findstr "ACE.O"
strings.exe -u -n 10 "c:\Program Files (x86)\Common Files\microsoft shared\OFFICE15\MSO.DLL" | findstr "ACE.O"

即使在即将发布的Office 2016版本中

c:\Program Files\Microsoft Office\root\VFS\ProgramFilesCommonX64\Microsoft Shared\OFFICE16\MSO.DLL
c:\Program Files\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\MSO.DLL

您将找到以下字符串

  • Microsoft.ACE.OLEDB

  • Microsoft.ACE.Oledb.12.0

Office 2013也附带了csi.dll。

c:\Program Files (x86)\Common Files\microsoft shared\OFFICE15\Csi.dll
c:\Program Files\Common Files\Microsoft Shared\OFFICE15\Csi.dll

其中包含 "Microsoft.ACE.OLEDB.15.0",

和 Office 2016。

c:\Program Files\Microsoft Office\root\VFS\ProgramFilesCommonX64\Microsoft Shared\OFFICE16\Csi.dll
c:\Program Files\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\Csi.dll

具有“Microsoft.ACE.OLEDB.16.0”版本


我在使用Nuget LinqToExcel时,在VS2015中遇到了这个错误。结果发现,因为我安装了x64 ACE,所以我必须明确地构建x64(配置管理器),而不是针对任何CPU。 - subsci
PowerShell 显示已经安装了 "Microsoft.ACE.Oledb.12.0"。然而,安装 Access 2007 包(又名 _2007 Office System Driver: Data Connectivity Components_)让我可以使用它。我的系统上已经安装了:Office 2016 Ent、Visual Studio 2017 Ent。 - SushiGuy
11
PowerShell脚本通知已安装版本的做法真是太聪明了!谢谢@Bernhard。 - Rob Bowman
有点离题,但这个简单的PowerShell是为了你的ODBC驱动程序而设计的:Get-OdbcDriver | select Name,Platform - Bernhard
这个问题在我的64位服务器上得到了解决,方法是下载32位的Access 2016运行时。基本上从32位开始比较保险(当你尝试将项目切换到64位时会发生一些不好的事情)。 - Eric Mutta

62

首先,您需要检查应用程序的构建配置。

  • 如果您是在x86平台下构建项目的,则为了解决问题,您应该在计算机上安装以下软件包:

    1. 为了使用“Microsoft.ACE.OLEDB.12.0”提供程序,您必须首先安装Microsoft Access Database Engine 2010 Redistributable,此安装程序可在以下位置获得:http://www.microsoft.com/download/en/details.aspx?id=13255

      安装完成后,请尝试运行应用程序,如果问题已解决,则非常好,否则请继续第2步。

    2. 这个下一步是一个未经解释的解决方法,它适用于Office 2010,即使它是Office 2007的数据连接组件。我不太确定为什么会这样工作,但实际上它确实可以,并且这在几乎所有情况下都已被证明有效。您需要安装2007 Office System Driver:Data Connectivity Components,此安装程序可在以下位置获得:http://www.microsoft.com/download/en/confirmation.aspx?id=23734

      完成此安装后,请尝试运行您的应用程序,这应该会解决问题。

  • 如果您正在尝试运行在x64或AnyCPU平台下构建的应用程序,我建议首先验证它是否在x86平台上按预期运行。如果它在x86平台下无法运行,请执行第一部分中的步骤并验证其是否按预期运行。

    我读到MS Access驱动程序(包括OLEDB数据库驱动程序)仅在x86平台下工作,并且在x64或AnyCPU平台下不兼容。但这似乎是不正确的。我验证了我的应用程序在构建x86时运行,然后使用被动标志安装了Access Database Engine。

  • 首先将文件下载到本地。您可以从此处下载安装程序:http://www.microsoft.com/en-us/download/details.aspx?id=13255
  • 使用命令提示符带有'/passive'标志进行安装。在命令提示符中运行以下命令:'AccessDatabaseEngine_x64.exe /passive'
  • 经过这两步操作,我成功地在x64或AnyCPU构建配置下构建应用程序并运行。这似乎解决了我的问题。

    注意:步骤的顺序似乎很重要,请按照指示进行。


    6
    我遇到了一个问题,我从一个32位的应用程序切换到64位,结果无法运行。您的指令的第二部分完美地解决了这个问题!“/passive”标志允许在安装32位Microsoft Office的情况下进行安装。 - Freddy
    4
    提示:将AccessDatabaseEngine_x64.exe解压缩到一个文件夹中,以获取AceRedist.msi和Data.cab文件。以管理员模式打开命令提示符,执行AceRedist.msi /passive - Jeremy Thompson
    2
    非常感谢。第一个选项对我有用。我记得之前卸载32位Office时遇到了很多麻烦,只有安装64位Office后才能解决这个问题。但是这个64位Office组件却起到了神奇的作用。 - Biki
    3
    因为我已经解决了两个问题,非常感谢。我需要安装这个:http://www.microsoft.com/download/en/confirmation.aspx?id=23734。 - SENA
    2
    我们在支持的旧应用程序中遇到了这个问题。最终找到正确的答案,但却让我们感到意外,因为我们安装的是64位版本,因为我们使用的是64位笔记本电脑。但是转而使用32位版本的解决方法是(AccessDatabaseEngine.exe)...与应用程序为32位及我们的操作系统运行在64位无关。 - Paul

    37

    我安装了微软的驱动程序,但仍不能正常工作。后来我发现这篇博客文章解决了问题。请在那里阅读,否则使用这两张图片(从该帖子链接)作为TLDR摘要:

    输入图像描述

    输入图像描述


    我本来要把这个作为我的贡献发出来。这是我的问题。昨天我更改了IIS设置,因为我的解决方案中有一个项目是x86编译的,所以我认为它会将整个程序分类为32位。 - Lee
    我的服务器运行在64位,但安装的MS Office组件是32位的。这解决了我的问题。谢谢。 - MarceloBarbosa
    多么难以置信的困难事情要让它运作起来:(,我想知道你是否可以在PowerShell中编写脚本,并将其集成到某种自动化服务器设置脚本中? - David Rogers
    @DavidRogers 可能可以,但我不是 PS 的专家,所以不要指望我!;-) - Shaul Behr
    @ShaulBehr 希望这篇文章能为其他人提供一些见解,我使用的具体命令是(在提升的powershell/cmd窗口中):"C:\Windows\System32\inetsrv./appcmd set apppool /apppool.name:YOURAPPPOOLNAMEHERE /enable32BitAppOnWin64:true" - David Rogers
    显示剩余3条评论

    35

    当我将构建配置从“x86”更改为“Any CPU”时,在Visual Studio 2010中的“配置管理器”对话框中,我遇到了这个错误/异常。我了解到,这个OLEDB数据库驱动程序只能在x86中工作,并且不兼容64位系统。将构建配置更改回x86对我解决了问题。


    5
    OLEDB可与x64兼容,它可以在任何平台下运行,不仅限于x86,也可以作为任何CPU。详见完整答案:stackoverflow.com/a/32760211/3637582 - Merav Kochavi
    在 Visual Studio 中调试应用程序时,选择配置管理器中的x86而不是任何CPU/x64实际上会更加有帮助。 - iknownothing

    22

    虽然已经给出了许多答案,但我遇到的问题尚未提及。

    • 我的场景: 64位应用程序,Win10-64,安装有Office 2007 32位。
    • 从MS下载的32位安装程序AccessDatabaseEngine.exe报告安装成功,但实际上没有安装成功,这已经通过此处其中一篇帖子的Powershell脚本进行了验证。

    • 64位安装程序AccessDatabaseEngine_X64.exe报告了一个令人震惊的错误消息:

    输入图片描述

    非常简单的解决方案可以在这里在Autodesk网站上找到。只需将参数/passive添加到命令行字符串中,像这样:

    AccessDatabaseEngine_X64.exe /passive

    安装成功,OleDb驱动程序可以使用。

    我正在处理的Excel文件是xlsx类型,使用EPPlus 4.5生成并在Excel 2007中进行修改。


    5
    我可以按照通常的方式安装AccessDatabaseEngine_X64.exe,但我使用了被动参数来安装32位等效版本(AccessDataBaseEngine.exe)。然后,我终于可以从Visual Studio 2019连接到Access数据库。 - VolkanOzcan
    1
    这适用于 SQL Server Management Studio v18.8 - Cempoalxóchitl
    1
    这对于在VS 2019中导入Excel的SSIS包也适用。像@VolkanOzcan一样,我也安装了X64版本而没有遇到问题,但必须将passive参数传递给AccessDatabaseEngine.exe(必须是32位版本)。我怀疑无论你第二次安装哪个版本,都可能需要该参数。 - DaVinciCoder
    对我来说不起作用,32位和64位都不行,无论是带 /passive 还是不带。 - cskwg
    对我来说都不起作用,无论是32位还是64位,无论是带有/passive参数还是没有。 - cskwg

    17

    对于所有仍然受到影响的人。

    我一直在收到错误信息...

    OLEDB error "The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine."
    

    ...如OP Shailesh Sahu所描述的那样。

    我使用64位Windows 7。

    我的问题在于PowerShell脚本,但是它使用了一个连接字符串,类似于OP的帖子,因此希望我的发现可以应用于C#、PowerShell和任何依赖于“Microsoft.ACE.OLEDB”驱动程序的语言。

    我按照这个MS论坛线程上的说明进行操作:http://goo.gl/h73RmI

    我首先尝试安装64位版本,然后安装来自此页面的32位版本AccessDatabaseEngine.exe http://www.microsoft.com/en-us/download/details.aspx?id=13255

    但仍然没有成功。

    然后我在PowerShell中运行了下面的代码(来自SQL Panda的网站http://goo.gl/A3Hu96

    (New-Object system.data.oledb.oledbenumerator).GetElements() | select SOURCES_NAME, SOURCES_DESCRIPTION 
    

    …这给了我这个结果(为简洁起见,我已删除其他数据源)…

    SOURCES_NAME              SOURCES_DESCRIPTION                                                                       
    ------------              -------------------                                                                       
    Microsoft.ACE.OLEDB.15.0  Microsoft Office 15.0 Access Database Engine OLE DB Provider
    

    正如你所看到的,我使用的是Microsoft.ACE.OLEDB.15.0 (十五),而不是Microsoft.ACE.OLEDB.12.0 (十二)。

    因此,我修改了我的连接字符串为15,然后它就起作用了。

    以下是一个快速的PowerShell片段,演示如何对版本进行软编码...

    $AceVersion = ((New-Object System.Data.OleDb.OleDbEnumerator).GetElements() | Where-Object { $_.SOURCES_NAME -like "Microsoft.ACE.OLEDB*" } | Sort-Object SOURCES_NAME -Descending | Select-Object -First 1 SOURCES_NAME).SOURCES_NAME
    
    $connString = "Provider=$AceVersion;Data Source=`"$filepath`";Extended Properties=`"Excel 12.0 Xml;HDR=NO`";"
    

    如果有多个版本可用,修改以选择最新的ACE版本

    希望任何人现在都可以检查安装的OLEDB版本并使用相应的版本号。


    你好,我正在尝试使用PowerShell读取Excel表格。Excel文件存储在SharePoint文档库中,服务器上没有安装Excel。我使用的是Windows Server 2008 R2操作系统。我安装了Office System Driver: Data Connectivity Components,但是当我运行查询时无法看到Microsoft.ACE.OLEDB。你有什么想法吗?还有任何建议吗?提前感谢。 - doganak
    3
    我找到了答案。我向系统管理员要求安装MS Access数据库引擎。他安装了x86版本。当我再次在PowerShell x86中运行查询时,我看到了ACE.OLEDB。 - doganak
    厉害的PowerShell代码。我之前安装了32位版本(在PowerShell列表中没有显示),这导致我无法安装64位版本。一旦我删除了32位版本,我就能够安装64位版本而不会出现“您已经拥有32位Office组件...”的消息。64位版本出现在PowerShell列表中,我的应用程序也开始工作了。 - Doppelganger

    16
    您需要根据Office安装的位数,将解决方案平台从"Any CPU"更改为"x86"或"x64"。

    以下是具体步骤:
    1. 在“解决方案资源管理器”中右键单击解决方案文件: 示意图
      1. 单击“配置管理器”。
      2. 单击“活动平台”下拉列表,如果已经有x86,则选择它,否则点击“新建”。 示意图
      3. 从新平台下拉列表选择x86或x64: 示意图
    编译并运行您的应用程序。

    16
    如果您仍然在使用64位操作系统,即使安装了AccessDatabaseEngine,仍然遇到问题,请参见此帖子解决问题,链接为:这篇文章
    也就是说,您需要安装这个 AccessDatabaseEngine

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接