Microsoft.ACE.OLEDB.12.0提供程序未注册。

68

我有一个包含两个项目的 Visual Studio 2008 解决方案(一个 Word 模板项目和一个用于测试的 VB.Net 控制台应用程序)。这两个项目都引用了一个数据库项目,该项目打开一个连接到 MS-Access 2007 数据库文件,并具有对 System.Data.OleDb 的引用。在数据库项目中,我有一个检索数据表的函数,如下所示:

 private class AdminDatabase
   ' stores the connection string which is set in the New() method
   dim strAdminConnection as string

   public sub New()
   ...
   adminName = dlgopen.FileName
   conAdminDB = New OleDbConnection
   conAdminDB.ConnectionString = "Data Source='" + adminName + "';" + _
       "Provider=Microsoft.ACE.OLEDB.12.0"

   ' store the connection string in strAdminConnection
   strAdminConnection = conAdminDB.ConnectionString.ToString()
   My.Settings.SetUserOverride("AdminConnectionString", strAdminConnection)
   ...
   End Sub

   ' retrieves data from the database
   Public Function getDataTable(ByVal sqlStatement As String) As DataTable
        Dim ds As New DataSet
        Dim dt As New DataTable
        Dim da As New OleDbDataAdapter
        Dim localCon As New OleDbConnection


        localCon.ConnectionString = strAdminConnection

        Using localCon
            Dim command As OleDbCommand = localCon.CreateCommand()
            command.CommandText = sqlStatement
            localCon.Open()
            da.SelectCommand = command
            da.Fill(dt)
            getDataTable = dt
        End Using

    End Function
End Class

当我在我的Word 2007模板项目中调用此函数时,一切都很正常,没有错误。但是当我从控制台应用程序中运行它时,它会抛出以下异常:

ex = {"本地计算机未注册'Microsoft.ACE.OLEDB.12.0'提供程序。"}

这两个项目都引用了相同的内容,而且当我最初编写这个控制台应用程序(一段时间以前)时,它确实运行正常。 我肯定是漏掉了什么,但我不知道是什么。 有什么想法吗?


我也遇到了同样的问题。你们能帮我一下吗?请问我在哪里可以找到2007访问数据库提供程序的安装程序? - user204420
请查看 -> https://dev59.com/jWw15IYBdhLWcg3wYasx - Bernhard
9个回答

53
基本上,如果您使用64位机器,则IIS 7默认情况下不会提供32位应用程序,而数据库引擎就是在其上运行的。因此,这里是您需要执行的操作:
1)确保已安装2007数据库引擎,可以从以下链接下载: http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en 2)打开IIS7管理器,并打开应用程序池区域。在右侧边栏中,您将看到一个选项,其中说“设置应用程序池默认值”。点击它,一个窗口将弹出,显示选项。
3)第二个下面的字段,名称为“启用32位应用程序”,默认情况下可能设置为false。只需单击其上的位置,将其更改为“true”。
4)重启您的应用程序池(您可以通过点击RECYCLE而不是STOP然后START来完成此操作,这也可以工作)。
5)完成,您的错误消息将消失。

这对我有用... Visual Studio 2010 Premium,Windows Server 2008 R2,IIS 7,在分层Web应用程序中使用WCF。 - longda
1
请注意,这意味着使用此标志,应用程序池将完全在32位模式下运行。 - John Weldon
微软的链接已经失效了。如果有人正在寻找2007数据库引擎的替代链接,可以在download.com上找到它:https://download.cnet.com/2007-Office-System-Driver-Data-Connectivity-Components/3000-10254_4-75452798.html这是合法的。遗留软件维护的乐趣。 - misterManSam

43
我有一个使用Visual Studio 2008的Visual Basic程序,它使用Access 2007数据库,并且遇到了相同的错误。我找到了一些线程建议在64位系统上运行时,在程序属性中更改高级编译配置为x86。到目前为止,我的程序没有出现任何问题。

4
对于一个asp.net应用程序,这取决于IIS,因此请查看这篇文章:http://support.microsoft.com/kb/894435/en-us - devzero
6
我在一个ASP.NET应用程序上遇到了同样的问题-本地运行代码可以,但在服务器上无法运行。需要在这里安装2007 Office System Driver: Data Connectivity Components:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en,然后必须启用工作进程(应用程序池)以允许32位应用程序在网站上运行。 - Keith
3
不能使用x86的人并没有获益。有一种64位的ACE版本:http://goo.gl/Cxsf1,但是需要先卸载Office 2003,因为它们之间存在兼容性问题。 - Jordan
我有64位操作系统和安装了Access数据库引擎分发程序的Office 2010 x86版本,我正在尝试通过互联网上所有可能的解决方案来修复错误...但是它没有起作用。我还有另一个项目,其中相同的提供程序可以正常工作。 - incomplete

7

您是否在运行64位系统,数据库运行32位,但控制台运行64位?没有适用于64位的MS Access驱动程序,并且会报告与您报告的错误相同的错误。


是的,我正在运行64位XP,这正是问题所在。在高级编译选项中将目标CPU切换为x86位应用程序,现在一切都正常了。谢谢。 - Azim J

5

解决方案:

就是这样!感谢Arjun Paudel提供的链接。以下是XNA Creator's Club Online上找到的解决方法,作者是Stephen Styrchak。

下面的错误提示让我相信你正在编译64位:

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

我没有express版本,但是2008 express中是否有效呢?

http://forums.xna.com/forums/t/4377.aspx#22601

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/ed374d4f-5677-41cb-bfe0-198e68810805/?prof=required
- Arjun Paudel


VC# Express中,该属性缺失,但如果您知道该去哪里,仍然可以创建x86配置。

看起来像是一长串步骤,但一旦您知道这些东西在哪里,就会更容易。任何只有VC# Express的人都可能会发现这个有用。一旦您了解了Configuration Manager,下次就会更加直观。

1.在VC# Express 2005中,转到工具 ->选项
2.在选项对话框的左下角,勾选“显示所有设置”的框。
3.在左侧的树形视图中,选择“项目和解决方案”。
4.在右侧的选项中,勾选“显示高级生成配置”。
5.单击“确定”。
6.转到生成 ->配置管理器...
7.在项目旁边的平台列中,单击组合框并选择“<新建...>”。
8.在“新平台”设置中,选择“x86”。
9.单击“确定”。
10.单击“关闭”。
现在,您有了一个x86配置!简单易懂! :-)

我还建议使用Configuration Manager删除任何CPU平台。如果您曾经依赖于32位本机DLL(甚至间接依赖),您真的不想要它。

Stephen Styrchak | XNA游戏开发者 http://forums.xna.com/forums/p/4377/22601.aspx#22601



感谢您提供的额外信息和详细解释,关于更改编译器目标(x86或64位)。 - Azim J

3
我想介入一下,因为我在面对一个稍微不同的问题时发现了这个问题,并认为它可能会帮助未来的其他受折磨的灵魂:
我有一个托管在 Windows Server 2008 64 位上运行的 IIS 7.0 上的 ASP.NET 应用程序。
由于 IIS 控制进程位数,所以在我的情况下解决方案是将 Enable32bitAppOnWin64 设置为 true: http://blogs.msdn.com/vijaysk/archive/2009/03/06/iis-7-tip-2-you-can-now-run-32-bit-and-64-bit-applications-on-the-same-server.aspx

在IIS 6.0中,它的工作方式略有不同(您不能在应用程序池级别设置Enable32bitAppOnWin64)。 http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/0aafb9a0-1b1c-4a39-ac9a-994adc902485.mspx?mfr=true


2

请参考我在类似的Stack Exchange主题上发布的帖子https://dev59.com/jWw15IYBdhLWcg3wYasx#21455677

我安装的是版本15,而不是12,我通过运行以下PowerShell代码发现了这一点...

(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

2

我遇到了同样的问题。我尝试在Windows 7 64位上安装Office 2010 64位,然后安装2007 Office System Driver:数据连接组件。

之后,Visual Studio 2008就可以打开与MS-Access 2007数据库文件的连接。


1

我在一个完全更新的Windows Vista家庭版64位操作系统中遇到了相同的错误,这是一个我只编译为32位应用程序,在64位机器上安装在programx86文件夹中。即使安装了2007访问数据库提供程序,并且安装了相同版本的SP2,已安装IIS并将应用程序池设置为32位应用程序支持,它仍然显示此错误消息...... 是的,我尝试了任何地方的每个解决方案,但仍然没有成功。

我将我的应用程序切换到ACE OLE DB.12.0,因为JET4.0在64位机器上失败了 - 但没有改善:-/ 我找到的最有希望的线程是这个:

http://ellisweb.net/2010/01/connecting-to-excel-and-access-files-using-net-on-a-64-bit-server/

但是,当您尝试安装64位的“2010 Office System Driver Beta: Data Connectivity Components”时,它会告诉您,如果不卸载所有32位办公应用程序,则无法安装64位版本...即使使用“Microsoft.ACE.OLEDB.12.0”作为提供程序而不是该页面(和其他页面)推荐的“Microsoft.ACE.OLEDB.14.0”,安装32位版本的“2010 Office System Driver Beta: Data Connectivity Components”也无法解决最初的问题。

我的下一步尝试将遵循此帖子:

问题是由于服务器上注册了错误的OLEDB32.DLL和OLEDB32r.DLL版本。如果注册了64位版本,则需要取消注册,然后注册32位版本。要解决此问题,请取消注册位于%Program Files%/Common Files/System/OLE DB路径下的版本。然后在%Program Files (x86)%目录中的相同路径下注册这些版本。

其他人在64位机器上使用JET4.0和OLEDB ACE提供程序是否也遇到了如此多的麻烦?如果其他方法都不起作用,有人找到了解决方案吗?


这里有有用的信息,但正如你现在所知道的那样,这种写作风格并不是StackExchange首选的风格。如果你整理一下(并且可能更新一下仍然记得的最终解决方案),这将有助于这个问题,特别是因为目前网络上版本12.0之后(以及是否应该使用它们)的参考资料非常少。或者,至少,我会感激这次更新。 - CWilson

1
我假设您正在运行64位系统,使用32位数据库并尝试运行64位控制台,则需要在计算机上安装以下软件包。
  1. 安装Microsoft Access Database Engine 2010 x86可再发行版,该安装程序可在以下位置获得: http://www.microsoft.com/download/en/details.aspx?id=13255
  2. Office 2007数据连接组件,该安装程序可在以下位置获得: http://www.microsoft.com/download/en/confirmation.aspx?id=23734
  3. Microsoft Access Database Engine 2010 x64可再发行版。 您需要在本地下载软件包并使用被动标志运行它。您可以在此处下载安装程序: http://www.microsoft.com/en-us/download/details.aspx?id=13255 使用命令提示符安装,并加上 '/passive' 标志。在命令提示符下运行以下命令: 'AccessDatabaseEngine_x64.exe /passive'
注意:顺序似乎很重要 - 因此,如果您已经安装了任何内容,请卸载并按照上述步骤进行操作。

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