有很多个子程序连接到一个TConnection中,外部条件改变(如网络断了),子程序连接不能访问数据库后怎样实现重新连接数据库,尽量通过TConnection端解决,子程序连接端程序太多不太好改了,希望在TConnection上下工夫;
谢谢帮忙!

解决方案 »

  1.   

    再ontime的事件中加如下代码
    if not TConnection1.Connection then
      TConnetion1.Connection:=true;
    不知道行不行
    我也很菜耶
      

  2.   

    出现异常后让timer1开始运行,不停的连接,只到连接上不就可以了吗
      

  3.   

    在AfterDisconnect事件里写重新连接的代码
      

  4.   

    谢谢各位
    我是希望对数据库操作时发现连接没有连接上数据库在实现重新连接
    楼上几位我都试过,好象不太好用,说的可能资源站用太多,在我的程序中不太好用,
    jialiujie(jlj) 的
    if not TConnection1.Connection then
      TConnetion1.Connection:=true;
    网络断了是,提示过不能连接上数据库,但Connection1.Connection 状态还是真,我试过
    neo40(企鹅) 的:
    网络断了是,提示过不能连接上数据库,也不除法AfterDisconnect事件,提问前我就试过,也不好用
    会不会是我对TConnection的设置不对,望各位指点,分不够我在开个贴,家100分
     wintergoes(多来米饭少来稀) :
    我试试
      

  5.   

    你应在数据模块里建一个网络检测过程,一旦发现网络出现异常,先报警,立即进行重新连接.此过程在所有的与数据库相关的模块在被打开和保存时被调用.
    function TDataModuleMain.NetConnect: Boolean;
    begin
      Try
        ADODataSetCheckNet.Close;
        ADODataSetCheckNet.CommandText:='Select GetDate() as CurrentDateTime';
        ADODataSetCheckNet.Open;
        CurrentDateTime:=ADODataSetCheckNet.FieldByName('CurrentDateTime').AsDateTime;
        Result:=True;
      Except
        ShowMessage('数据连接中断,请迅速与系统管理员联系!');
        Result:=False;
      end;
    end;调用:
    if DataModuleMain.NetCheck then 
      begin
      end;
      

  6.   

    谢谢chenylin(陈SIR) 和leeshine(LeeShine_Soft) 
    chenylin(陈SIR) 和 leeshine(LeeShine_Soft) 的方法可能系统开销有些大,我考虑过这样实现,有两个问题,
    1、我修改的程序量很大
    2、系统开销有些大
    可能不太适合,能不能当连接不上时,如用TADOQery执行SQL语句时是因为连接不上儿才执行重连接,怎样判断,在ADOConnection.OnExecuteComplete中有个Error.Get_Number=-2147467259表示“连接失败”
    可以通过
    Timer1: TTimer;
    属性 Timer1.Interval = 6000;//可以设小点,当断开连接后六秒后启动连接数据库
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      ADOConnection1.Close;
      ADOConnection1.Open;
      Timer1.Enabled := false;
    end;procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection;
      RecordsAffected: Integer; const Error: Error;
      var EventStatus: TEventStatus; const Command: _Command;
      const Recordset: _Recordset);
    begin
      if (Error <> nil) and not Timer1.Enabled and (Error.Get_Number = -2147467259) then//但不知道Error.Get_Number 为-2147467259就一定是数据库连接失败和数据库连接失败是否就是-2147467259
      begin
        Application.MessageBox('数据库连接出错,此次操作被取消!','数据库连接错误');
        //Connection.Close;
        //Connection.Open;
        Timer1.Enabled := true;
      end;
    end;
    望高手指点,谢谢!
      

  7.   

    没有加上异常处理,现在加上
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      try
        ADOConnection1.Close;
        ADOConnection1.Open;
      except
      end;
      Timer1.Enabled := false;
    end;
      

  8.   

    try    一系列数据库操作  except on e:exception do
       begin
         1,ADOConnection1.Close;//这句非常重要,为下次连接释放资源。
         2,记错误日志,如:writelog(e.message);
         3,输出错误信息。。或者继续把这个异常向外层再抛出。raise;   end;
      end;
      

  9.   

    非常谢谢halfdream(哈欠) 要些出健壮的程序需要哲学东西
    能问一下TADOConnection.OnExecuteComplete中
    不知道Error.Get_Number 的值-2147467259就一定是数据库连接失败
    数据库连接失败Error.Get_Number 的值就是-2147467259
      

  10.   

    抛出异常后让他在子线程里sleep一会儿
      

  11.   

    jinjazz(近身剪(充电中...)) 也不错呀,确定了
    非常谢谢halfdream(哈欠) 要些出健壮的程序需要哲学东西
    能问一下TADOConnection.OnExecuteComplete中
    不知道Error.Get_Number 的值-2147467259就一定是数据库连接失败
    数据库连接失败Error.Get_Number 的值就是-2147467259
    就结帖
    望大虾帮忙