ADO连接数据库,未解决的状态判断问题(最高只能50分,郁闷)

锅哥 2010-09-02 09:16:41
现在做一个主要运行在后台的程序,读取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
...全文
184 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
锅哥 2010-09-03
  • 打赏
  • 举报
回复
郁闷,找了一天都没找到
锅哥 2010-09-02
  • 打赏
  • 举报
回复
这个没人能解决掉吗?
我的诸如此类的代码也是直接异常,什么都捕获不到。

try
{
pConnection-> Execute( "select 1 ");
}
catch(_com_error e)
{

}
锅哥 2010-09-02
  • 打赏
  • 举报
回复
AfxOleInit();连接了,就是本地上试的
qiuzhongqun 2010-09-02
  • 打赏
  • 举报
回复
初使化COM库了吗?好像没有看到
qiuzhongqun 2010-09-02
  • 打赏
  • 举报
回复
先连接本地的看看行不
锅哥 2010-09-02
  • 打赏
  • 举报
回复
而且如下的方法也判断不了连接状态

if(m_pConnection==NULL)
return false;
if(m_pConnection->GetState()==adStateClosed)
return false;

//参数判断
long lErrorCount = m_pConnection->Errors->Count;
if(lErrorCount>0L)
{
ErrorPtr pError = NULL;
for(long i=0; i<lErrorCount; i++)
{
pError = m_pConnection->Errors->GetItem(i);
if(pError->Number==0x80004005)
return false;
}
}

return true;
}
catch(_com_error* e)
{

zyq5945 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tornodo 的回复:]

已经解决,去掉e前面的*就搞定了,改天放出个更实用的类来奉献
[/Quote]
置顶帖子里有说的.
锅哥 2010-09-02
  • 打赏
  • 举报
回复
已经解决,去掉e前面的*就搞定了,改天放出个更实用的类来奉献
  • 打赏
  • 举报
回复
关注!
锅哥 2010-09-02
  • 打赏
  • 举报
回复
怎么没人来回答,稍微指点下也行啊

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧