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

使用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之后网络断开,再使用查询对象操作数据库时会重新连接数据库,有一定的数据延迟。所以使用这种解决办法虽然可以在断网后重连,但断网后的第一次数据库操作会有卡顿现象。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ok060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值