如何判断数据库连接已断开?(100分)

  • 主题发起人 主题发起人 seago
  • 开始时间 开始时间
S

seago

Unregistered / Unconfirmed
GUEST, unregistred user!
使用TDatabase连接到数据库后, 当数据库服务器DOWN掉
或者网络断开,或者只是数据库连接断开时,该如何判断?
 

if DMod.DataBase.connected then
...
else
showMessage('数据库连结失败');

在每次用数据库时,加一个判断
 
Connected属性不能自动改变,只有显式对它进行更改时才会改变,
AfterDisconnect事件也是当Connected:=False时才会触发,因此
当数据库连接断开时不能使用TDatabase来判断。
 
要不就另建一个 tdatabase ,是你用到的这个的副本,试图 connect 这个,如果能通,
则说明你当前的连接没有问题,否则可能已经断了。
 
在APPLICATION的onexception里去判断。如果PING服务器没有反应,就是服务器down了,或网络断了。
 
netfly:

这样不行的,如果只是数据库服务不能运行,
而不是对方的数据库服务器垮了,那么你
肯定可以ping的通,但是还是无法使用数据库
的服务。
 
timer
ontimer event
get some data from a simple table

 
如果每次访问数据库时,只要出现异常就当作是数据库
连接已断开,这种处理合适吗?
try
With Query1 do
begin
...
...
Open;
end;
except
on E:EDatabaseError do
ShowMessage('数据库已经断开,请重新连接!');
end;
本想对E.Message进行判断来确定数据库是否断开,但发现连不上
数据库时,DBMS不同E.Message也会不一致。

 
seago的处理在查询命令出错下不妥。
还是使用一条简单的查询命令检测较好!
cmd:='select * from tempdb';
Query1.close;
Query1.Sql.clear;
Query1.Sql.add(cmd);
try
Query1.Open;
except
ShowMessage('数据库已经断开,请重新连接!');
end;

 
>>来自:seago 时间:00-12-8 22:08:53 ID:413244
>>如果每次访问数据库时,只要出现异常就当作是数据库
>>连接已断开,这种处理合适吗?

可以呀,我们就是这样的,省心省事
 
对返回的错误代码区分一下不就知道了吗?
 
同意小猪,帮助文档中有相应的出错类型和类型码,研究一下吧,不会花
太多时间
出现异常就当数据库已断开并不可靠和正规
频繁提示数据库断开会使用户很恼火和疑惑,而且为你的维护绝对
带来很大的麻烦,不要杀鸡取卵哟!
 
谢谢各位!
只有这么点分,不好意思再讨论下去,就此结束吧!
根据小猪和青子衿的提示,查看了BDE.INT文件,
找到了ERRCAT_NETWORK等错误代码,如此就可根据E.Errors[0].Category,
E.Errors[0].SubCode,E.Errors[0].ErrorCode等的值做相应处理了!

 
多人接受答案了。
 
后退
顶部