TAdoQuery的大BUG?断网重连后不能再Open公用AdoQuery,否则堆栈溢出。

肉肉的RORO 2014-12-04 10:32:31
最近接了个任务,给一个程序增加断网重连的能力(该程序是通过ADO连接到MSSQL数据库)。
于是,我做了一个ADO连接的辅助类TAdoConnHelper,它的主要功能是:
1.检测断网;
2.待网络恢复后,重连;
3.发送消息,通知其他窗体刷新数据。

功能1,2都没问题,但功能3出现问题了。

问题:
如果某个FORM中实现查询数据时,使用了另一个DataModule中的TAdoQuery(公用TAdoQuery),那么刷新数据时,就不能再Open该TAdoQuery了,否则会导致堆栈溢出。
如果在断网之前,只使用自己本单元的TAdoQuery就没有问题。

我跟了一下那个公用DEMO,发现断网后它的active=inactive, Dataset.RecordsetState=[stExecuting].
此时,什么CLOSE啥的都没用了,我怀疑这是TAdoQuery的Bug。

不知道有什么办法解决吗?
--------
我提取了一个DEMO,可以到网盘下载,链接:
http://yunpan.cn/cA7mdRacxZTrD
提取码 7716
压缩包中有个SQL脚本,请先执行一下,就可以运行DEMO了。谢谢。
...全文
318 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
肉肉的RORO 2014-12-07
  • 打赏
  • 举报
回复
呵呵,没人看DEMO,其实你们说的意思和我两回事。 我要解决的是断网又恢复连接后APP的重连,而不是去恢复网络。 当重连APP时,第一个进行查询的TadoQuery的状态不对,Open方法会进入死循环,最后堆栈溢出。 这个问题我自己终于摸索出解决方法了。 还是散分吧,谢谢关注。
aniugee 2014-12-06
  • 打赏
  • 举报
回复
重连之前先判断是否active=inactive 如果是,用一楼的办法解决。 在没有重新连上之前,先用本地的。
lyhoo163 2014-12-05
  • 打赏
  • 举报
回复
同意楼上意见,数据连接时,就可以判断,如果断线,特别是物理断线,你是解决不了问题的。
道玄希言 2014-12-05
  • 打赏
  • 举报
回复
我一般是在查询的时候判断 偷了点懒, 定义了个全局标志. 连接数据库后, 标志为true, 程序在查询时, 如果发现断网无法连接, 重置连接标志位. 程序再有查询等过来, 看到标志被重置, 就直接再重新连接..... 反正断网后, 不管你有没有个 "断网重连的能力" 的模块, 结果都一样, 连接不上, 获取不到数据..... 加上你这个模块, 在你没连接上之前, 该来的查询一样会来, 查询不到还是查询不到.... 最多就是, 不会出现界面卡死的情况...

2,507

社区成员

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

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