【问题标题】:Detect unplugged network cable with Delphi 7 [duplicate]使用Delphi 7检测拔出的网络电缆[重复]
【发布时间】:2014-12-14 12:57:36
【问题描述】:

我正在构建一个从 sql 服务器检索数据的应用程序。 规范是要在一台或多台机器上运行的应用程序,但是这些机器与托管 sql server 的机器位于同一个 LAN 中。 5 天前,我遇到了这样一种情况,即如果由于某种原因,运行该应用程序的任何一台计算机或托管 sql server 的计算机的网络电缆被拔掉,会发生什么情况。我意识到应用程序被冻结,然后 Delpi-7 产生错误消息。最终,应用程序以不友好的方式终止。

我试图通过 ADO1 控件的“connection:= false”或通过应用程序在断开连接时检索的表事件找到处理此事件的方法,但不幸的是我失败了。

所以我问是否有办法检测 LAN 网线或与 sql 服务器的连接何时松动,以便向用户显示一条消息以检查他的连接 - 在最坏的情况下 -以更友好的方式结束应用程序(例如使用“application.terminate”命令)。

提前谢谢你

【问题讨论】:

标签: sql-server delphi tcp delphi-7


【解决方案1】:

通常,Delphi 数据库客户端在出现错误时会引发异常,您应该在应用程序代码中处理这些异常,方法是显示错误消息、写入日志文件等,然后正常终止或重试(重新连接) .

如果您的代码使用事务(强烈推荐),连接丢失应该是无痛的。

您还可以定期运行“健康检查”查询以及早检测连接丢失。例如,这可以在具有检测过时连接的后台线程的连接池中完成。这些“ping”查询还保持连接处于活动状态,这在某些环境中可能是一个优势。

使应用程序不那么容易受到攻击的另一种策略是使连接和事务尽可能短。 YMMV。

另请参阅:Efficient SQL test query or validation query that will work across all (or most) databases

【讨论】:

  • @mjin,谢谢你的回答。因此,如果我做对了,因为我正在为我的数据库的适当表使用 adoqueries,并且因为我只在相关表单(这些表单内的网格)需要解析它们的数据然后关闭它们时才打开它们,所以我shloudn'不用担心。好吧,我不知道,因为...在我的一种形式中,我有一个网格,可以通过“bottlesQ”adoquerry 成功解析我的数据库的表 BottleT。现在,如果我松开网线并滚动,我不会有任何问题,因为我已经有了数据并且“bottlesQ”已关闭。但是如果我尝试插入/编辑或删除一行,那么
  • 我有问题。那是因为 adoconnection1 的“keep”参数被设置为“true”,因此即使连接丢失,adoconnection1.connected 属性仍然是“true”!!!并且没有这样的事件或属性 - 据我所知 - 在 adoconnection1 或我的示例表“bottlesT”中没有可以在任何事务发生之前询问连接状态的情况。计时器循环的技巧似乎绕过了这个障碍。但是我不知道 adoconnection1 或其他控件的确切事件或属性 - 我应该在这个循环中检查
  • 为了检查数据库连接的状态。此外,我不知道这个循环是否会使整个应用程序变得更重,从而导致其执行期间出现时间间隔。如果您能提供任何代码示例如何处理此问题,我将不胜感激。
猜你喜欢
  • 2011-02-24
  • 2015-09-27
  • 2016-05-16
  • 2010-12-05
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多