0

我有一个生产站点,多年来一直使用名为 MDWDATA 的服务器上的 SQL Server 2000 默认实例。TCP 端口 1433 和命名管道在那里启用。我的目标是让这个 Web 应用程序使用升级到 SQL Server 2008 的数据库副本。我在名为 DEVMOJITO 的服务器上安装了带有 SP1 的 SQL2008,并使用各种 VB6 桌面程序测试了新数据库,这些程序在一个客户端-服务器方式和网站本身的某些部分可以与驻留在此 SQL2008 命名实例上的升级数据库正常工作。因此,虽然我很高兴数据库升级看起来不错,但该网站的一部分因此命名管道提供程序而失败:无法打开与 SQL Server 的连接 [1231]。我认为这个错误具有误导性。我在生产站点使用的 SQL2000 实例上禁用了命名管道,重新启动 SQL,所有 ASP 代码仍然可以正常工作(另外,我们在数据库服务器和面向公众的 Web 服务器上的这些 Web 虚拟目录之间有防火墙。

演示工作页面的生产虚拟目录的 URL:

我的开发 v 目录的 URL,它演示了失败的页面:

prod 和 dev 站点上的所有代码都是相同的,除了在 dev 上我试图连接到升级的数据库。

我知道有很多东西要检查我一直在寻找的东西,但我可以提供一些东西来帮助你:

  1. 失败的代码是几年前改编自 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。任何想法将不胜感激。

4

1 回答 1

0

我为使其正常工作所做的工作总结:

  1. 由于这是服务器端 Javascript,因此在连接字符串中添加一个额外的斜杠:

    服务器=tcp:DEVMOJITO\MSSQLSERVER2008,1219;

  2. 显式编码 tcp: 作为协议前缀和端口 1219。我了解到,默认情况下,SQL 的命名实例使用动态端口。我最终关闭了它,并有点武断地选择了端口 1219,这是动态在我关闭它之前选择的。可能还有其他方法可以使这部分工作。

  3. 最后,我发现需要将 SET NOCOUNT ON 添加到被调用的存储过程中。否则,症状是消息:“对象关闭时不允许操作”。

于 2010-05-20T20:42:42.440 回答