Как повторить попытку соединения Delphi TAdsConnection с таблицами ADT - PullRequest
0 голосов
/ 22 августа 2011

Из того, что я вижу, мое ПО для членства подключается к нескольким таблицам, используя следующий код в процедуре FormCreate:

 {Open the Sessions}
  Membership.LoginPrompt := False;
  Membership.Username := 'ONLINE';
  Membership.Password := '#######';
  Membership.ConnectPath := MembershipLocation;
  Membership.IsConnected := True;
  PosConnection.ConnectPath := PosLocation;
  PosConnection.IsConnected := True;
  Bookings.ConnectPath := BookingsLocation;
  Bookings.IsConnected := True;
  Local.ConnectPath := LocalLocation;
  Local.IsConnected := True;

  // Open all the tables
  for Wk1 := 0 to ComponentCount - 1 do
    begin
    {Skip the Tmp / New Tables}
    if ((Components[Wk1] is TAdsTable) and (TAdsTable(Components[Wk1]).Name = 'NewTable')) then
      Continue;
    if ((Components[Wk1] is TAdsTable) and (TAdsTable(Components[Wk1]).Name = 'TmpTable')) then
      Continue;
    {Is it a TTable}
    if Components[Wk1] is TAdsTable then
      TAdsTable(Components[Wk1]).Active := True;
    {Is it a TwwTable}
    if Components[Wk1] is TwwTable then
      TwwTable(Components[Wk1]).Active := True;
    {Is it a TQuery}
    if Components[Wk1] is TAdsQuery then
      TAdsQuery(Components[Wk1]).Active := True;
    end;


  {Activate the Membership Tables. This is due to passwords}
  Members.Active := True;
  MemTypes.Active := True;
  MembersById.Active := True;
  MemBookMSys.Active := True;

  {Rebuild the Secondry index on the MemBook table}
  if RebuildIdx = True then
    begin
    MemBook.Active := False;
    MemBook.Exclusive := True;
    MemBook.Active := True;
//  Check(DbiRegenIndexes(MemBook.Handle));
    MemBook.Active := False;
    MemBook.Exclusive := False;
    MemBook.Active := True;
    end;
  {Make the Table Active}
  MemBook.Active := True;

Иногда, когда сервер не готов, но соединение не устанавливается, а пользовательпоявляется ошибка Advantage 7.xxx

Мне нужно, чтобы повторить попытку подключения несколько раз, или снова по истечении определенного времени.

Существует ли стандартный способ отлова ошибок иповторная попытка подключения по этому сценарию?Или я должен просто повторить код по прошествии определенного количества времени?

Спасибо

1 Ответ

2 голосов
/ 22 августа 2011

Вы можете использовать стандартную try..except обработку.

function TYourDataModule.ConnectToDatabases: Boolean;
begin
  Result := False;

  Membership.LoginPrompt := False;
  Membership.Username := 'ONLINE';
  Membership.Password := '#######';
  Membership.ConnectPath := MembershipLocation;
  PosConnection.ConnectPath := PosLocation;
  Bookings.ConnectPath := BookingsLocation;
  Local.ConnectPath := LocalLocation;

  // Try to make all the connections together. If any fail, we'll
  // hit the except block.
  try
    Membership.IsConnected := True;
    PosConnection.IsConnected := True;
    Bookings.IsConnected := True;
    Local.IsConnected := True;
  except
    on E: EAdsDatabaseError do
    begin
      // Make sure all connections are closed, in case
      // one or more succeeded before a failure. We'll
      // be set for next time.
      Membership.IsConnected := False;
      PostConnection.IsConnected := False;
      Booking.IsConnected := False;
      Local.IsConnected := False;
      Result := False;
    end;
  end;
end;

Ваш вызывающий код затем может использовать функцию в цикле, пока она не вернет true или не превысит количество попыток:

var
  NumTrys: Integer;
const
  MAX_TRYS = 10;
  TRY_DELAY = 1000;
begin
  NumTrys := 0;
  while NumTrys < MAX_TRYS do
  begin
    if YourDataModule.ConnectToDatabases then
      Break;
    Inc(NumTrys);
    Sleep(TRY_DELAY);
  end;
  if NumTrys = MAX_TRYS then
    // Handle not being able to connect after all attempts.
end;

Обратите внимание, что вы увидите сообщение об исключении при сбое подключения при запуске в IDE, но не во время выполнения. Если вы не хотите видеть их в IDE, вы можете отключить обработку EADSDatabaseError в диалоге параметров проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...