如何检测到TadoConnection丢失了与服务器的通信?

Sal*_*dor 11 delphi ado

我需要检测TAdoConnection组件何时丢失与服务器的连接.我尝试过使用OnDisconnect事件,但这仅在调用Close方法或Connected属性设置为false时触发.

我尝试过的另一个选择是使用TTimer并执行这样的查询

SELECT 1 RESULT FROM DUAL
Run Code Online (Sandbox Code Playgroud)

在OnTimer事件中,捕获发生的任何异常.

有没有更好的选择来检测连接丢失?

da-*_*oft 11

我看到了DUAL表.意思是,你正在使用Oracle :)

对于大多数(全部?)客户端/服务器DBMS,除了向DBMS请求某些操作之外,没有办法检测到连接丢失.并且有很多原因,为什么连接会丢失.可能是网络故障,可能是......,可能是DBA关闭了一个DB.

许多DBMS API(包括Oracle OCI)都具有特殊功能,允许ping DBMS."ping"是对DBMS的最小可能请求.上面的SELECT需要比ping更多的工作.

但并非所有数据访问组件(包括ADO)都允许使用DBMS API ping调用ping DBMS.然后你必须使用一些SQL命令.因此,上面的SELECT与ADO是正确的.其他选项 - BEGIN NULL; 结束;.它可能使用较少的DBMS资源(不需要优化器,不需要描述结果集等).

TTimer没问题.查询应在线程中执行,其中使用相应的连接.虽然不是必须的,但这是一个不同的问题.

当连接丢失时,潜在的问题可能是关闭连接.由于DBMS API可能处于失败状态,因此连接关闭可能引发异常.

有点......