Sql server 如何在dbgrid中检查TADODataSet的可用性?

Sql server 如何在dbgrid中检查TADODataSet的可用性?,sql-server,delphi,exception-handling,grid,tadodataset,Sql Server,Delphi,Exception Handling,Grid,Tadodataset,我在VCL表单上使用DBGrid。网格中填充了来自TADOConnection查询的记录。从语义上看,它是这样的: if not Assigned(DataSet) then //reconnect 建立与数据库的连接(SQL Server) 将一些记录提取到TADODataSet数据集中 将数据集与TDataSource对象连接 将数据源对象连接到DBGrid 我的网格执行即时发布,这意味着编辑的数据将立即发布到数据库。一切正常,直到连接关闭(网络关闭、笔记本电脑盖关闭等) 当连

我在VCL表单上使用DBGrid。网格中填充了来自
TADOConnection
查询的记录。从语义上看,它是这样的:

if not Assigned(DataSet) then
    //reconnect
  • 建立与数据库的连接(SQL Server)
  • 将一些记录提取到
    TADODataSet
    数据集中
  • 将数据集与
    TDataSource
    对象连接
  • 数据源
    对象连接到DBGrid
我的网格执行即时发布,这意味着编辑的数据将立即发布到数据库。一切正常,直到连接关闭(网络关闭、笔记本电脑盖关闭等)

当连接丢失时,我无法编辑网格中的记录,这会导致
EOleException
(TCP提供程序:远程主机强制关闭了现有连接)abd
EDatabaseError
(通信链路故障)

我想抓住连接丢失和重新建立连接,但我不知道如何。我检查了网格中所有特定于数据的事件,但问题出现的时间比网格中的任何事件都要早

我相信问题在数据集级别,但我不知道如何捕获异常。有人知道如何检查数据集的可用性吗?然后我可以写一些代码来重新连接。大概是这样的:

if not Assigned(DataSet) then
    //reconnect

非常感谢您的帮助。

您可以检查DataSource.DataSet.Connection.Connected。这没有帮助吗?我从未找到一种方法来重新建立100%可靠的丢失ADO连接。我找到的最佳解决方案是运行一个后台线程,定期测试连接(通过调用服务器上的一些低开销任务)。如果测试失败,则使用ADO-公文包模式在本地保存数据集数据,重新启动应用程序,如果可以打开连接,则恢复本地数据,将其应用于服务器,等等。感谢所有参与人员。我花了一周的时间深入到FireDAC。结果,我把我所有的应用程序都迁移到了FireDAC上,并真正成为了它的瘾君子:-)@Dave、@Victoria,它没有任何帮助。在ADO应用程序中捕获
EDatabaseError
EOleException
是非常重要的。我尝试了几乎所有组件的几乎所有事件处理程序,但没有任何帮助。FireDAC有一个内置的功能来恢复断开的连接,所以我现在支持它#FireDACrulesIt捕捉这些错误一点也不“微不足道”。您不需要在组件上使用事件处理程序来捕获它们;您可以使用异常处理