采用的方式是用定时器不断查询数据库连接状态,
void CSqlDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==TIMER_SQL) { //检查SQL m_bSql=CMakeSureSql::Check(g_Connection); //这里的全局的CAdoConnection* if(!m_bSql) { CMakeSureSql::RetSet(g_Connection,g_strDataPath); //重新设置数据库连接
//用新的pConn去给旧的pConn赋值,这步很关键,如果出现重现连接数据库后,打开数据集发生错误,找错时候,应先检查旧的
//pConn是否已经无效,新旧的pConn的地址不同,则说明旧的连接已经失效
} } CDialog::OnTimer(nIDEvent); }
这里的Check函数是
BOOL CMakeSureSql::Check(CAdoConnection*& pConn) { NULL_RETURNFALSE(pConn); //这个是宏定义,自己写的, BOOL bRet=FALSE; CAdoRecordSet * pDataSet; try{ if (pConn != NULL) { pDataSet = new CAdoRecordSet; pDataSet->SetAdoConnection(pConn); } if (pDataSet->IsOpen()) { pDataSet->Close(); } CString strSQL="select getdate()"; bRet=pDataSet->OpenRecordSet(strSQL)!=ADORES_FAILED; //通过这个来测试数据库连接是否断掉 } catch(...) { //DT("CMakeSureSql 测试数据连接的时候发生异常!"); bRet=FALSE; } SAFE_DELETE(pDataSet); return bRet; }
BOOL CMakeSureSql::RetSet(CAdoConnection*& pConn,CString& strConn) { if(pConn!=NULL) { pConn->Disconnect(); SAFE_DELETE(pConn); } pConn = new CAdoConnection; NULL_RETURNFALSE(pConn); BOOL bRes = pConn->Connect(strConn); // g_DataCenter.ReInit(pConn);
if(bRes==FALSE) { SAFE_DELETE(pConn); return FALSE; } return TRUE; }
这些是程序片段,缺乏相应代码的前提下,并不能运行,用来启发思路用的,
时间: 2024-10-26 15:50:10