天天看點

OLE DB 通路接口 "SQLNCLI" 傳回了消息 "未指定的錯誤"。

這個月總公司收購了一家小公司,這家小公司的資料庫用的是32位的 Sql2000 ,已經使用很長一段時間了,系統也比較穩定。本着節約成本的原則,總公司保留原公司的一套管理系統,但要求重要資料每天上傳到總公司的64位 Sql2005 資料庫中去,這個簡單的工作自然是交給我高升這樣的小人物去完成了。

原想這是個很簡單的差事,可是當我建好 LinkServer 以後卻報出了如下錯誤,從此我的噩夢開始了:

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "Unspecified error".

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator.".

消息 7311,級别 16,狀态 2,第 1 行

Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI" for linked server "TEST_GAO". The provider supports the interface, but returns a failure code when it is used.

error 7311 : 安裝在服務 器"TEST_GAO" 的版本需要打更新嗎?一查對方的伺服器還是 sp3 的版本,于是下載下傳了一個 sp4 的更新檔,可是安裝以後問題依舊。接着我又用自己的電腦上安裝的 Sql2005 和遠端的 Sql2000 建立了一個 LinkServer 測試了一下,結果很正常的就連上了,并且可以查詢出資料。這個問題可真是奇怪了,難道發生了什麼靈異事件?我自己的電腦和兩台伺服器都是安裝的 windows server 2003 sp2 的作業系統,為什麼同樣是Sql2005我自己的就能連上,而伺服器上的卻不能連呢?

原來是因為32位的 Sql2000 更新到sp3或者sp4以後還需要手工執行更新檔包内的 Instcat.sql 腳本才能連接配接上64位的 Sql2005 ,執行 cmd 進入指令行模式,輸入如下語句,完成安裝,這下 LinkServer 能夠正常連接配接。

輸入 : osql -U gaosheng -P sheng -S 127.0.0.1 -i C:"sql2ksp4"install"instcat.sql

-U:Sql2000的登陸名,要是具備管理權限的,最好是使用sa使用者

-P:密碼

-S:伺服器名或IP位址

-i:腳本所在的路徑及名稱,注意大小寫。

參考MSDN : http://support.microsoft.com/kb/906954/zh-tw 

LinkServer 建好以後下一步就是查資料寫資料了,Sql語句寫起來是很簡單,可是開啟事務後又出現問題了:

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "The partner transaction manager has disabled its support for remote/network transactions.".

消息 7391,級别 16,狀态 2,第 1 行

The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "TEST_GAO" was unable to begin a distributed transaction.

error 7391 : 這很顯然由于開啟了事 務,需要分布式事務協調器的支援。打開控制台 - 管理工具 - 服務,将兩台伺服器上的 Distributed Transaction Coordinator (MSDTC) 服務開啟,注意 MSDTC 服務的登陸名必須選擇 NETWORK SERVICE 使用者。然後設定進階選項,運作 dcomcnfg.exe ,進入元件服務,選擇我的電腦右鍵屬性,MSDTC - 安全配置,勾選:網絡DTC通路,允許入站,允許出站,并且不要求進行驗證。其他的可以根據需要選擇,不是必須選項。

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "No transaction is active.".

消息 7391,級别 16,狀态 2,第 1 行

The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "TEST_GAO" was unable to begin a distributed transaction.

error 7391 : 怎麼還是這個錯誤,沒有活動事務,無法啟動分布式事務?進階配置也做過了,并且已經不要求進行驗證了,難道這樣還是不行?那就麻煩了,兩台伺服器并不在同一個域中,這樣怎麼讓他互相信任呢,那就需要配置hosts檔案了。

C:"WINDOWS"system32"drivers"etc"hosts ,在系統目錄下找到這個隐藏的hosts系統檔案,在檔案的末尾加上對方的IP位址和主機名,如果伺服器是叢集的還要加上cluster的位址和虛拟IP位址,如:

136.16.25.79    GAOSHENG_Cluster

136.16.25.40    GAOSHENG_V1

136.16.25.80    GAOSHENG_DB1

第一個是Cluster主機的IP和主機名,第二個是虛拟的IP和主機名,第三個才是真實位址,加上前兩個位址是為了保證伺服器當機以 後,Cluster做了故障轉移LinkServer還能正常使用。如果不是叢集伺服器隻需要第三個真實位址就行了,這樣雙方就能互相信任,正常使用分布 式事務了。注意這個hosts檔案兩邊都要配置的,配置的是對方的IP位址和檔案名。

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "Cannot start more transactions on this session.".

消息 7395,級别 16,狀态 2,第 1 行

Unable to start a nested transaction for OLE DB provider "SQLNCLI" for linked server "TEST_GAO". A nested transaction was required because the XACT_ABORT option was set to OFF.

還來!怎麼還是有錯誤啊?

error 7395 : 還好直接告訴我怎麼做了,在 Begin Transaction 前加上 SET XACT_ABORT ON 即可。

現在總算是不抱錯了,查詢修改也沒問題了,問題終于解決了。建一個簡單的 LinkServer 居然就出現了這麼多的問題,一方面是我學藝不精,另一方面反映出來的是平時都是單伺服器的操作,很多問題根本就是遇不到的,光有理論是遠遠不夠的。不過最 後能夠解決問題也反映出我解決問題的能力還是有的,搞不懂就問人,搞得懂就答人,沒有人懂還可以問神。( MSDN 和 CSDN )