程式里需要定時判斷sqlserver的連接性,我在網上找了段代碼,還是比較好用的,但是在有的機器上有問題,代碼如下:
...
connection myconnect
myconnect = create connection
myconnect.driver = "WinSock"
myconnect.application = "1433"
myconnect.location = vs_servername
li_return = myconnect.ConnectToServer()
...
通常是可以回傳0的,但有時回傳55,不知什么原因。謝謝
uj5u.com熱心網友回復:
也可用一最簡單sql來測驗啊!uj5u.com熱心網友回復:
本機一般沒問題.uj5u.com熱心網友回復:
1.不是連本機,連服務器2.直接用sql測會等待漫長的timeout,無法忍受
uj5u.com熱心網友回復:
第5行代碼 =后面 加引號 看看
uj5u.com熱心網友回復:
看看...uj5u.com熱心網友回復:
第5行代碼 =后面 加引號?后面那個vs_servername是變數,值肯定沒問題,我直接用ip地址也不行。在另外幾臺機器上是很正常,應該是環境引起的。完整代碼如下:
integer li_return
string ls_rtn
/******* 查找網路中是否存在輸入名稱的服務器 **********/
connection myconnect
myconnect = create connection
myconnect.driver = "WinSock"
myconnect.application = "1433"
myconnect.location =vs_servername
li_return=myconnect.ConnectToServer()
if li_return=52 then
ls_rtn = "網路中沒有您輸入的主機名,請確認后重新輸入!"
return ls_rtn
end if
/*****************END*****************/
/********************************************************
判斷SQL Server是否已經啟動,如果沒有啟動則做相應處理
********************************************************/
OLEObject PBObject,PBDATEBASE
long ll_status
PBObject = CREATE OLEObject
ll_status = PBObject.ConnectToNewObject ("SQLDMO.sqlserver")
IF ll_status=0 THEN //連接成功
pbobject.name=vs_servername
pbobject.logintimeout=5
// pbobject.LoginSecure = True //以NT方式連接
pbobject.LoginSecure = false //以SQL Server方式連接
li_return=PBOBJECT.Status
if li_return=2 then //SQL Server為暫停狀態
if vb_autostart then
PBOBJECT.Continue()
else
ls_rtn = '資料庫服務已暫停'
return ls_rtn
end if
elseif li_return=3 then //SQL Server為停止狀態
if vb_autostart then
PBOBJECT.Start(false,vs_servername,vs_username,vs_password)//啟動SQL Server
else
ls_rtn = '資料庫服務已停止'
return ls_rtn
end if
end if
ELSE
ls_rtn = "資料庫連接失敗!~n請檢查輸入的用戶名和口令是否正確"
return ls_rtn
end if
/*************** END *****************/
/*******************************************
由于啟動SQL Server需要點時間,所以等待sqlserver啟動
*******************************************/
LI:
li_return=PBOBJECT.Status
IF li_return<>1 THEN //不為1(不是runing狀態)
GOTO LI
ELSE //為1,連接資料庫
// PBOBJECT.CONNECT(ls_servername,ls_username,ls_password)
DESTROY PBObject//摧毀事物物件
return ''
END IF
/*********** END ***********/
不知道和SQLDMO.dll有沒有關系,我注冊過好幾次了也沒用
uj5u.com熱心網友回復:
有時候 回傳 0 有時候回傳 55 55是請求被意外的終止 不妨從別的角度找找原因uj5u.com熱心網友回復:
不是有時候,是在一臺server上100%回傳55,另外一臺server上正常,兩個機器一起裝的,好像沒啥區別呀uj5u.com熱心網友回復:
這個問題自己也需要uj5u.com熱心網友回復:
telnet能連上嗎?uj5u.com熱心網友回復:
telnet能連上前面的無所謂,關鍵是這句li_return=PBOBJECT.Status 報錯
uj5u.com熱心網友回復:
呵呵,, PBObject.ConnectToNewObject ("SQLDMO.sqlserver")是 sqlserver的一個內置物件,需要安裝SQLSERVER后才能呼叫的,所以如果你在沒有安裝SQLSERVER的機器上就會連接SQLDMO物件不成功,你要判斷一下它的回傳值的,方法我已經寫到你的另一個貼子里了,你去看看吧,
uj5u.com熱心網友回復:
防火墻之類也會影響后面的陳述句,如果是使用的機器名的話NETBIOS協議也會有影響pbobject.name=vs_servername有可能失敗
有一個測驗的辦法,你通過在程式運行失敗的機器上使用它的服務管理器,在服務器串列里面選擇你的那臺資料庫服務器,看看狀態能否讀取到;
對于connecttonewobject參考函式的呼叫,建議都加上 try..catch陳述句
uj5u.com熱心網友回復:
謝謝,但是我的機器上是裝有sqlserver的,而且sqldmo也注冊了,我用try...catch沒用,到li_return=PBOBJECT.Status 這句依然報錯。另外:我在pb的物件瀏覽器里找可編程物件找不到sqldmo呀,怎么回事?
我后來改用API取服務狀態,在xp上能正確取出,但在2003server上取不出來,具體可看我另一個貼。
再次謝謝大家!
uj5u.com熱心網友回復:
呵呵,第一次聽到說try catch沒用的~~uj5u.com熱心網友回復:
dinguj5u.com熱心網友回復:
學..........uj5u.com熱心網友回復:
學習一下,本人剛學轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/92213.html
標籤:數據庫相關
上一篇:為什么呼叫OLE或showhelp后,再呼叫rpcrt4.dll報錯。
下一篇:困擾已久 name not found calling external object function pause at line
