OleDbConnection.Open()仅在一个项目中抛出exception,相同的代码在其他项目中起作用

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

我知道安装的常见修复:

Microsoft Access数据库引擎2010可再发行组件

要么

2007 Office System驱动程序:数据连接组件

两者都安装在我的本地PC上。 这是我的代码

  OleDbConnection conn = new OleDbConnection(); string fileName = "test.xlsx"; try { string connectString = String.Format( "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR={1};'", fileName, "YES"); conn.ConnectionString = connectString; conn.Open(); //exception is thrown here !!! OleDbCommand comm = new OleDbCommand(); comm.CommandText = string.Format("CREATE TABLE [{0}] ", "Test"); comm.Connection = conn; comm.ExecuteNonQuery(); OleDbDataAdapter ad = new OleDbDataAdapter( string.Format("SELECT * FROM [{0}]", "Test"), conn); OleDbCommandBuilder builder = new OleDbCommandBuilder(ad); } catch(Exception ex) { throw ex; } finally { conn.Close(); } 

我在本地机器上的其他项目中尝试此代码,一切正常。 我有创建excel导出的项目,我没有这个问题。

问题是在项目中我不明白如何解决它。 同样在当前项目中,我创建了一个新的.aspx页面,而在Page_Load中只放了这个代码,同样的exception。

附加信息:这个项目是在vs 2008上编写的,转换为2010年,之后用于vs 2012.到目前为止,项目一直在进行。

JET连接字符串也一样!

编辑

Joe的回答之后,我看到这个项目是在64bitProcess上运行的:

 bool test = Environment.Is64BitProcess; //return true. 

我的驱动程序是32位。 我现在可以做什么,我可以改变环境过程。 我无法安装64位进程的驱动程序,因为我已经安装了Office 2010 x32。

用于32位和64位应用的OLEDB驱动程序是不同的。

如果您只安装了32位驱动程序,那么尝试使用它的64位应用程序将收到此错误。 同样,如果您只安装了64位版本,那么尝试使用它的32位应用程序将收到此错误。

你说:

我在本地机器上的其他项目中尝试此代码,一切正常

因此,必须正确安装两者中的至少一个。

要了解发生了什么,您可以检查有效的应用程序中的Environment.Is64BitProcess和不可用的应用程序。 这将告诉你缺少哪个版本。

然后下载并安装缺少的32位或64位版本:

http://www.microsoft.com/en-us/download/details.aspx?id=13255

您需要AccessDatabaseEngine.exe(32位)或AccessDatabaseEngine_64.exe(64位)

请注意,您可能需要将提供程序指定为Office 2010版本的“Microsoft.ACE.OLEDB.14.0”(12.0适用于Office 2007)。

几个小时后我找到了一个解决方案:

步骤是什么,首先我尝试在x86上运行项目 – Properties/Build/Platform Target 。 抛出了我无法重建的exception,因为注册表是错误的。 我创建了注册表。 怎么做:

在记事本文件中粘贴此代码并将其保存为reg文件。 让文件名记住为什么你将来拥有它(Fusion.reg)。

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion] "EnableLog"=dword:00000001 

之后我遇到了问题,因为并非所有程序集都可以被应用程序池读取。 解决方案是关于IIS/Application Pools/Application Pool 4.0/General/Enable 32- Bit Applications 。 之后重新启动IIS,关闭项目并再次打开它,一切都在使用32位版本。