none
請問如何指定使用 TCP/IP 連結遠端 MS SQL 資料庫 ? RRS feed

  • 問題

  •  

    我有兩台 Windows Server 2000 主機,A 主機為 Web 主機 (IIS 5.0),B 主機為 MS SQL 2000 資料庫主機。

     

    當我在 ASP 程式中以下列連結字串,由 A 連結 B 時可以成功連結
    ....
    cnstr = "Provider=SQLOLEDB;Persist Security Info=False;UID=xxxx;PWD=xxxx;Data Source=xxx.xxx.xxx.xxx;Initial Catalog=DDDDD;"
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open cnstr
    ......

     

    當我在 ASP 程式中改為下列連結字串(只加了 "Network=DBMSSOCN;",也就是指定用 TCP/IP 連結),
    由 A 連結 B 時則會發生錯誤
    ....
    cnstr = "Provider=SQLOLEDB;Persist Security Info=False;UID=xxxx;PWD=xxxx;Data Source=xxx.xxx.xxx.xxx;Initial Catalog=DDDDD;Network=DBMSSOCN;"
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open cnstr
    ......

     

    錯誤訊息為:
    Microsoft OLE DB Provider for SQL Server 錯誤 '80004005'
    [DBNETLIB][ConnectionOpen (Connect()).]一般網路錯誤。 查閱您的網路文件。
    /TCPIP_Test.asp, 列14

     

    然後我再把會發生錯誤連結字串的程式拷貝到另一 C Web 主機 (也是 Windows Server 2000),
    卻是執行無誤 !

     

    我又在 A 主機上做了以下的測試:

    1. ping -a <B 主機> : 測試 OK !

    2. telnet <B  主機> 1433 : 測試 OK !

    3. osql -Uxxxx -S<B 主機> : 測試 OK !

    4. 執行 VB6 測試程式(我寫了一只 VB6 程式,其中只是用 TCP 連結字串去 Open B 主機) : 測試 OK !

     


    請問各位大大這問題 A 主機如何解(A 主機的 system32 中存在 DBNETLIB.dll, DBMSSOCN.dll... 等檔案) ?

    2008年5月14日 上午 11:52

解答

  • 我發現了問題所在 !

    因為我有一只用 VB6.0 開發的 TCP/IP Socket ActiveX 元件在 A 主機 (Web Server)上,該 元件主要功能是與另一台 Unix 主機資料交換,只要該元件被存取過以後,再透過 TCP/IP 去連接 B 主機 (SQL Server),就會發生錯誤而失敗,之後只能以 Name Pipe 方式連接 SQL;所以我改用 VC++ 另外開發一只相同功能的 TCP/IP Socket ActiveX 元件,取代原 VB6.0 開發的元件,就不再發生 TCP/IP SQL 連接失敗 !

    • 已標示為解答 Snoopy Chen 2010年7月6日 上午 12:25
    2010年7月6日 上午 12:25

所有回覆

  • HI,

     

    可能是未建立資料來源名稱, 請參考:

     

    http://support.microsoft.com/kb/306345

     

    tihs

    2008年5月14日 下午 02:23
  • 我是使用 SQL Provider 而不是 ODBC DSN ...
    況且未加入 "Network=DBMSSOCN;" 時是可以連結的 !
    也就是說若由系統自動選擇是可以連結的,但若是指定 TCP/IP 連結則會失敗 !

    2008年5月14日 下午 11:29
  • 試試看 Network Library=dbmsscon

     

    但預設就是用 TCP/IP,沒有必要自行設定。

    2008年5月15日 上午 02:21
    版主
  • 我又做一些測試,歸納出下列結果:

     

    1. 使用 SQL OLE DB Provider 並指定 Name Piping
    cnstr = "Provider=SQLOLEDB;UID=xxxx;PWD=xxxx;Initial Catalog=DDDD;Data Source=xx.xx.xx.xx;Network=DBNMPNTW"
    可以成功連結無誤

     

    2. 使用 SQL OLE Db Provider 並指定 TCP/IP
    cnstr = "Provider=SQLOLEDB;UID=xxxx;PWD=xxxx;Initial Catalog=DDDD;Data Source=xx.xx.xx.xx;Network=DBMSSOCN"
    發生連結錯誤,錯誤訊息如下:
    Microsoft OLE DB Provider for SQL Server 錯誤 '80004005'
    [DBNETLIB][ConnectionOpen (Connect()).]一般網路錯誤。 查閱您的網路文件。
    /TCPIP_Test.asp, 列29

     

    3. 使用 ODBC DSN 並指定 TCP/IP
    cnstr = "DSN=AAAA;UID=xxxx;PWD=xxxx;"
    (註: 在建立 AAAA DSN 時,測試連結是成功的)
    發生連結錯誤,錯誤訊息如下:
    Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005'
    [Microsoft][ODBC SQL Server Driver][TCP/IP Sockets]一般網路錯誤。 查閱您的網路文件。
    /TCPIP_Test.asp, 列29

    2008年5月15日 下午 02:06
  • 我發現了問題所在 !

    因為我有一只用 VB6.0 開發的 TCP/IP Socket ActiveX 元件在 A 主機 (Web Server)上,該 元件主要功能是與另一台 Unix 主機資料交換,只要該元件被存取過以後,再透過 TCP/IP 去連接 B 主機 (SQL Server),就會發生錯誤而失敗,之後只能以 Name Pipe 方式連接 SQL;所以我改用 VC++ 另外開發一只相同功能的 TCP/IP Socket ActiveX 元件,取代原 VB6.0 開發的元件,就不再發生 TCP/IP SQL 連接失敗 !

    • 已標示為解答 Snoopy Chen 2010年7月6日 上午 12:25
    2010年7月6日 上午 12:25
  • 不可思議......你被這個問題卡了兩年?

    2010年7月6日 上午 01:21