从Win2k3迁移到Win2012 R2后,会话变量中的数据库连接失败

时间:2015-08-10 12:25:20

标签: vbscript asp-classic odbc iis-6 iis-8.5

我目前在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中是否存在阻止您在会话变量中存储打开的数据库连接的内容?我知道它效率不高,但此时重写将是一项艰巨的任务。

1 个答案:

答案 0 :(得分:3)

看起来,在新服务器上,您没有重新创建连接字符串中指定的DSN(Data Source Name):

DSN=sqldb

如果您的应用程序在64位Windows上的32位工作进程/应用程序池中运行,则使用以下命令重新创建它:

C:\Windows\SysWOW64\odbcad32.exe

否则使用:

重新创建
C:\Windows\system32\odbcad32.exe

这篇知识库文章在64位系统上使用DSN时也非常有用:

  

https://support.microsoft.com/en-us/kb/942976