现在想做个用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();
}
}
//连接数据库
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();
}
}
一,启用多线程,然后用调用PING IP地址命令,这样测试主机是否通,
如果通者Messagebox("databaseok");
二,自已写一个服务端,相当于网关!当客户端启动先socket一下服务端,用服务端判断一下数据是否正常!好象这两种方法,都不是有效的方法!!
后面再释放m_Connection.Release();
if(m_Connection->State==1 )
代替
if(hr==S_OK)