• 15144阅读
  • 5回复

[提问]如何判定QSqlDatabase的网络连接被断开??(isOpen总是返回true) [复制链接]

上一主题 下一主题
离线陈小草
 
只看楼主 倒序阅读 楼主  发表于: 2013-07-31
— 本帖被 XChinux 执行加亮操作(2013-07-31) —
QT4.8.4/4.8.5
window
msvc2008连接的是SQL SERVER.
连上后,用工具把那条网络连接给close掉
再查询
QSqlDatavase::isOpen()返回true
查询失败,lastError::type为2,SQL语句语法错误,很无奈
LastError::number为11,就不知道怎么意思了。
lastError::text倒是能说明问题,“[size=; font-size: 10pt,10pt]通讯链接失败”,但总不能用字符串来判断吧

想请教如何判断数据对象的网络连接中断了??

离线XChinux

只看该作者 1楼 发表于: 2013-07-31
所以你就用QSqlQuery查一下"select 1",能正确返回结果,那就通畅,否则就有问题了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线陈小草
只看该作者 2楼 发表于: 2013-07-31
回 1楼(XChinux) 的帖子
这个我也考虑过,

但现在的解决方案是:
lastError::number() 11代表常规网络错误
(这个可以参考微软官方文档 http://support.microsoft.com/kb/195566
用这个来判断
离线陈小草
只看该作者 3楼 发表于: 2013-08-17
引用第1楼XChinux于2013-07-31 13:04发表的  :
所以你就用QSqlQuery查一下"select 1",能正确返回结果,那就通畅,否则就有问题了。

根据我的测试:
连上数据库,再拔掉掉网线,select 1 查询会阻塞好一阵子
最理想的还是lastError::number() ==11时,close掉连接
下次isOpen失败,再重连

连接时如果长时间阻塞,多半是因为“目标计算机积极拒绝”,网络连不上
而这个时候QODBC的connectOptions是不管用的(至少在我这不管用)

所以我想,要不连数据库之前,先来条TCP连接探测对方IP和端口,
如果UnconnectedState,那也不用open了,直接报连不上吧
离线justwake

只看该作者 4楼 发表于: 2013-08-21
引用第3楼陈小草于2013-08-17 17:10发表的  :
根据我的测试:
连上数据库,再拔掉掉网线,select 1 查询会阻塞好一阵子
最理想的还是lastError::number() ==11时,close掉连接
下次isOpen失败,再重连
.......

如果你不进行一次select   那么你的lastError::number是从哪来的呢?


离线陈小草
只看该作者 5楼 发表于: 2013-08-23
引用第4楼justwake于2013-08-21 13:43发表的  :
如果你不进行一次select   那么你的lastError::number是从哪来的呢?


最后一次失败的时候
快速回复
限100 字节
 
上一个 下一个