现在想做个用ADO访问数据库的东西,但是如果遇到网络故障(比如网线被拔),Connection对象失败的话,如何进行判断,又怎么进行重连呢!我现在只是简单做了几个模块,但是测试的时候我把数据库关了它还是提示可以连接成功的,比较郁闷,希望各位能给个解释。
//连接数据库
bool CDataBase::ConnectOpen()
{
HRESULT hr; //先关闭数据库连接
ConnectClose(); try
{
//打开数据库连接
hr=m_Connection->Open(m_strCnn,"","",NULL);
if(hr==S_OK)
{
printf("数据库打开成功\n");
//设置m_Command连接为当前打开连接
m_Command->ActiveConnection=m_Connection;
return true;
}
}
catch(_com_error &ComError)
{
//打印错误
PrintComError(ComError);
}
return false;
}
//错误重连
bool CDataBase::ReConnect()
{
//设置为重连5次
int ConnectCount=5; //开始重新连接
while(ConnectCount)
{
--ConnectCount;
printf("重连次数为%d次\n",ConnectCount);
m_Connection->Close();
if(ConnectOpen())
{
return true;
}
}
return false;
}
//获取错误
LPCSTR CDataBase::GetComError()
{
if(m_strError[0]==_T('\0'))
return "NULL";
return m_strError;
}//测试连接是否断开
bool CDataBase::TestConnect()
{
//Sleep(30000);
//printf("程序继续\n");
HRESULT hr;
_ConnectionPtr Conn;
try
{
Conn.CreateInstance(__uuidof(Connection));
Conn->ConnectionTimeout=5;
hr=Conn->Open(m_strCnn,"","",NULL);
return true;
}
catch(_com_error &Error)
{
Conn.Release();
if(S_OK==hr)
return true;
else
return ReConnect();
}
}

解决方案 »

  1.   

    我也有相同的情况,我处理方法如下:
    一,启用多线程,然后用调用PING IP地址命令,这样测试主机是否通,
    如果通者Messagebox("databaseok");
    二,自已写一个服务端,相当于网关!当客户端启动先socket一下服务端,用服务端判断一下数据是否正常!好象这两种方法,都不是有效的方法!!
      

  2.   

    在Timer中定时ping数据库服务器,就能得知链接状态了,然后就可以设置重连将连接变量作为全局的
      

  3.   

    ping的代码,参考 这里
      

  4.   

    m_Connection->Close();
    后面再释放m_Connection.Release();
      

  5.   

    晕!我释那还叫重连吗???那不就等于又一个新的连接了吗?还有就是我释放对象的话,我的Command对象和Recordset对象不受影响吗???
      

  6.   

    不好意思,您在ConnectOpen函数里,open后,用
    if(m_Connection->State==1 )
    代替
    if(hr==S_OK)
      

  7.   

    唉!这个样子只检测对象状态是检测不出问题的,像网络故障这些问题,在State里面是显示不出来的如果当前的State状态是OPEN的话,你把网线拔掉,这个状态是不会有变化的
      

  8.   

    只有各种sql操作等都有try catch等来捕获异常,当任何时候发生错误时,就可以检测一下网络等来判断.
      

  9.   

    在SQL内部做处理吗???SQL语句不是太懂的判断完后怎么个处理办法呢!
      

  10.   

    你执行sql语句的地方,Execute()等