首页
社区
课程
招聘
ADO连接数据库,未解决的状态判断问题
发表于: 2010-9-2 14:08 6080

ADO连接数据库,未解决的状态判断问题

2010-9-2 14:08
6080
现在做一个主要运行在后台的程序,读取ifix上的实时报警信息,然后保存至关系数据库,数据库在别的机子上,现在的问题主要是:当数据库的连接突然断开(各种原因),我的程序中数据的存储在一个线程里进行,判断动态数组有数据就开始先判断当前连接状态,如果是连接的就开始执行,由于程序存储过程比较重要,所以在发生异常的时候要记录异常信息,并进行重连数据库。我查了好多帖子,对于数据库连接状态的判断,有好多说法,我先声明下,判断state的状态不行,getstate()不行,下面我贴出我的ado种的几个函数:(可能代码长了,看的人就没耐心了,我贴主要代码,恳请各位赐教)
BOOL CADO::InitADO(CString ip,CString db,CString user,CString password)//连接数据库
{
    if(!b)
    {
        b = AfxOleInit();
    }
    TCHAR tem[MAX_PATH] = {0};
    m_pConnection.CreateInstance("ADODB.Connection");

    _bstr_t strConnect=TEXT("Provider=SQLOLEDB;server=") + ip + TEXT(";Database=") +
        db + TEXT(";uid=") + user + 
        TEXT(";pwd=") + password + "";
    try                 
    {    
        m_pConnection->Open(strConnect,_T(""),_T(""),adModeUnknown);
    }
    catch(_com_error e)
    {
        //AfxMessageBox(e.Description());
        m_pConnection = NULL;
        return FALSE;
    }  
    isClosed = FALSE;
    return TRUE;
}

BOOL CADO::ExecuteSQL(_bstr_t bstrSQL)//执行sql
{
    if (m_pConnection==NULL)
    {
        return FALSE;
    }
    if(m_pConnection-> State   ==   adStateOpen)
    {
        try
        {
            m_pConnection->Execute(bstrSQL,NULL,adCmdText);            
        }
        catch(_com_error *e)
        {
            /*if (!lstrcmp(e->Description(),TEXT("连接失败 "))   ||   !lstrcmp(e->Description(),TEXT("连接关闭 ")))
            {
                isClosed = TRUE;
            }*/
            return FALSE;
        }
        return TRUE;
    }
    
}

BOOL CADO::IsConnect()//判断当前的连接状态
{
    try    
    {   
        //状态判断   
        if(m_pConnection==NULL)   
            return  false;   
        if(m_pConnection->GetState()==adStateClosed)   
            return  false;   
        m_pConnection->Execute(TEXT("select   getdate() "),NULL,adCmdText);
        return true;   
    }   
    catch(_com_error* e)   
    {   
        if (!lstrcmp(e->Description(),TEXT("连接失败 "))   ||   !lstrcmp(e->Description(),TEXT("连接关闭 ")))
        {
            isClosed = TRUE;
        }
    }   
    
    return false;   
    
}


我发现我的判断连接状态的函数不起作用,每次调试都崩溃,根本捕获不到异常,大家帮忙。谢谢了。这个问题困扰我两天了。
我的qq:529912640
邮箱:tornodo@vip.qq.com
MSN:tornodo@live.cn

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
而且如下的方法也判断不了连接状态

        if(m_pConnection==NULL)   
            return  false;   
        if(m_pConnection->GetState()==adStateClosed)   
            return  false;   
        
        //参数判断   
        long    lErrorCount = m_pConnection->Errors->Count;   
        if(lErrorCount>0L)   
        {   
            ErrorPtr    pError   = NULL;   
            for(long i=0; i<lErrorCount; i++)   
            {   
                pError  = m_pConnection->Errors->GetItem(i);   
                if(pError->Number==0x80004005)   
                    return  false;   
            }   
        }   
        
        return true;   
    }   
    catch(_com_error* e)   
    {
2010-9-2 14:10
0
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
已经解决,去掉e前面的*就行了
2010-9-2 17:16
0
游客
登录 | 注册 方可回帖
返回
//