一般來說,和數(shù)據(jù)庫(kù)連接通常不容易斷鏈,但是特別做些服務(wù)性質(zhì)的,無人監(jiān)守的程序時(shí),則要考慮數(shù)據(jù)庫(kù)連接的ado發(fā)生斷鏈時(shí)的情況。在這種情況下,考慮建立數(shù)據(jù)庫(kù)鏈路檢測(cè)異常保護(hù)就是非常重要的。
通常,與數(shù)據(jù)庫(kù)連接中斷有以下2種情況:
1。數(shù)據(jù)庫(kù)服務(wù)器服務(wù)停止,
2。與數(shù)據(jù)庫(kù)服務(wù)器之間的網(wǎng)絡(luò)發(fā)生中斷
采用如下代碼在使用做pRs做open查詢操作時(shí),拋出異常,此異??膳袛酁榈綌?shù)據(jù)庫(kù)服務(wù)器的連接發(fā)生中斷
Error number: 80004005
[DBNETLIB][ConnectionWrite (WrapperWrite()).]一般性網(wǎng)絡(luò)錯(cuò)誤。請(qǐng)檢查網(wǎng)絡(luò)文檔。
SQLState : 08S0
NativeError : b
當(dāng)pConn在Close,重新Open連接會(huì)發(fā)生異常,此異常是重新連接時(shí)拋出的。此時(shí)可判斷為到遠(yuǎn)程服務(wù)器的連接完全中斷
Error number: 80004005
[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒絕訪問。
SQLState : 08001
NativeError : 11
檢測(cè)代碼基本如下,此代碼的部分參考自ADO手冊(cè),并加以部分的修改
for(;;)
{
try {
if (g_isConnected) {
pRs-> Open(_bstr_t(“select 1”), _variant_t((IDispatch*)pConn,true), adOpenStatic,
adLockReadOnly, adCmdText);
if (pRs)
if (pRs-> State == adStateOpen)
pRs-> Close();
} else {
if (pConn)
if (pConn->State == adStateOpen)
pConn->Close();
pConn->Open(_bstr_t(strCnn),_bstr_t(""),_bstr_t(""),adModeUnknown); //重新打開連接
isConnected=TRUE;
}
}
catch (_com_error &pCome)
{
_variant_t vtConnect = (_variant_t)(pConn.GetInterfacePtr());//pRs-> GetActiveConnection();
switch(vtConnect.vt)
{
case VT_BSTR:
PrintComError(pCome);
break;
case VT_DISPATCH:
PrintProviderError(vtConnect);
break;
default:
printf( "Errors occured. ");
break;
}
isConnected= FALSE;
}
Sleep(1000);
}
void PrintProviderError(_ConnectionPtr pConnection)
{
ErrorPtr pErr = NULL;
if( (pConnection-> Errors-> Count) > 0)
{
long nCount = pConnection-> Errors-> Count;
for(long i = 0; i < nCount; i++)
{
pErr = pConnection-> Errors-> GetItem(i);
TRACE( "Error number: %x\n%s\n ", pErr-> Number, (LPCSTR)pErr-> Description);
TRACE( "SQLState : %s\n ", (LPCTSTR)pErr-> SQLState);
TRACE( "NativeError : %x\n ", pErr-> NativeError);
}
}
}
void PrintComError(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
// Print Com errors.
TRACE( "Error\n ");
TRACE( "\tCode = %08lx\n ", e.Error());
TRACE( "\tCode meaning = %s\n ", e.ErrorMessage());
TRACE( "\tSource = %s\n ", (LPCSTR) bstrSource);
TRACE( "\tDescription = %s\n ", (LPCSTR) bstrDescription);
}
把它整理成到一個(gè)線程中不斷作為數(shù)據(jù)庫(kù)鏈路檢測(cè),發(fā)現(xiàn)該連接斷開則返回連接來處理。測(cè)試代碼附文。我用的sql server數(shù)據(jù)庫(kù)做測(cè)試過。源碼下載位置:
http://www.pudn.com/downloads95/sourcecode/database/detail389188.html