我有一个生产站点,多年来一直使用名为 MDWDATA 的服务器上的 SQL Server 2000 默认实例。TCP 端口 1433 和命名管道在那里启用。我的目标是让这个 Web 应用程序使用升级到 SQL Server 2008 的数据库副本。我在名为 DEVMOJITO 的服务器上安装了带有 SP1 的 SQL2008,并使用各种 VB6 桌面程序测试了新数据库,这些程序在一个客户端-服务器方式和网站本身的某些部分可以与驻留在此 SQL2008 命名实例上的升级数据库正常工作。因此,虽然我很高兴数据库升级看起来不错,但该网站的一部分因此命名管道提供程序而失败:无法打开与 SQL Server 的连接 [1231]。我认为这个错误具有误导性。我在生产站点使用的 SQL2000 实例上禁用了命名管道,重新启动 SQL,所有 ASP 代码仍然可以正常工作(另外,我们在数据库服务器和面向公众的 Web 服务器上的这些 Web 虚拟目录之间有防火墙。
prod 和 dev 站点上的所有代码都是相同的,除了在 dev 上我试图连接到升级的数据库。
我知道有很多东西要检查我一直在寻找的东西,但我可以提供一些东西来帮助你:
失败的代码是几年前改编自 Brent Ashley 的“Javascript Remote Scripting (JSRS)”代码包的服务器端 Javascript。它以类似 AJAX 的方式运行,将请求发送回不同的 ASP 页面,然后处理回调。我认为这里要指出的关键是我如何更改与数据库的连接:(我无法在此处设置 Javascript 格式!)
函数 setDBConnect(datasource) { var strConnect; //ADO 连接字符串 //strConnect = "DRIVER=SQL Server;SERVER=MDWDATA;UID=uname;PASSWORD=x;DATABASE=StagingMDS;";
strConnect = "提供者=SQLNCLI10;服务器=DEVMOJITO\MSSQLSERVER2008;Uid=uname;密码=x;数据库=StagingMDS;"; 返回连接;}函数 serializeSql( sql , 数据源) { var conn = new ActiveXObject("ADODB.Connection"); var ConnectString = setDBConnect(数据源); conn.打开(连接字符串);var rs = conn.Execute(sql);
请注意连接字符串有何不同。我认为这可能是问题所在,但我不知道该怎么做。我很惊讶返回的错误说涉及“命名管道”,因为我真的想使用 TCP。此处的连接字符串语法与在使用 VBScript 的站点的不同部分成功使用的相同,我将在此处粘贴以显示:
if DataBaseConnectionsAreNeeded(strScriptName) then
dim strWebDB
Set objConn = Server.CreateObject("ADODB.Connection")
if IsProductionWeb() Then
strWebDB = "DATABASE=MDS;SERVER=MDWDATA;DRIVER=SQL Server;UID=uname;PASSWORD=x;"
end if
if IsDevelopmentWeb() Then
strWebDB = "Provider=SQLNCLI10;Server=DEVMOJITO\MSSQLSERVER2008;Database=StagingMDS;UID=uname;PASSWORD=x;"
end if
objConn.ConnectionString = strWebDB
objConn.ConnectionTimeout = 30
objConn.Open
set oCmd = Server.CreateObject("ADODB.Command")
oCmd.ActiveConnection = objConn
此代码适用于 prod 和 dev 虚拟目录以及使用 ASP.NET 的 Web 其他部分中的其他代码正确地对这两个数据库工作。每个服务器上都启用了命名管道和 TCP。我不明白 Pipes 使用的字符串,但我始终使用默认值。
我想知道为什么上面的 Javascript 调用导致使用命名管道而不是 TCP。任何想法将不胜感激。