ADO访问sql server 2000(sp4)如何判断连接断开?
我的步骤是连接数据库,然后起一个线程,每隔5秒从数据库select数据进行处理。但是我没法处理sql server断开的情况。因为我只要把sql服务一停,在线程里调用的_RecordsetPtr的open方法就崩溃了。
我试图用三种方法去处理:
1.给RecordsetPtr的open加上try catch捕获异常,经测试无效
2.在open之前首先判断连接状态,使用的_ConnectionPtr::GetState(),经过测试,即使断线也返回adStateOpen,不返回adStateClose
3.继承ConnectionEventsVt类,给ado添加事件响应,连接成功后raw_ConnectComplete()函数可以被调用,证明添加方法正确,但是断开sql服务后,raw_Disconnect()函数却不会被调用。在正常情况下,通过调用ConnectionPtr::close()关闭连接,raw_Disconnect()则会被调用。
难道说sql服务器异常断开就只能造成程序崩溃了吗?很是郁闷,请各位高手帮忙,谢谢。
[解决办法]
Connection->GetState()!= adStateClosed;
或者,尝试再次连接,根据返回值判断.
[解决办法]
// 捕捉异常 catch(_com_error e) { m_pRs->Close(); // 显示错误信息 AfxMessageBox(e.Description()); }
[解决办法]
操作之前去判断一下就可以了,
return m_pConnection->GetState() != adStateClosed;enum __declspec(uuid("00000532-0000-0010-8000-00aa006d2ea4"))ObjectStateEnum{ adStateClosed = 0, adStateOpen = 1, adStateConnecting = 2, adStateExecuting = 4, adStateFetching = 8};
[解决办法]
while(true)
{
try
{
conn->Open(connectionString, L"", L"", adModeUnknown);
while(true)
{
data = conn->Execute(query, NULL, adCmdText);
data->Close();
}
}
catch (_com_error e)
{
conn->Close();
}
}
我是这样处理的,可以达到效果。
[解决办法]
我教你怎么使用try{
if(!_connection->Stata){//连接无效}
}
catach(_com_err &e)
{
return;
}