小弟初学ADO,在对数据库操作的时候捕捉错误,但怎么判断这个错误是什么原因造成的呢?比如是重复健还是数据库断开?怎么知道在哪种情况下需要重连数据库呢?

解决方案 »

  1.   

    问的好,try ... catch(_com_error e)
    如果有异常,那么
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    TRACE("Error\n");
    TRACE("Code = %08lx\n", e.Error());
    TRACE("Code meaning = %s\n", e.ErrorMessage());
    TRACE("Source = %s\n", (LPCSTR) bstrSource);
    TRACE("Description = %s\n", (LPCSTR) bstrDescription);
    就可以看到错误原因了。
      

  2.   

    try{...}
    catch(...)
    {
    CString message;
    DWORD  ErrorCode = GetLastError()  ;  
    char  buff[128];  
    ::FormatMessage  (FORMAT_MESSAGE_FROM_SYSTEM,(void*)FORMAT_MESSAGE_FROM_STRING,ErrorCode,0,buff,128,0);  
    message.Format("执行文件:%s错误,发生在:%d 行,错误描述为:%s",__FILE__,__LINE__,buff);
    MessageBox((LPCTSTR)message,"Error",MB_ICONERROR | MB_OK);
    }
      

  3.   

    捕获到了错误,但是具体哪些错误需要重连呢?我只知道拔网线和关数据库,其他还有什么情况呢?
    e.Error()等于什么时重连?呜呜~~
      

  4.   

    回复人: fool_leave() ( ) 信誉:100  2005-01-27 20:39:00  得分: 0  
     
     
       捕获到了错误,但是具体哪些错误需要重连呢?我只知道拔网线和关数据库,其他还有什么情况呢?
    e.Error()等于什么时重连?呜呜~~
      
     
    这个也正是我头疼的问题。我把数据库关了,得到的错误是数据库未定义的错误号,我也不知道如何检查数据库已经断了。关于这个问题,我发过帖子,也未能得到答案。
    关注中
      

  5.   

    使用下面的语句,绝对好用!
    catch
    {
    AfxMessageBox(e.Description());
    }
      

  6.   

    在catch()后通过执行一条永远正确的sql语句select getdate() as date再判断是否是错,如果出错则证明需要重新连接数据库.
    _ConnectionPtr中有个error集合,可以通过error的GetDescription获取错误信息.
      

  7.   

    ZHENG017说的也有道理。各位一般是怎么判断的?
      

  8.   

    try
    {}
    catch(_com_error e)
    {
    e.discription;
    }
      

  9.   

    我是通过调用存储过程,然后返回文件,如果返回文件是ORACLE的一些错,或者是我程式连接的报错就会通过语句重连,当然执行SQL是一样的办法!不知道对你有没有帮助哦!如:
    ReExecute:
    if (mtCallProc.Lock() == 0) 
    {
    delete[]pFileInfo;
    CDB::LogEvents(sAppName,EVENTLOG_ERROR_TYPE,"\nCan not lock proc!");
    return -1;
    }
    sErr = db->CallProcedure(proc,&rs);
    //connect halt
    if (sErr!="OK")
    {
    CDB::LogEvents(sAppName,EVENTLOG_ERROR_TYPE,"\n"+sErr);

    if ((sErr.Find("ORA-12571") != -1) || (sErr.Find("ORA-03114") != -1) || (sErr.Find("DB Connection Is Invalid") != -1))
    {
    ReConnect:
    strcpy(cTem,"");
    if (db->ConnectDB(cTem,sizeof(cTem))<0)
    {
    iReConnectTimes++;
    if (iReConnectTimes < 4)
    {
    goto ReConnect;
    }
    }
    else
    {
    mtCallProc.Unlock();
    goto ReExecute;
    }
    }
    }
    mtCallProc.Unlock();