0

MDWDATA という名前のサーバーで SQL Server 2000 の既定のインスタンスを何年も使用している運用サイトがあります。そこでは、TCP ポート 1433 と名前付きパイプが有効になっています。私の目標は、この Web アプリを SQL Server 2008 にアップグレードしたデータベースのコピーで動作させることです。DEVMOJITO というサーバーに SQL2008 SP1 をインストールし、さまざまなストアド プロシージャを実行するさまざまな VB6 デスクトップ プログラムを使用して新しいデータベースをテストしました。クライアント サーバー方式と Web サイト自体の一部は、この SQL2008 の名前付きインスタンスに存在するアップグレードされたデータベースに対して正常に機能します。したがって、データベースのアップグレードに問題がないように思われることには満足していますが、この名前付きパイプ プロバイダーで失敗するこの Web サイトの一部があります: SQL Server への接続を開くことができませんでした [1231]。このエラーは誤解を招くと思います。本番サイトで使用されている SQL2000 インスタンスで名前付きパイプを無効にし、SQL を再起動しましたが、すべての ASP コードは正常に動作し続けました (さらに、両方のデータベース サーバーと公開 Web サーバー上のこれらの Web 仮想ディレクトリの間にファイアウォールがあります。

作業ページのデモを行う実稼働仮想ディレクトリへの URL:

失敗したページのデモを行う私の開発 v-directory への URL:

すべてのコードは、開発サイトでアップグレードされたデータベースに接続しようとしていることを除いて、製品サイトと開発サイトの両方で同じです。

探し求めていたチェック項目が数多くあることは承知していますが、以下にいくつかご紹介します。

  1. 失敗しているコードは、何年も前に Brent Ashley の「Javascript Remote Scripting (JSRS)」コード パッケージから採用されたサーバー側 Javascript です。これは、要求を別の ASP ページに送り返し、コールバックを処理することにより、AJAX に似た方法で動作します。ここで指摘すべき重要なことは、データベースへの接続をどのように変更したかということだと思います: (Javascript をここでフォーマットすることはできません!)

    function setDBConnect(datasource) { var strConnect; //ADO 接続文字列 //strConnect = "DRIVER=SQL Server;SERVER=MDWDATA;UID=uname;PASSWORD=x; DATABASE=StagingMDS;";
    strConnect = "Provider=SQLNCLI10;Server=DEVMOJITO\MSSQLSERVER2008;Uid=uname;Pwd=x;DATABASE=StagingMDS;"; strConnect を返します。}

    function serializeSql( sql , datasource) { var conn = new ActiveXObject("ADODB.Connection"); var ConnectString = setDBConnect(データソース); conn.Open( ConnectString ); 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 の両方が各サーバーで有効になっています。パイプで使用される文字列がわかりませんが、常にデフォルトを使用しています。

上記の 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 に答える