首页 > 代码库 > MFC用ADO方式连接数据库,断线重连的问题,如何恢复数据库链接

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; 
}

这些是程序片段,缺乏相应代码的前提下,并不能运行,用来启发思路用的,

MFC用ADO方式连接数据库,断线重连的问题,如何恢复数据库链接