ADO报错重连的问题

fool_leave 2005-01-27 03:41:19
小弟初学ADO,在对数据库操作的时候捕捉错误,但怎么判断这个错误是什么原因造成的呢?比如是重复健还是数据库断开?怎么知道在哪种情况下需要重连数据库呢?
...全文
283 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
andyxuyong 2005-01-29
  • 打赏
  • 举报
回复
我是通过调用存储过程,然后返回文件,如果返回文件是ORACLE的一些错,或者是我程式连接的报错就会通过语句重连,当然执行SQL是一样的办法!不知道对你有没有帮助哦!

如:
ReExecute:
if (mtCallProc.Lock() == 0)
{
delete[]pFileInfo;
CDB::LogEvents(sAppName,EVENTLOG_ERROR_TYPE,"\nCan not lock proc!");
return -1;
}
sErr = db->CallProcedure(proc,&rs);
//connect halt
if (sErr!="OK")
{
CDB::LogEvents(sAppName,EVENTLOG_ERROR_TYPE,"\n"+sErr);

if ((sErr.Find("ORA-12571") != -1) || (sErr.Find("ORA-03114") != -1) || (sErr.Find("DB Connection Is Invalid") != -1))
{
ReConnect:
strcpy(cTem,"");
if (db->ConnectDB(cTem,sizeof(cTem))<0)
{
iReConnectTimes++;
if (iReConnectTimes < 4)
{
goto ReConnect;
}
}
else
{
mtCallProc.Unlock();
goto ReExecute;
}
}
}
mtCallProc.Unlock();
jayfunk 2005-01-28
  • 打赏
  • 举报
回复
try
{}
catch(_com_error e)
{
e.discription;
}
快乐鹦鹉 2005-01-28
  • 打赏
  • 举报
回复
我是通过GetDescription判断的
fool_leave 2005-01-28
  • 打赏
  • 举报
回复
ZHENG017说的也有道理。各位一般是怎么判断的?
ZHENG017 2005-01-28
  • 打赏
  • 举报
回复
在catch()后通过执行一条永远正确的sql语句select getdate() as date再判断是否是错,如果出错则证明需要重新连接数据库.
_ConnectionPtr中有个error集合,可以通过error的GetDescription获取错误信息.
chtfyy 2005-01-28
  • 打赏
  • 举报
回复
使用下面的语句,绝对好用!
catch
{
AfxMessageBox(e.Description());
}
快乐鹦鹉 2005-01-28
  • 打赏
  • 举报
回复
回复人: fool_leave() ( ) 信誉:100 2005-01-27 20:39:00 得分: 0


捕获到了错误,但是具体哪些错误需要重连呢?我只知道拔网线和关数据库,其他还有什么情况呢?
e.Error()等于什么时重连?呜呜~~


这个也正是我头疼的问题。我把数据库关了,得到的错误是数据库未定义的错误号,我也不知道如何检查数据库已经断了。关于这个问题,我发过帖子,也未能得到答案。
关注中。。。。。。
fool_leave 2005-01-28
  • 打赏
  • 举报
回复
不明白,你们得到了错误说明然后怎么办?难道用对话框报出来,然后看一下再手动重连吗?

我在想程序要想自动判断是不是要重连,就必须要知道需要重联的错误都有哪些。有没有比较全的错误说明。
legendhui 2005-01-27
  • 打赏
  • 举报
回复
try
catch
fool_leave 2005-01-27
  • 打赏
  • 举报
回复
捕获到了错误,但是具体哪些错误需要重连呢?我只知道拔网线和关数据库,其他还有什么情况呢?
e.Error()等于什么时重连?呜呜~~
oyljerry 2005-01-27
  • 打赏
  • 举报
回复
用try catch来捕获错误
gdy119 2005-01-27
  • 打赏
  • 举报
回复
try{...}
catch(...)
{
CString message;
DWORD ErrorCode = GetLastError() ;
char buff[128];
::FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM,(void*)FORMAT_MESSAGE_FROM_STRING,ErrorCode,0,buff,128,0);
message.Format("执行文件:%s错误,发生在:%d 行,错误描述为:%s",__FILE__,__LINE__,buff);
MessageBox((LPCTSTR)message,"Error",MB_ICONERROR | MB_OK);
}
快乐鹦鹉 2005-01-27
  • 打赏
  • 举报
回复
问的好,try ... catch(_com_error e)
如果有异常,那么
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
TRACE("Error\n");
TRACE("Code = %08lx\n", e.Error());
TRACE("Code meaning = %s\n", e.ErrorMessage());
TRACE("Source = %s\n", (LPCSTR) bstrSource);
TRACE("Description = %s\n", (LPCSTR) bstrDescription);
就可以看到错误原因了。

4,011

社区成员

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

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