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

  • 相关阅读:
    python--模块与包
    内置函数 的总结
    迭代器 生成器 列表推导式 生成器表达式的一些总结
    函数的有用信息 带参数的装饰器 多个装饰器装饰一个函数
    函数名的应用(第一对象) 闭包 装饰器
    动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结
    函数的初识 函数的返回值 参数
    文件操作 常用操作方法 文件的修改
    遍历字典的集中方法 集合的作用 以及增删查的方法
    计算机硬件的小知识
  • 原文地址:https://www.cnblogs.com/karkash/p/9425098.html
Copyright © 2011-2022 走看看