The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
Excel Microsoft.Jet.OLEDB.4.0 外部數據庫驅動程序中(1)的意外錯誤
昨天更新系統的bug,據說是微軟要搞事情啊
刪除以下更新就行:
win7 KB4041678 KB4041681
SERVER 2008 R2 KB4041678 KB4041681
WIN10 KB4041676 KB4041691
SERVER 2016 KB4041691
使用C#開發的Web系統,其中有項功能,上傳Excel報表,從Excel裏讀取數據,導入到數據庫中。
從10月底開始,使用者反應無法正常使用,報如下錯誤信息:
Unexpected error from external database driver (1)
經查,所有的批量導入都出現這個錯誤,不能導入,因此判斷為是服務器上系統環境發生了改變。
網上查詢,是由於10月10日微軟發布了新的補丁程序,打了此補丁以後,會影響到讀取Excel的引擎。
程序中如果是使用“Provider=Microsoft.Jet.OLEDB.4.0“,則會受影響。
解決辦法:
1、卸載此補丁程序
我從控制面板--->刪除程序,未找到此補丁程序。
2、使用新的引擎
程序改為”Provider=Microsoft.ACE.OLEDB.12.0“
經如此修改後,我有兩個系統,分別部署在A、B服務器上。
1)、A服務器,系統環境Win 2008 R2 64bit English,Office 2010 32bit
在此服務器上,程序更新上去以後,批量導入恢復正常。
2)、B服務器,系統環境Win 2008 R2 64bit English,Office 2010 64bit
在此服務器上,程序更新上去以後 ,批量導入仍然不能使用。報如下錯誤信息:
The ‘Microsoft.ACE.OLEDB.12.0‘ provider is not registered on the local machine.
檢查IIS,應用程序池裏已經啟用了32位程序的使用。
依照網上查詢的下載了新的引擎AccessDatabaseEngine.exe,這個是適用於32位的,又下載了AccessDatabaseEngine_X64.exe(適用於64位)的。
安裝AccessDatabaseEngine.exe,提示服務器上當前安裝的是64位的Office,不能安裝此引擎。
安裝AccessDatabaseEngine_X64.exe,可以正常安裝,但使用批量導入,仍然報錯。
報錯誤信息:The ‘Microsoft.ACE.OLEDB.12.0‘ provider is not registered on the local machine.
考慮到Web程序是在32位的開發環境下開發的,應該使用32位的引擎。
經網上查詢,采用下面方法安裝適用於32位的AccessDatabaseEngine.exe,增加參數 /passive,可以繞開檢查服務器上當前是64位Office 的檢查
運行--->CMD,進入Dos命令行,進入AccessDatabaseEngine.exe所在文件夾,如下:
C:\xxx\AccessDatabaseEngine.exe /passive
安裝成功後,批量導入作業恢復正常
在控制面板裏,查看,安裝後呈現下面情況:
解決方案: 1、網上的方案是:在控制面板>程序>程序和功能>已安裝更新中,找到對應的兩個補丁,進行卸載。不同系統對應不同的補丁,具體可以參考:http://www.cnblogs.com/net-god/p/7661313.html 2、微軟給出的解決方案是:下載新的驅動引擎(Microsoft Access Database Engine 2010 Redistributable),更改Provider=Microsoft.Jet.OLEDB.4.0為Provider=Microsoft.ACE.OLEDB.12.0。 參考資料: 1、Excel Microsoft.Jet.OLEDB.4.0 外部數據庫驅動程序中(1)的意外錯誤 2、導入表的時候提示“外部數據庫驅動程序(1)中的意外錯誤”解決方法 3、外部數據庫驅動程序(1)中的意外錯誤 2、Unexpected error from external database driver (1) 3、Error in Windows update KB4041681 - Unexpected error from external database driver (1)The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.