在做一个把 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