一般来说,和数据库连接通常不容易断链,但是特别做些服务性质的,无人监守的程序时,则要考虑数据库连接的ado发生断链时的情况。在这种情况下,考虑建立数据库链路检测异常保护就是非常重要的。
通常,与数据库连接中断有以下2种情况:
1。数据库服务器服务停止,
2。与数据库服务器之间的网络发生中断
采用如下代码在使用做pRs做open查询操作时,抛出异常,此异常可判断为到数据库服务器的连接发生中断
Error number: 80004005
[DBNETLIB][ConnectionWrite (WrapperWrite()).]一般性网络错误。请检查网络文档。
SQLState : 08S0
NativeError : b
当pConn在Close,重新Open连接会发生异常,此异常是重新连接时抛出的。此时可判断为到远程服务器的连接完全中断
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);
}
把它整理成到一个线程中不断作为数据库链路检测,发现该连接断开则返回连接来处理。测试代码附文。我用的sql server数据库做测试过。源码下载位置:
http://www.pudn.com/downloads95/sourcecode/database/detail389188.html