在做一個把 windows server 2008 上的應用遷移到windows server 2016的項目時,碰到了一個使用了Microsoft.ACE.OLEDB驅動的asp項目,在win 2016上運行始終報錯。
摘錄出來的代碼如下:
<%
Dim xlsConn
set xlsConn = Server.CreateObject("adodb.connection")
'Dim resAs New ADODB.Recordset
Dim sFileName
'sFileName = "1.txt"
sFileName="C:\C\inetpub\wwwroot\asp\1.xlsx"
xlsConn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Persist Security Info=False; Data Source=" & sFileName & "; Extended Properties='Excel 12.0;HDR=Yes'"
'xlsConn.Open "Provider=Microsoft.ACE.OLEDB.16.0; Persist Security Info=False; Data Source=" & sFileName & "; Extended Properties='Excel 12.0;HDR=Yes'"
xlsConn.Close()
set xlsConn = nothing
%>
代碼運行後,始終提示:
ADODB.Connection 錯誤 '800a0e7a'
未找到提供程序。該程序可能未正確安裝。
/asp/oledb_test.ASP,行 22
該服務器上已經安裝了office 2016版本的AccessDatabaseEngine_x64.exe。
由於在舊服務器windows 2008上安裝是的office 2007版本的AccessDatabaseEngine.exe(x86)。一開始懷疑是因爲安裝的是office 2016的原因,導致Windows 2016服務器上的oledb的提供程序已經不是Microsoft.ACE.OLEDB.12.0,而是Microsoft.ACE.OLEDB.16.0了。
後來發現,安裝了 office 2016版本的AccessDatabaseEngine_x64.exe後,服務器上會同時存在兩個oledb的驅動提供程序:
Microsoft.ACE.OLEDB.12.0和Microsoft.ACE.OLEDB.16.0。
如下截圖:
(安裝了Microsoft Access database engine 2016 x64)
(服務器上的oledb的驅動提供程序)
也就是說,安裝了office 2016版本的 MADE 後,“Microsoft.ACE.OLEDB.12.0”提供程序仍然是可以使用的。
繼續查找原因,發現在舊服務器windows 2008上,該 asp 程序使用的應用程序池裏“啓用32位應用程序”的值是“True”,而且在舊服務器windows 2008上安裝的 office 2007版本的 MADE 是x86的。
在新服務器Windows 2016上安裝的office 2016版本的 MADE 是64位的,而應用程序池裏“啓用32位應用程序”的值仍然被設置爲“True”。所以就導致程序一直報錯:“未找到提供程序”。
修正方式:
將應用程序池的“啓用32位應用程序”的值設置爲“False”。
下面是在服務器上檢查安裝了哪些oledb 驅動的提供程序的方法:
1. 在桌面上建立一個空白的文本文件;
2.修改該文件的文件名爲 1.udl;
3.鼠標雙擊1.udl;
在彈出來的界面上可以看到“提供程序”。點擊“提供程序”可以看到oledb驅動的提供程序的列表。
設置完成後,使用記事本打開1.udl,可以看到數據庫連接的代碼。
以下爲使用office 2016的oledb 驅動提供程序讀取 excel 數據的數據庫連接字符串:
[oledb]
; Everything after this line is an OLE DB initstring
Provider=Microsoft.ACE.OLEDB.16.0;Data Source=C:\C\inetpub\wwwroot\asp\1.xlsx;Extended Properties="Excel 12.0;HDR=Yes";Persist Security Info=False