MFC用ADO方式连接数据库,断线重连的问题,如何恢复数据库链接
采用的方式是用定时器不断查询数据库连接状态,
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;
}
这些是程序片段,缺乏相应代码的前提下,并不能运行,用来启发思路用的,
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步