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 ...
随机推荐
- 抽取、转换和装载介绍(三)ETL系统的34个子系统
这部分对ETL系统的架构中34个关键子系统进行分类.ETL其实可以分为下面四个步骤: 抽取.在ETL环境中从源系统收集原始数据并且在对任何对数据的重要重构发生之前都将数据写入磁盘.子系统1到子系统3都 ...
- 第一次使用bootstrap3做的响应式网站
第一次使用bootstrap3,发现对移动支持得不错,可以很快的开发出一个支持移动和PC端的网站 作为一个后台程序员觉得得界面做得还可以, 按以前是只能自己看看了 时间线来自国外网站,使用到的css如 ...
- 用 CSS 实现打印显示底色
上一篇有讲到如何在浏览器端实现打印功能.后面发现有个问题,就是表格表头有背景颜色,但是实际打印出来无背景颜色.网上的方法主要有以下几种实现方式: 1.把背景颜色写成行内样式,如下图所示: 但是发现这样 ...
- php 添加数据库的几种方法
最简单的 <?php $con = mysql_connect("localhost","root","root"); if (!$c ...
- 关于Cocos2d-x的数据存储
Cocos2d-x对数据的存储没有用到数据库,但是有用到一个类似数据库的小型数据库,就是数据存储.存储后的数据用XML的文件格式保存在C:\Users\Administrator\AppData\Lo ...
- UIView的几个枚举定义
UIView是iOS开发最主要的视图,非常多控件都是继承它,掌握当中的几个基本枚举定义,有利益理解视图的载入和參数差别. 一.UIViewAnimationCurve UIView的基本动画变化规律 ...
- [CS]C#操作word
近期在做的项目已经改了好几版,近期这一版用到了word,当然不是直接使用word,而是使用第三方的ActiveX控件:dsoframer.ocx.此控件的使用和其它控件的使用流程没有不论什么差别.接下 ...
- Mac OS Yosemite 文件批量重命名
首先,我们选中一个文件夹 右键,或者回车,给一个文件夹改名 同时选中三个文件夹 右键,选中批量更改 弹出批量更改,进行更改 改好后点回车,就能看到效果了 继续操作,完成所有文件 ...
- 世界上最痛苦的事就是去改别人的bug!!!!
世界上最痛苦的事就是去改别人的bug!!!!
- UGUI 的多分辨率适配
1.Canvas的属性配置 2.Canvas Scaler的属性配置 3.根据不同的屏幕的比例动态修改缩放基准 void Start () { float standard_width = 960f; ...