Delphi使用ADO连接网络数据库,断网后重连问题
原始文章: https://blog.csdn.net/blog_jihq/article/details/11737699#
使用TADOConnection对象连接网络数据库(以MySQL为例),当本地网络断开时,连接对象的Connected属性不会发生变化,一直是True。
即使将连接对象的KeepConnection属性设置为false,若网络断开,在不尝试连接数据库的情况下,Connected属性也是true;在尝试连接数据库失败之后,Connected属性才变为false。
var
ADOCon: TADOConnection;
begin
//to do 创建ADOCon对象,并为ADOCon赋值连接字符串,代码省略 ADOCon.KeepConnection := false;
//此时网络连接正常
ADOCon.Open; //或者ADOCon.Connected := true;
ADOCon.Connected; //该属性值为true
//断开网络连接
ADOCon.Connected; //该属性值为true
ADOCon.Open; //此时连接出现异常
ADOCon.Connected; //该属性值为false
end;
因此在代码中无法使用Connected属性来判断ADO对象是否连接正常;而且如果使用此连接对象在查询数据库异常后,直接关闭再打开连接会没有效果,无法连接成功,必须重新打开运行程序,或者重新创建连接对象。
针对这种情况,网络上通用的解决办法就是增加一个timer定时器,创建新的测试连接对象定时去连接数据库,若连接失败则关闭连接对象并重连,以实现断网后的自动重新连接,在断网后操作数据库时不出现卡顿现象。
procedure TForm1.tmr1Timer(Sender: TObject);
function TestConnected: Boolean;
var
aCon: TADOConnection;
begin
Result := False;
aCon := TADOConnection.Create(nil); //创建临时对象
try
aCon.ConnectionString := const_DBCON_MYSQL; //连接字符串
try
aCon.Connected := True;
Result := True;
except
Exit;
end;
finally
aCon.Free;
end;
end;
begin
if not TestConnected then //使用临时对象判断数据库连接状况
begin
FADOCon.Close; //根据临时对象连接状况操作连接对象,若无法连接则关闭连接对象,若连接正常则打开连接对象
end
else
begin
if FADOCon.Connected then
FADOCon.Connected := True;
end;
end;
不过,如果断网或者数据库挂掉的情况非常少,而且对断网后查询数据出现卡顿现象没有特殊要求,那么可以在每次操作完数据库后关闭连接对象,这样即便是断网状态下,连接也是关闭的,查询数据库出现异常也不会影响网络恢复后的数据库操作。
procedure TForm1.btn3Click(Sender: TObject);
begin
try
FADOQuery.Close;
FADOQuery.Connection := FADOCon;
FADOQuery.SQL.Text := 'select * from fp_kpxx';
FADOQuery.Open; //连接对象关闭状态下,查询时会自动连接
ShowInfoDlg(IntToStr(FADOQuery.RecordCount));
FADOCon.Close;
//此时断开网络
FADOQuery.Open; //此时出现异常
FADOCon.Close;
//此时恢复网络
FADOQuery.Open; //此时查询正常
FADOCon.Close;
except
ShowInfoDlg('查询失败');
end;
end;
连接对象Close之后若网络未断开,然后使用TADOQuery对象操作数据库时不会重新连接数据库,没有时间延迟;若连接对象Close之后网络断开,再使用查询对象操作数据库时会重新连接数据库,有一定的数据延迟。所以使用这种解决办法虽然可以在断网后重连,但断网后的第一次数据库操作会有卡顿现象。
Delphi使用ADO连接网络数据库,断网后重连问题的更多相关文章
- Delphi:ADOConnection连接SQLServer自动断网问题解决
=============================== 解决方法一:异常时关闭连接,WinXP,win7 32位大部分情况都是起作用的,不过在有些windows操作系统下(如家庭版)不起作用, ...
- 64位程序,利用ADO连接Oracle数据库
刚好手头项目解决了ADO连接Oracle数据库的问题,记录下来,防止忘记. 项目情况:用32位环境完成算法动态库,结果后来需要升级到64位环境,由64位的软件来调用,则在64位设置下生成算法动 ...
- MFC ADO连接Oracle12c数据库 客户端环境搭建
ADO连接方式一:Provider=MSDAORA.1; 环境配置如下: 去官网下载ODAC121024Xcopy_32bit.zip安装 安装方式如下: (1)解压文件 (2)用命令行CD到该文件的 ...
- Android 连接网络数据库的方式
以连接MS SQL(sqlserver数据库)的网络数据库为例,从当前搜集的资料来看,一共有两种方式:在Android工程中引入JDBC驱动,直接连接:通过WebService等方法的间接连接. 采用 ...
- 转:VB用ADO连接SQLServer数据库
'数据源信息常量 Public Const conn As String = "Provider = SQLOLEDB.1;Password = sa; UserID = sa; Initi ...
- Python 实现断网自动重连
为了实现 断网了,自动连接网络原理:每隔一段时间ping一下百度,判断网络状态,没有联网的话,就模仿浏览器发一条Post给服务器import urllibimport hashlibimport su ...
- netty5客户端监测服务端断连后重连
服务端挂了或者主动拒绝客户端的连接后,客户端不死心,每15秒重连试试,3次都不行就算了.修改下之前的客户端引导类(NettyClient,参见netty5心跳与业务消息分发实例),新增两个成员变量,在 ...
- 网络监测 断网 网速 ping 完整案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- ADO连接ACCESS数据库
首先在StdAfx.h中加入 建立连接:(在xxApp文件中) 1 声明变量 2 建立连接 (1) AfxOleInit 初始化 OLE 为应用程序的支持. BOOL AFXAPI AfxOleIn ...
随机推荐
- Java并发(零)教程目录
上网看博客的时候无意中发现了有一个Java并发的教程还不错,有20多篇讲并发的,一天翻译1篇似乎也不太难.Let's go! 原文地址:http://tutorials.jenkov.com/java ...
- kernel 3.2.0 上加入自己的板级文件
第一步.复制自己的参考的板级文件 cp arch/arm/mach-omap2/board-am335xevm.c arch/arm/mach-omap2/board-aplex_ECM_5412.c ...
- BUS Matrix
ARM的BUS Matrix就是多主(Core,DMA等).多从(内部RAM,APB,外部总线等)的交联和仲裁.目的是为了提高不同主机访问不同外设情况下的带宽,另外一个就是简化Bus Master的协 ...
- css 图片文字对齐
默认情况,是图片置顶对齐,文字置底对齐,所以通常图片高,文字低,不能水平居中对齐 解决办法:在css中设置图片的vertical-align属性, <img src="" s ...
- python中的map()函数
MapReduce的设计灵感来自于函数式编程,这里不打算提MapReduce,就拿python中的map()函数来学习一下. 文档中的介绍在这里: map(function, iterable, .. ...
- 关于Cocos2d-x中节点的获取
方法一: 1.在.h文件的属性里面先声明要使用的节点或者变量. private: Label *scorelabel; 2.在.cpp文件中创建并使用这个节点或者变量. scorelabel = La ...
- Spring 4 官方文档学习(十一)Web MVC 框架之Flash Attributes
接上一篇中的重定向. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-fl ...
- 嵌入式驱动开发之usb 无线网卡驱动---RT2870STA dm368
RT2870STA 368的无线网卡驱动! http://www.linuxidc.com/Linux/2014-02/96979.htm
- mpeg压缩输入格式---打包模式和平面模式
版本 v1.0,存在内存问题在 void v4l2_process_image(struct buffer buf)中对 v4l2 采集来的一帧进行处理,存在 struct buffer buf 中b ...
- jquery -- jquery控制只能输入数字和小数点
控制文本框只能输入数字是一个很常见的需求,比如电话号码的输入.数量的输入等,这时候就需要我们控制文本框只能输入数字.在用js控制之后在英文输入法的状态下去敲击键盘上的非数字键是输不进去的,然而当你转到 ...