生产中的服务器端Javascript无法打开到SQL2008命名实例的连接

生产中的服务器端Javascript无法打开到SQL2008命名实例的连接,javascript,asp-classic,vbscript,named-pipes,adodb,Javascript,Asp Classic,Vbscript,Named Pipes,Adodb,我有一个生产站点,多年来一直在使用名为MDWDATA的服务器上的SQLServer2000默认实例。TCP端口1433和命名管道在此处启用。我的目标是让这个web应用程序与升级到SQL Server 2008的数据库副本一起工作。我已经在一个名为DEVMOJITO的服务器上安装了带有SP1的SQL2008,并使用各种VB6桌面程序测试了新数据库,这些程序以客户机-服务器的方式执行各种存储过程,网站本身的某些部分可以很好地对驻留在这个命名的SQL2008实例上的升级数据库进行测试。因此,虽然我很高

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

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

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

失败的代码是服务器端Javascript,它是多年前从Brent Ashley的Javascript远程脚本JSRS代码包改编而来的。它以类似AJAX的方式运行,将请求发回不同的ASP页面,然后处理回调。我想这里要指出的关键是我是如何更改与数据库的连接的:我无法在这里设置Javascript的格式

函数setDBConnectdatasource { var strConnect;//ADO连接字符串 //strConnect=DRIVER=sqlserver;Server=MDWDATA;UID=uname;PASSWORD=x;DATABASE=StagingMDS;; strConnect=Provider=SQLNCLI10;Server=DEVMOJITO\MSSQLSERVER2008;Uid=uname;Pwd=x;DATABASE=StagingMDS;; 返回strConnect; }

函数序列化sql,数据源 { var conn=新的ActiveXObjectADODB.Connection; var ConnectString=setDBConnectdatasource; 连接打开连接字符串; var rs=conn.执行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虚拟目录,以及web的其他部分中的其他代码,这些部分使用ASP.NET对这两个数据库进行正确操作。命名管道和TCP都在每台服务器上启用。我不理解管道使用的字符串,但我始终使用默认值


我想知道为什么上面的Javascript调用会导致使用命名管道而不是TCP。如果您有任何想法,我们将不胜感激。

总结一下我为实现此功能所做的工作:

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

Server=tcp:DEVMOJITO\mssqlserver20081219

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

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