Delphi使用ADO连接网络数据库,断网后重连问题

转载 2013年12月05日 14:23:44

使用TADOConnection对象连接网络数据库(以MySQL为例),当本地网络断开时,连接对象的Connected属性不会发生变化,一直是True。

即使将连接对象的KeepConnection属性设置为false,若网络断开,在不尝试连接数据库的情况下,Connected属性也是true;在尝试连接数据库失败之后,Connected属性才变为false。

  1. var  
  2.   ADOCon: TADOConnection;  
  3. begin  
  4.   //to do 创建ADOCon对象,并为ADOCon赋值连接字符串,代码省略  
  5.    
  6.   ADOCon.KeepConnection := false;  
  7.   //此时网络连接正常  
  8.   ADOCon.Open;  //或者ADOCon.Connected := true;  
  9.   ADOCon.Connected; //该属性值为true  
  10.   //断开网络连接  
  11.   ADOCon.Connected; //该属性值为true  
  12.   ADOCon.Open; //此时连接出现异常  
  13.   ADOCon.Connected; //该属性值为false  
  14. end;  


因此在代码中无法使用Connected属性来判断ADO对象是否连接正常;而且如果使用此连接对象在查询数据库异常后,直接关闭再打开连接会没有效果,无法连接成功,必须重新打开运行程序,或者重新创建连接对象。

针对这种情况,网络上通用的解决办法就是增加一个timer定时器,创建新的测试连接对象定时去连接数据库,若连接失败则关闭连接对象并重连,以实现断网后的自动重新连接,在断网后操作数据库时不出现卡顿现象。

  1. procedure TForm1.tmr1Timer(Sender: TObject);  
  2.   function TestConnected: Boolean;  
  3.   var  
  4.     aCon: TADOConnection;  
  5.   begin  
  6.     Result := False;  
  7.     aCon := TADOConnection.Create(nil); //创建临时对象  
  8.     try  
  9.       aCon.ConnectionString := const_DBCON_MYSQL; //连接字符串  
  10.       try  
  11.         aCon.Connected := True;  
  12.         Result := True;  
  13.       except  
  14.         Exit;  
  15.       end;  
  16.     finally  
  17.       aCon.Free;  
  18.     end;  
  19.   end;  
  20. begin  
  21.   if not TestConnected then //使用临时对象判断数据库连接状况  
  22.   begin  
  23.     FADOCon.Close; //根据临时对象连接状况操作连接对象,若无法连接则关闭连接对象,若连接正常则打开连接对象  
  24.   end  
  25.   else  
  26.   begin  
  27.     if FADOCon.Connected then  
  28.       FADOCon.Connected := True;  
  29.   end;  
  30. end;  


 

不过,如果断网或者数据库挂掉的情况非常少,而且对断网后查询数据出现卡顿现象没有特殊要求,那么可以在每次操作完数据库后关闭连接对象,这样即便是断网状态下,连接也是关闭的,查询数据库出现异常也不会影响网络恢复后的数据库操作。

  1. procedure TForm1.btn3Click(Sender: TObject);  
  2. begin  
  3.   try  
  4.     FADOQuery.Close;  
  5.     FADOQuery.Connection := FADOCon;  
  6.     FADOQuery.SQL.Text := 'select * from fp_kpxx';  
  7.     FADOQuery.Open; //连接对象关闭状态下,查询时会自动连接  
  8.     ShowInfoDlg(IntToStr(FADOQuery.RecordCount));  
  9.     FADOCon.Close;  
  10.     //此时断开网络  
  11.      FADOQuery.Open; //此时出现异常  
  12.      FADOCon.Close;  
  13.     //此时恢复网络  
  14.      FADOQuery.Open; //此时查询正常  
  15.      FADOCon.Close;  
  16.   except  
  17.     ShowInfoDlg('查询失败');  
  18.   end;  
  19. end;  
连接对象Close之后若网络未断开,然后使用TADOQuery对象操作数据库时不会重新连接数据库,没有时间延迟;若连接对象Close之后网络断开,再使用查询对象操作数据库时会重新连接数据库,有一定的数据延迟。所以使用这种解决办法虽然可以在断网后重连,但断网后的第一次数据库操作会有卡顿现象。

Delphi连接ORACLE丢失联系错误解决!

最近以前一直正常的一段程序突然不能正常运行了。提示错误:ORA-12547: TNS: 丢失联系。做程序这么多年来这个问题倒是第一次碰到。我的程序是连接的ORACLE数据库,用的是ADO 的数据源方式...
  • binger819623
  • binger819623
  • 2007年04月12日 11:11
  • 1719

Delphi使用ADO连接网络数据库,断网后重连问题

使用TADOConnection对象连接网络数据库(以MySQL为例),当本地网络断开时,连接对象的Connected属性不会发生变化,一直是True。 即使将连接对象的KeepConnection属...
  • jhq1990
  • jhq1990
  • 2013年09月16日 16:50
  • 2564

解决oracle连接一段时间就断连的问题

(1) SQL>show parameter resource_limit; 如果为FALSE,则将其修改为TRUE,否则配置不会生效: SQL>alter system set resource_l...
  • sqlove
  • sqlove
  • 2009年09月17日 10:10
  • 2284

解决plsql连接oracle服务器(云服务器)自动断开问题

转载: http://blog.csdn.net/zj0078/article/details/9301033 一、服务器配置  (1)   SQL> show   parameter  ...
  • funnyfu0101
  • funnyfu0101
  • 2016年11月19日 21:22
  • 1027

Delphi6中使用TADOConnection和TADQuery组件连接访问数据库总结

首先先来简单了解一下TADOConnection控件和TADOQuery控件作用,如下图: 好了简单对这两个控件有了一个初步的认识了,下面我们就通过两种形式来进行访问数据库:第一种是通过手动配置...
  • songchao_2011
  • songchao_2011
  • 2014年01月05日 12:33
  • 1811

ADO 数据库连接断开重连

     在使用ADO的过程中,最理想的操作流程:     程序启动,打开数据库连接,在程序退出前,一直保持这个连接。程序退出时,才关闭该连。    最理想的状态的前提:该数据库连接在中间不会断开。不...
  • edward22
  • edward22
  • 2011年01月05日 16:52
  • 5290

关于查询报表总是"超时已过期"的问题解决

    "超时已过期" 的问题一直在烦扰着我, 在查一些数据量比较大的表或者运行一些复杂存储过程的时候就会出现这个提示,     一开始是按下面的来设,有一些报表是可以正常查出来           ...
  • longmen23
  • longmen23
  • 2008年08月20日 16:30
  • 6348

ADO方式连接数据库

ADO方式连接数据库分为如下步骤: 1.ADO对象的导入 在使用ADO技术时需要导入一个ADO动态链接库msado15.dll。该动态库位于系统盘下的"Program Files\Common Fil...
  • hola_f
  • hola_f
  • 2016年08月03日 16:32
  • 3081

adoconnection连接数据库,长时间不用,连接失败

程序打开,过一段时间不操作。好像是连接断开了一样,提示连接失败,要退出程序重进就好了。 为什么呢 同样的服务器,同样的网路,貌似VF开发的程序是好的! ADOConnection的Kee...
  • ksrsoft
  • ksrsoft
  • 2013年04月19日 10:22
  • 2005

DBNMPNTW]Connectionopen(CreateFile()) DELPHI开发的ADO应用程序连接SQL SERVER失败的解决办法

有问题就网上搜,这是我的习惯可惜都是看别人的,自己的经验从来没有与大家共享,深感惭愧,以后更要勤勉努力啊。我用DELPHI,经常碰到自己的ado不能连接到SQL SERVER。排除SQL SERVER...
  • szliszt
  • szliszt
  • 2007年06月07日 18:01
  • 3930
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi使用ADO连接网络数据库,断网后重连问题
举报原因:
原因补充:

(最多只允许输入30个字)