-
-
ADO连接数据库,未解决的状态判断问题
-
发表于:
2010-9-2 14:08
6073
-
现在做一个主要运行在后台的程序,读取ifix上的实时报警信息,然后保存至关系数据库,数据库在别的机子上,现在的问题主要是:当数据库的连接突然断开(各种原因),我的程序中数据的存储在一个线程里进行,判断动态数组有数据就开始先判断当前连接状态,如果是连接的就开始执行,由于程序存储过程比较重要,所以在发生异常的时候要记录异常信息,并进行重连数据库。我查了好多帖子,对于数据库连接状态的判断,有好多说法,我先声明下,判断state的状态不行,getstate()不行,下面我贴出我的ado种的几个函数:(可能代码长了,看的人就没耐心了,我贴主要代码,恳请各位赐教)
BOOL CADO::InitADO(CString ip,CString db,CString user,CString password)//连接数据库
{
if(!b)
{
b = AfxOleInit();
}
TCHAR tem[MAX_PATH] = {0};
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t strConnect=TEXT("Provider=SQLOLEDB;server=") + ip + TEXT(";Database=") +
db + TEXT(";uid=") + user +
TEXT(";pwd=") + password + "";
try
{
m_pConnection->Open(strConnect,_T(""),_T(""),adModeUnknown);
}
catch(_com_error e)
{
//AfxMessageBox(e.Description());
m_pConnection = NULL;
return FALSE;
}
isClosed = FALSE;
return TRUE;
}
BOOL CADO::ExecuteSQL(_bstr_t bstrSQL)//执行sql
{
if (m_pConnection==NULL)
{
return FALSE;
}
if(m_pConnection-> State == adStateOpen)
{
try
{
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
}
catch(_com_error *e)
{
/*if (!lstrcmp(e->Description(),TEXT("连接失败 ")) || !lstrcmp(e->Description(),TEXT("连接关闭 ")))
{
isClosed = TRUE;
}*/
return FALSE;
}
return TRUE;
}
}
BOOL CADO::IsConnect()//判断当前的连接状态
{
try
{
//状态判断
if(m_pConnection==NULL)
return false;
if(m_pConnection->GetState()==adStateClosed)
return false;
m_pConnection->Execute(TEXT("select getdate() "),NULL,adCmdText);
return true;
}
catch(_com_error* e)
{
if (!lstrcmp(e->Description(),TEXT("连接失败 ")) || !lstrcmp(e->Description(),TEXT("连接关闭 ")))
{
isClosed = TRUE;
}
}
return false;
}
我发现我的判断连接状态的函数不起作用,每次调试都崩溃,根本捕获不到异常,大家帮忙。谢谢了。这个问题困扰我两天了。
我的qq:529912640
邮箱:tornodo@vip.qq.com
MSN:tornodo@live.cn
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!