我目前在IIS6上运行经典ASP网站,一切运作良好。 "包含" file用于打开数据库连接。然后将db连接存储在会话变量中。
这是我们的Include" dbinclude.asp"的片段。文件:
<%
Set CN_sql = Server.CreateObject("ADODB.Connection")
CN_sql.ConnectionString="DSN=sqldb;UID=testuid;PWD=testpwd;Server=testdb;Database=mydatabase"
CN_sql.Open
Session("Connection_sql") = CN_sql
%>
在经典的asp页面中,我们使用以下代码连接到数据库来提取数据:
<html>
<head>
<!--#include file="./dbinclude.asp"-->
</head>
</body>
<%
set ds = Server.CreateObject("ADODB.Recordset")
CN_sql = Session("Connection_sql")
ds.ActiveConnection = CN_sql
ds.CursorType = 0
SQL = "select * "
SQL = SQL & " from users "
ds.Source = SQL
ds.Open
IF ds.EOF then
response.write("SQL EOF. NO data found.<br/>")
ELSE
ds.MoveFirst
while not ds.EOF
response.write(ds.fields("user_name") & " <br/> ")
ds.MoveNext
wend
End If
%>
</body>
</html>
在IIS6中,此代码适用于所有页面。但是,在IIS8.5(Win2012R2,以及IIS7,Win7)中进行测试时,我收到以下错误消息:
Microsoft OLE DB Provider for ODBC Drivers error&#39; 80004005&#39; [Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序
错误指向的行号是此行:
ds.ActiveConnection = CN_sql
IIS 8.5中的应用程序池设置为.NET v2,允许32位应用程序,Classic Pipeline。我尝试过应用程序池的各种组合(更改为不同的.NET版本,允许/禁止32位应用程序,经典/集成管道,更改了身份,尝试了不同的会话状态)。
在IIS 8.5中,如果我在代码中注释掉以下行:
CN_sql = Session("Connection_sql")
它将解决问题。但是,由于我们有大量的网页,目前无法重写和测试。
Windows 2012中是否存在阻止您在会话变量中存储打开的数据库连接的内容?我知道它效率不高,但此时重写将是一项艰巨的任务。
答案 0 :(得分:3)
看起来,在新服务器上,您没有重新创建连接字符串中指定的DSN(Data Source Name):
DSN=sqldb
如果您的应用程序在64位Windows上的32位工作进程/应用程序池中运行,则使用以下命令重新创建它:
C:\Windows\SysWOW64\odbcad32.exe
否则使用:
重新创建C:\Windows\system32\odbcad32.exe
这篇知识库文章在64位系统上使用DSN时也非常有用: