一般來說,和數(shù)據(jù)庫連接通常不容易斷鏈,但是特別做些服務(wù)性質(zhì)的,無人監(jiān)守的程序時,則要考慮數(shù)據(jù)庫連接的ado發(fā)生斷鏈時的情況。在這種情況下,考慮建立數(shù)據(jù)庫鏈路檢測異常保護就是非常重要的。
通常,與數(shù)據(jù)庫連接中斷有以下2種情況:
1。數(shù)據(jù)庫服務(wù)器服務(wù)停止,
2。與數(shù)據(jù)庫服務(wù)器之間的網(wǎng)絡(luò)發(fā)生中斷
采用如下代碼在使用做pRs做open查詢操作時,拋出異常,此異常可判斷為到數(shù)據(jù)庫服務(wù)器的連接發(fā)生中斷
Error number: 80004005
[DBNETLIB][ConnectionWrite (WrapperWrite()).]一般性網(wǎng)絡(luò)錯誤。請檢查網(wǎng)絡(luò)文檔。
SQLState : 08S0
NativeError : b
當pConn在Close,重新Open連接會發(fā)生異常,此異常是重新連接時拋出的。此時可判斷為到遠程服務(wù)器的連接完全中斷
Error number: 80004005
[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒絕訪問。
SQLState : 08001
NativeError : 11
檢測代碼基本如下,此代碼的部分參考自ADO手冊,并加以部分的修改
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);
}
把它整理成到一個線程中不斷作為數(shù)據(jù)庫鏈路檢測,發(fā)現(xiàn)該連接斷開則返回連接來處理。測試代碼附文。我用的sql server數(shù)據(jù)庫做測試過。源碼下載位置:
http://www.pudn.com/downloads95/sourcecode/database/detail389188.html