怎样在访问数据库后发现没有连接上数据库实现重新连接

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

22 个解决方案

#1


那就加个TTimer处理了!

#2


怎样去处理,我很采了

#3


这个是低层的东西了,你看一下他们是怎么工作的

#4


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

#5


网络断了 那就只能定时间去连接一次
注意连接失败的异常处理

#6


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

#7


顶一下

#8


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

#9


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

#10


你应在数据模块里建一个网络检测过程,一旦发现网络出现异常,先报警,立即进行重新连接.此过程在所有的与数据库相关的模块在被打开和保存时被调用.
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;

#11


写一个独立小程序(后台程序)来管理网络连接,如果发现网络连接不上就重试N次,如果重试N次后还不行就产生告警消息进行人工干预!

#12


谢谢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;
望高手指点,谢谢!

#13


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

#14


try

    一系列数据库操作

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

   end;
  end;

#15


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

#16


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

#17


像QQ一样加TIMER

#18


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

#19


我把简历发过去了!

#20


非常谢谢各位,结贴了

#21


非常谢谢各位

#22


up

#1


那就加个TTimer处理了!

#2


怎样去处理,我很采了

#3


这个是低层的东西了,你看一下他们是怎么工作的

#4


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

#5


网络断了 那就只能定时间去连接一次
注意连接失败的异常处理

#6


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

#7


顶一下

#8


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

#9


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

#10


你应在数据模块里建一个网络检测过程,一旦发现网络出现异常,先报警,立即进行重新连接.此过程在所有的与数据库相关的模块在被打开和保存时被调用.
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;

#11


写一个独立小程序(后台程序)来管理网络连接,如果发现网络连接不上就重试N次,如果重试N次后还不行就产生告警消息进行人工干预!

#12


谢谢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;
望高手指点,谢谢!

#13


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

#14


try

    一系列数据库操作

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

   end;
  end;

#15


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

#16


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

#17


像QQ一样加TIMER

#18


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

#19


我把简历发过去了!

#20


非常谢谢各位,结贴了

#21


非常谢谢各位

#22


up