从程序的LOG看出数据库可以连接成功,但同步不成功,经查,不成功是因为查询表中的记录时长时间无结果,从而导致报“超时已过期”,执行程序EXE会报N个弹出框,最后导致EXE退出。现在我想做成查询时如果长时间无结果的话就放弃此次查询,不要影响其他正常数据库的连接和同步,请问该怎么做,是否要用到try ...finally/except,如果是又该怎么用。
procedure TMainForm.RecvDBTimerTimer(Sender: TObject);(通过定时器定时执行
var
  SourceConn: TADOConnection;
  i: Integer;
  ServerName, ServerIP, UserName, Password: String;
begin
SourceConn := TADOConnection.Create(nil);
  SourceConn.CommandTimeout:=0;
  SourceConn.ConnectionTimeout:=0;  for i:=0 to FDBServerName.Count - 1 do
  begin
    ServerName := FDBServerName[i];
    ServerIP := FDBServerIP[i];
    UserName := FDBUserName[i];
    Password := FDBPassword[i];    if InitADO(SourceConn, ServerIP, ServerName, UserName, Password) then
    begin
      AddLog('连接数据库(' + ServerIP + ')成功');
      try
      RecvDB(FDBLocalConnection, SourceConn);(此过程中存在查询长时间无结果的问题,暂未贴出详细代码
      AddLog('从数据库(' + ServerIP + ')同步数据成功');
      finally
      SourceConn.Free;
      AddLog('从数据库(' + ServerIP + ')同步数据失败');
      end;
      SourceConn.Connected := False;
    end else
    begin
      AddLog('连接数据库(' + ServerIP + ')失败');
    end;
  end;  SourceConn.Free;

解决方案 »

  1.   

          try 
             ...
              AddLog('从数据库(' + ServerIP + ')同步数据成功'); 
          finally 
             ...
             AddLog('从数据库(' + ServerIP + ')同步数据失败'); 
          end; 
    ?
      

  2.   

    用时间timer控件进行数据库查询,很头痛,怎么讲,如果你查询的记录成千上万条,怎么办?可想而知,会产生死锁。我试过,将Timer1.Enabled 置为false,然后当数据查询过后在置为true,这样做也不行。我只有放弃用timer。
      

  3.   

    优化 RecvDB(FDBLocalConnection, SourceConn); 这个存储过程      
         try
           try
             RecvDB(FDBLocalConnection, SourceConn);(此过程中存在查询长时间无结果的问题,暂未贴出详细代码)
             AddLog('从数据库(' + ServerIP + ')同步数据成功');
           except
             AddLog('从数据库(' + ServerIP + ')同步数据失败');
           end;
         finally
           SourceConn.Free;
         end; 
      

  4.   

    呵呵,改成以下了,貌似能解决问题。
      begin
        ServerName := FDBServerName[i];
        ServerIP := FDBServerIP[i];
        UserName := FDBUserName[i];
        Password := FDBPassword[i];    if InitADO(SourceConn, ServerIP, ServerName, UserName, Password) then
        begin
          AddLog('连接数据库(' + ServerIP + ')成功');
          try
          RecvDB(FDBLocalConnection, SourceConn);
          AddLog('从数据库(' + ServerIP + ')同步数据成功');
          except
          //SourceConn.Free;
          AddLog('从数据库(' + ServerIP + ')同步数据失败');
          end;
          SourceConn.Connected := False;
        end else
        begin
          AddLog('连接数据库(' + ServerIP + ')失败');
        end;
      end;  SourceConn.Free;
    end;