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

  • 相关阅读:
    区别Lua模式匹配中 %a+ 与 .-
    将硬件规定的通信协议用Lua实现(涉及到很多Lua通信的数据转换)
    Lua库-string库
    Unity3d
    Unity3d
    Unity3d
    Unity3d
    Unity3d
    Unity3d
    Unity3d
  • 原文地址:https://www.cnblogs.com/karkash/p/9425098.html
Copyright © 2011-2022 走看看