我怎样可以断定一个数据库连接已经断掉了?
  是通过返回的结果还是有其他标准可以判断?加入代码如下:
  Connection * conn = CreateInstance(OLESTR("ADODB.Connection"));
  Command * command = CreateInstance(OLESTR("ADODB.Command"));
  command->put_ActiveConnection(conn);
  command->put_CommandText("select * from lead");
  command->put_CommandType(ctText);
  /*  此时数据库断开了 */
  HRESULT hr = command->Execute(); 
  
  那我可以根据hr 的值来准确的断定是数据库连接出现了问题吗?
  如果可以,那hr所表示的值是多少
  如果这样不行,那还有其他的办法嘛?
  
 

解决方案 »

  1.   

    你这是用的OLEDB吗?ADO这么用也太麻烦了吧!为什么不用如下方式:
    _ConnectionPtr m_pConnection;
    m_pConnection.CreateInstance(__uuidof(Connection));
    m_pConnection->Open((LPCSTR)strConn,(LPCSTR)strLoginUserName,(LPCSTR)strLoginPw,NULL);
    再说你的代码中也没有体现出连接数据库的代码,只是创建了一个ADODB的对象而已。这个时候怎么判断数据库有没有连接,再说ADO对象中有一个错误管理的对象,如果发生错误,比如数据库没有连接,那么就会在那个错误管理对象中检测到。
      

  2.   

    如果想知道具体怎么操作的话,可以到Msdn中查Connection等对象
      

  3.   

    我刚才是少写了连接的操作,我是把ADO进行了一下封装,没有直接使用_ConnectionPtr,如果假设已经作了连接,那我能根据返回的hr得出数据库连接失败的结论马? 我察看了msdn,没有找到!你说的错误管理对象是不是指Error对象,好像也不能得到巴?帮帮忙,写湘西点
      

  4.   

    给你个样版:
    HRESULT hr;
    _bstr_t bt;
    BOOL m_bConnected=FALSE;
    bt=(_bstr_t)"Provider=SQLOLEDB.1;Persist Security Info=False;User ID="+(_bstr_t)m_UserName+(_bstr_t)";Password="+(_bstr_t)m_UserPassword+(_bstr_t)";Initial Catalog=SQL"+(_bstr_t)";Data Source="+(_bstr_t)m_ServerName;
    //+(_bstr_t)m_server;
    CoInitialize(NULL);  //Initialize COM 
    try
    {
    hr=m_pCon.CreateInstance(__uuidof(Connection));
    ASSERT(SUCCEEDED(hr));
    hr=m_pCon->Open (bt,_bstr_t(""),_bstr_t(""),adModeUnknown);
            ASSERT(SUCCEEDED(hr));
    //AfxMessageBox("数据库连接成功!");
        m_bConnected=TRUE;
    }
    catch ( _com_error )
    {
    AfxMessageBox("数据库连接失败,请与系统管理员联系!");
    }
      

  5.   

    上面两位朋友,由于我的项目实时性要求高,所以我希望不再进行Open连接,只通过执行命令时的返回值或者其他什么东东来确定数据库连接出了问题,我能得到这样的判断标准马?
      

  6.   

    调试时,在Watch窗口中加入:
    @err,hr
      

  7.   

    象你上面的方法中也必须调用Open才能进行数据库的连接,只要在这个时候有错误发生,系统就会抛出异常,那么系统就会立即转到异常处理部分进行处理。而且ADO也支持这种方式,如果你想通过返回值HRRSULT来得到错误结果,那么这个返回值只是代表一种模糊定义的错误,通过这个错误你不知道是来的函数内部的错误(如没有初始化Com环境等),还是其他方面的错误。所以最好还是用异常捕获机制,如果你用过汇编的话,这种机制是很普遍的,也是实时性很高的方法
      

  8.   

    skybblue(天蓝) 
    能再写详细一点吗?
    需要捕捉的异常是ADO中Connection对象内的Error吗?
    我捕捉了,好像也不能确定是数据库连接出错!
    老大,帮帮忙!如果你的方法果真可以,我可以在加100分,如果不行,我也会给你50分的
      

  9.   

    我也弄了很久这个问题!没有找到确切的解决办法。数据库连接被动地被关闭时,检查状态时检查不出来的,当在此断开的连接上执行操作时会捕获一个错误在Error对象中,检查错误ID,我故意把数据库连接关闭,试了很多次,发现每次的错误ID都是相同的,于是我就检测到错误ID试这个ID时判断为数据库连接不关闭了。但这是在任何文档里都没有讲过的,实在没办法了,只能先这样凑合这用了。你也试试看是不是这样的?
      

  10.   

    假定你的数据库连接指针是m_pConnect,可以用下面的代码来判断是否处于连接状态。
    if(m_pConnect->State==adStateClosed)
        AfxMessageBox("数据库已经关闭");
    else
        AfxMessageBox("数据库处于连接状态");