“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册,但不适用于Excel,但适用于Access

我在我的解决scheme的两个地方使用了OledbConnection,一个读取Access,另一个读取Excel。 读取Access的人很好,但读取excel的人给我错误 – “Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册。

这是我读取Excel并返回Datatable的方法。

string CONSTRSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=<FILENAME>;Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\";"; using (OleDbConnection objConnection = new OleDbConnection(CONSTRSTRING.Replace("<FILENAME>", fullFileName))) { DataSet dsImport = new DataSet(); try { objConnection.Open(); DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if ((null == dtSchema) || (dtSchema.Rows.Count <= 0)) { throw new Exception("Excel doesn't contain any readable table/tab"); } new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection).Fill(dsImport); } catch (Exception ex) { throw ex; } finally { objConnection.Close(); } return dsImport.Tables[0]; } 

其他的事情是,如果我从VSdebugging运行的代码,它的工作原理,但不是从IIS运行时。 这只会发生这个代码,其他连接访问工作正常。

ps阅读权限:

 try { string sAccessConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Persist Security Info=False;"; using (System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(sAccessConnection)) { con.Open(); //doing stuffs con.Close(); } } catch (Exception ex) { throw ex; } 

编辑不,它没有答案。 那里说如何注册Microsoft.ACE.OLEDB.12.0。 我的解决scheme有工作的Access(这意味着,它已注册),但不适用于Excel文件。 问题是为什么Excel和Acces不同?

另外,如果我安装x64访问驱动程序,我得到以下的例外

 Retrieving the COM class factory for component with CLSID {73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). 

这种情况有两个众所周知的修复:

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

要么

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

安装他们两个,它应该工作。

当我的项目在64位上运行时,我遇到了更严重的问题,但我安装了32位版本。 你可以检查这个问题: OleDbConnection.Open()抛出exception只在一个项目中,相同的代码在其他项目中工作 。 在其他问题中,您应该find所需的一切来解决这个问题。