Ir para conteúdo
  • Cadastre-se

dev botao

Reativar Uma Query Que Foi Desativada Por Motivo De Queda De Conexao


  • Este tópico foi criado há 207 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Seguinte pessoal , queria saber se tem alguma forma de eu capiturar
Query que estavam Ativas , mais devido a Queda de Conexao do DATABASE
Central , ele passou a ficar com o Status Active = false , pois to
tentando fazer uma Unit que qndo der o erro de queda de conexao . o
mesmo tente reconectar e reconstruir as querys que estavam abertas ...
estou com um codigo que to criando pra Delphi7 e depois vou portar pra
lazarus , mais que ainda . nao to conseguindo saber qual é query q
estava ativa antes da queda ... vou postar o codigo e quem puder me
ajudar agradeço .

Adilson Pazzini

procedure TSISHandleException.AppException(Sender:TObject;
E:Exception);
var
 Log: TextFile;
 ErrCode,i :integer;
 AConected :boolean;
 ASource: TComponent;
 Formulario :TForm;
begin
{$I-}
 //===== TRATAMENTO
 if TComponent(sender) is TForm then
  Formulario := TForm(sender)
 else
  Formulario := TForm(TComponent(sender).Owner) ;
 AConected := false;
 if E is EDBEngineError then
  begin
    ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
     if ErrCode = 13059 then // --> 'Erro não Foi possivel Conectar
com o Host' // erro do proprio BDE.
      begin
       while not AConected do
        begin
         try
           //===> reconectando ............aq ainda utilizando o
BDE ... mais estarei migrando para ZEOS tambem
           DM.DATABASE.Connected := false ;
           DM.DATABASE.Connected := true  ;
           AConected := true;
          for i := 0 to Formulario.ComponentCount-1 do
           begin
            ASource := Formulario.Components[i];
             if ASource <> nil then
               begin
                if ASource is Tquery then
                 begin
                   //ShowMessage('Formulario '+Formulario.name+'
Query Name '+TQuery(ASource).name+'
Active='+iif(TQuery(ASource).Active,'true','false'));
                   if not TQuery(ASource).Active then
                     TQuery(ASource).open;
                 end;
               end;
           end;
         except
           On E: Exception do
            begin
             ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
             if MessageDlg('Cód.Erro :'+inttostr(ErrCode)+'
Formulário :'+Formulario.name+'   Mensagem:  '+E.Message+#13+#10+
                           'Deseja tentar se Re-conectar novamente ao
Banco de Dados ?', mtConfirmation, [mbYes,MbNo], 0) = mrNo then
               begin
                Break;
               end;
            end;
         end;
        end;
        if AConected = false then
         Application.Terminate;
      end;
  end;
{$I+}
end;
Link para o comentário
Compartilhar em outros sites

Fiz assim . agora deu certo . ainda nao tive problemas . caso alguem tenha algo a sugerir agradeco.

procedure TSISHandleException.AppException(Sender:TObject; E:Exception);
var
 Log: TextFile;
 ErrCode,i,x,y :integer;
 AConected :boolean;
 ASource: TComponent;
 Formulario :TForm;
 IdentificadorQuery:tstringlist ;
 IdentificadorForm:tstringlist ;
begin
{$I-}
 try
  IdentificadorQuery := TStringList.Create;
  identificadorQuery.Clear ;
  IdentificadorForm := TStringList.Create;
  identificadorForm.Clear ;

 if TComponent(sender) is TForm then      //---Pegar ...  MENU01.Active
  Formulario := TForm(sender)
 else
  Formulario := TForm(TComponent(sender).Owner) ;

 AConected := false;
 if E is EDBEngineError then
  begin

    ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;

     if ErrCode = 13059 then // --> 'Erro não Foi possivel Conectar com o Host'
      begin
       while not AConected do
        begin
         try
           //===> reconectando ............
           for x := 0 to DM.DATABASE.DataSetCount-1 do
            begin
              ShowMessage(dm.DATABASE.DataSets[x].Name+'    pai'+dm.DATABASE.DataSets[x].Owner.Name);
              identificadorQuery.Add(dm.DATABASE.DataSets[x].Name);
              identificadorForm.Add(dm.DATABASE.DataSets[x].Owner.Name);
            end;

           DM.DATABASE.Connected := false ;
           DM.DATABASE.Connected := true  ;
           AConected := true;

           for i := 0 to Application.ComponentCount-1 do
            if Application.Components[i] is TForm then
             for y := 0 to TForm(Application.Components[i]).ComponentCount-1 do
              if TForm(Application.Components[i]).Components[y] is TQuery then //ShowMessage(TForm(Application.Components[i]).Components[y].Name);
                for x := 0 to identificadorQuery.Count-1 do
                 if (TForm(Application.Components[i]).Components[y].Name = identificadorQuery[x]) and (TForm(Application.Components[i]).Components[y].Owner.Name = identificadorForm[x]) then //ShowMessage(identificadorForm[x]+'.'+identificadorQuery[x]);
                  TQuery(TForm(Application.Components[i]).Components[y]).Open;

         except

           On E: Exception do
            begin
             ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
             if MessageDlg('Cód.Erro :'+inttostr(ErrCode)+' Formulário :'+Formulario.name+'   Mensagem:  '+E.Message+#13+#10+
                           'Deseja tentar se Re-conectar novamente ao Banco de Dados ?', mtConfirmation, [mbYes,MbNo], 0) = mrNo then
               begin
                Break;
               end;
            end;
         end;
        end;// while ;;;;

        if AConected = false then
         Application.Terminate;

      end;
  end;

 finally
  identificadorquery.Free ;
  identificadorform.Free;
 end;


{$I+}
end;
Link para o comentário
Compartilhar em outros sites

Fiz mais uma alteração , caso alguem tenha algo a sugerir agradeco.

 

Adilson .

procedure TSISHandleException.AppException(Sender:TObject;
E:Exception);
var
 Log: TextFile;
 ErrCode,i,x,y :integer;
 AConected :boolean;
 ASource: TComponent;
 Formulario :TForm;
 IdentificadorQuery:tstringlist ;
 IdentificadorForm:tstringlist ;
begin
{$I-}
 try
  IdentificadorQuery := TStringList.Create;
  identificadorQuery.Clear ;
  IdentificadorForm := TStringList.Create;
  identificadorForm.Clear ;
 if TComponent(sender) is TForm then      //---Pegar ...
MENU01.Active
  Formulario := TForm(sender)
 else
  Formulario := TForm(TComponent(sender).Owner) ;
 AConected := false;
 if E is EDBEngineError then
  begin
    ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
     if ErrCode = 13059 then // --> 'Erro não Foi possivel Conectar
com o Host'
      begin
       while not AConected do
        begin
         try
           //===> reconectando ............
           for x := 0 to DM.DATABASE.DataSetCount-1 do
            begin
              identificadorQuery.Add(dm.DATABASE.DataSets[x].Name);
identificadorForm.Add(dm.DATABASE.DataSets[x].Owner.Name);
            end;
           DM.DATABASE.Connected := false ;
           DM.DATABASE.Connected := true  ;
           AConected := true;
           for i := 0 to Application.ComponentCount-1 do
            if (Application.Components[i] is TForm) then
             begin
              for y := 0 to
TForm(Application.Components[i]).ComponentCount-1 do
               if TForm(Application.Components[i]).Components[y] is
TQuery then
                 for x := 0 to identificadorQuery.Count-1 do
                  if
(TForm(Application.Components[i]).Components[y].Name =
identificadorQuery[x]) and
(TForm(Application.Components[i]).Components[y].Owner.Name =
identificadorForm[x]) then
TQuery(TForm(Application.Components[i]).Components[y]).Open;
             end
             else
             if (Application.Components[i] is TDataModule) then
              begin
              for y := 0 to
TDataModule(Application.Components[i]).ComponentCount-1 do
               if TDataModule(Application.Components[i]).Components[y]
is TQuery then
                for x := 0 to identificadorQuery.Count-1 do
                 if
(TDataModule(Application.Components[i]).Components[y].Name =
identificadorQuery[x]) and
(TDataModule(Application.Components[i]).Components[y].Owner.Name =
identificadorForm[x]) then //ShowMessage(identificadorForm[x]
+'.'+identificadorQuery[x]);
TQuery(TDataModule(Application.Components[i]).Components[y]).Open;
             end;
         except
           On E: Exception do
            begin
             ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
             if MessageDlg('Cód.Erro :'+inttostr(ErrCode)+'
Formulário :'+Formulario.name+'   Mensagem:  '+E.Message+#13+#10+
                           'Deseja tentar se Re-conectar novamente ao
Banco de Dados ?', mtConfirmation, [mbYes,MbNo], 0) = mrNo then
               begin
                Break;
               end;
            end;
         end;
        end;// while ;;;;
        if AConected = false then
         Application.Terminate;
      end;
  end;
 finally
  identificadorquery.Free ;
  identificadorform.Free;
 end;
{$I+}
end;
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Consultores

O layout do seu código está bem embolado. Você poderia ter usado a tag code. Ficaria mais fácil de fazer alguma sugestão.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

unit usisException;

interface

uses
 Forms, SysUtils , Messages , Classes , Dialogs , Controls , DB, DBTables;


type
 TSISHandleException = class
 private
  FLogFile: string;
  procedure AppException(Sender:TObject; E:Exception);
 public
  constructor Create;
 end;

implementation

uses MODULO;

 {Exception}

procedure TSISHandleException.AppException(Sender:TObject; E:Exception);
var
 Log: TextFile;
 ErrCode,i,x,y :integer;
 AConected :boolean;
 ASource: TComponent;
 Formulario :TForm;
 IdentificadorQuery:tstringlist ;
 IdentificadorForm:tstringlist ;
begin
{$I-}
 try
  IdentificadorQuery := TStringList.Create;
  identificadorQuery.Clear ;
  IdentificadorForm := TStringList.Create;
  identificadorForm.Clear ;

 
  AssignFile(Log, FLogFile);
  if FileExists(FLogFile) then
    Append(Log)
  else
    Rewrite(Log);
  try
    WriteLn(Log, 'Exception ocorrida em '+
      FormatDateTime('dd" de "mmmm" de "yyyy" às "hh:nn:ss', Now));
    WriteLn(Log,'-------------------------------------------------------------------');
    if TComponent(sender) is TForm then
    begin
      WriteLn(Log,'Form.................: '+ TForm(sender).Name);
      WriteLn(Log,'Caption do Form......: '+TForm(sender).Caption);
    end else
    begin
      WriteLn(Log,'Form.................: '+TForm(TComponent(sender).Owner).Name);
      WriteLn(Log,'Caption do Form......: '+TForm(TComponent(sender).Owner).Caption);
    end;
    WriteLn(Log,'-------------------------------------------------------------------');
    WriteLn(Log,'Classe da Exception..: '+E.ClassName);
    WriteLn(Log,'Mensagem da Exception: '+E.Message);
    if E is EDBEngineError then
    WriteLn(Log,'Erro : '+inttostr((E as EDBEngineError).Errors[0].ErrorCode));
    WriteLn(Log,'');
   // ShowMessage(E.Message);
  finally
    CloseFile(Log);
  end;


 //===== TRATAMENTO
 if TComponent(sender) is TForm then      //---Pegar ...  MENU01.Active
  Formulario := TForm(sender)
 else
  Formulario := TForm(TComponent(sender).Owner) ;

 AConected := false;
 if E is EDBEngineError then
  begin

    ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;

     if ErrCode = 13059 then // --> 'Erro não Foi possivel Conectar com o Host'
      begin
       while not AConected do
        begin
         try
           //===> reconectando ............
           for x := 0 to DM.DATABASE.DataSetCount-1 do
            begin
              //ShowMessage(dm.DATABASE.DataSets[x].Owner.Name+'.'+dm.DATABASE.DataSets[x].Name);
              identificadorQuery.Add(dm.DATABASE.DataSets[x].Name);
              identificadorForm.Add(dm.DATABASE.DataSets[x].Owner.Name);
            end;

           DM.DATABASE.Connected := false ;
           DM.DATABASE.Connected := true  ;
           AConected := true;

           for i := 0 to Application.ComponentCount-1 do
            if (Application.Components[i] is TForm) then
             begin
              //ShowMessage(TForm(Application.Components[i]).Name);
              for y := 0 to TForm(Application.Components[i]).ComponentCount-1 do
               if TForm(Application.Components[i]).Components[y] is TQuery then //ShowMessage(TForm(Application.Components[i]).Components[y].Name);
                 for x := 0 to identificadorQuery.Count-1 do
                  if (TForm(Application.Components[i]).Components[y].Name = identificadorQuery[x]) and (TForm(Application.Components[i]).Components[y].Owner.Name = identificadorForm[x]) then //ShowMessage(identificadorForm[x]+'.'+identificadorQuery[x]);
                   begin
                     //ShowMessage(TForm(Application.Components[i]).Components[y].Owner.Name+'.'+TForm(Application.Components[i]).Components[y].Name);
                     TQuery(TForm(Application.Components[i]).Components[y]).Open;
                   end;
             end//se existe formulario ...
             else
            if (Application.Components[i] is TDataModule) then
             begin
              //ShowMessage(TDataModule(Application.Components[i]).Name);
              for y := 0 to TDataModule(Application.Components[i]).ComponentCount-1 do
               if TDataModule(Application.Components[i]).Components[y] is TQuery then //ShowMessage(TDataModule(Application.Components[i]).Components[y].Name);
                 for x := 0 to identificadorQuery.Count-1 do
                  if (TDataModule(Application.Components[i]).Components[y].Name = identificadorQuery[x]) and (TDataModule(Application.Components[i]).Components[y].Owner.Name = identificadorForm[x]) then //ShowMessage(identificadorForm[x]+'.'+identificadorQuery[x]);
                   begin
                     //ShowMessage(TDataModule(Application.Components[i]).Components[y].Owner.Name+'.'+TDataModule(Application.Components[i]).Components[y].Name);
                     TQuery(TDataModule(Application.Components[i]).Components[y]).Open;
                   end;
             end;//se existe formulario ...

         except

           On E: Exception do
            begin
             ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
             if MessageDlg('Cód.Erro :'+inttostr(ErrCode)+' Formulário :'+Formulario.name+'   Mensagem:  '+E.Message+#13+#10+
                           'Deseja tentar se Re-conectar novamente ao Banco de Dados ?', mtConfirmation, [mbYes,MbNo], 0) = mrNo then
               begin
                Break;
               end;
            end;
         end;
        end;// while ;;;;


        if AConected = false then
         Application.Terminate;

      end;
  end;

 finally
  identificadorquery.Free ;
  identificadorform.Free;
 end;


{$I+}
end;




constructor TSISHandleException.Create;
begin
 Application.OnException := AppException;
 FLogFile := ChangeFileExt(Paramstr(0),'_erro_bd.log');
end;

var
  SISExcetion: TSISHandleException;

initialization
 SISExcetion := TSISHandleException.Create;

finalization
  SISExcetion.Free;

end.

 

 

To usando assim , agora . e ta ate funcionando pra BDE por enquanto ... Como to passando pra ZEOS vou so ver qual a mensagem q aparece la pra trocar ai ..

Link para o comentário
Compartilhar em outros sites

  • Consultores

Visto que seu código parece estar funcionando, vou dar algumas sugestões. Veja o que acha. Depois de seu parecer, eu posso dar algum novo retorno. Já vou avisando que não tive muito tempo para analisar. :P

procedure TSISHandleException.AppException(Sender:TObject; E:Exception);
var
 Log: TextFile;
 ErrCode,i,x,y :integer;
 AConected :boolean;
 ASource: TComponent;
 Formulario :TForm;
 IdentificadorQuery:tstringlist ;
 IdentificadorForm:tstringlist ;
begin
{$I-}
  //Inicialização
  {Você não precisa fazer esse teste várias vezes como era feito já que vai inicializar a variável Formulario...}
 if TComponent(sender) is TForm then      //---Pegar ...  MENU01.Active
  Formulario := TForm(sender)
 else
  Formulario := TForm(TComponent(sender).Owner) ;

 //Faz Log.... 
 {Sugiro que passe essa parte do código que faz o log para uma procedure separada, talvez dentro desta mesma procedure}
  AssignFile(Log, FLogFile);
  if FileExists(FLogFile) then
    Append(Log)
  else
    Rewrite(Log);
  try
    WriteLn(Log, 'Exception ocorrida em '+
      FormatDateTime('dd" de "mmmm" de "yyyy" às "hh:nn:ss', Now));
    WriteLn(Log,'-------------------------------------------------------------------');
    WriteLn(Log,'Form.................: '+ Formulario.Name);
    WriteLn(Log,'Caption do Form......: '+ Formulario.Caption);
    WriteLn(Log,'-------------------------------------------------------------------');
    WriteLn(Log,'Classe da Exception..: '+E.ClassName);
    WriteLn(Log,'Mensagem da Exception: '+E.Message);
    if E is EDBEngineError then
    WriteLn(Log,'Erro : '+inttostr((E as EDBEngineError).Errors[0].ErrorCode));
    WriteLn(Log,'');
   // ShowMessage(E.Message);
  finally
    CloseFile(Log);
  end;
  //...Log do Exception terminado.

  //A criação de objetos normalmente fica do lado de fora do bloco Try Finally.
  IdentificadorQuery := TStringList.Create;
  IdentificadorForm := TStringList.Create;

 try //Esse try não precisa englobar a primeira parte do código pois ele é apenas para os stringlists IndentificadorQyery e IndentificadorForm
  //Esses objetos acabaram de ser criados, então, normalmente, não precisam ser "limpos".
  //identificadorQuery.Clear ; 
  //identificadorForm.Clear ;


 //===== TRATAMENTO
 if E is EDBEngineError then
  begin
    AConected := false; {Inicialize a variável apenas quando for necessário, o mais próximo possível do uso. Você não precisaria usá-la se a condição no if logo acima fosse falsa. Então aqui é o melhor lugar}
 
    ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;

     if ErrCode = 13059 then // --> 'Erro não Foi possivel Conectar com o Host'
      begin
       while not AConected do
        begin
         try
           //===> reconectando ............
           for x := 0 to DM.DATABASE.DataSetCount-1 do
            begin
              //ShowMessage(dm.DATABASE.DataSets[x].Owner.Name+'.'+dm.DATABASE.DataSets[x].Name);
              identificadorQuery.Add(dm.DATABASE.DataSets[x].Name);
              identificadorForm.Add(dm.DATABASE.DataSets[x].Owner.Name);
            end;

           DM.DATABASE.Connected := false ;
           DM.DATABASE.Connected := true  ;
           AConected := true;
			
           {Estude a possibilidade de usar TScreen.Forms ou TScreen.CustomForms para pegar a lista dos forms exibidos atualmente pelo aplicativo.}
           for i := 0 to Application.ComponentCount-1 do
            if (Application.Components[i] is TForm) then
             begin
              //ShowMessage(TForm(Application.Components[i]).Name);
              for y := 0 to TForm(Application.Components[i]).ComponentCount-1 do
               if TForm(Application.Components[i]).Components[y] is TQuery then //ShowMessage(TForm(Application.Components[i]).Components[y].Name);
                 for x := 0 to identificadorQuery.Count-1 do
                  if (TForm(Application.Components[i]).Components[y].Name = identificadorQuery[x]) and (TForm(Application.Components[i]).Components[y].Owner.Name = identificadorForm[x]) then //ShowMessage(identificadorForm[x]+'.'+identificadorQuery[x]);
                   begin
                     //ShowMessage(TForm(Application.Components[i]).Components[y].Owner.Name+'.'+TForm(Application.Components[i]).Components[y].Name);
                     TQuery(TForm(Application.Components[i]).Components[y]).Open;
                   end;
             end//se existe formulario ...
             else
			{Visto que você ligou todos os TQuerys dos forms existentes, você precisa mesmo percorrer os datamodules um por um para encontrar os TQuerys e abri-los?}
            if (Application.Components[i] is TDataModule) then
             begin
              //ShowMessage(TDataModule(Application.Components[i]).Name);
              for y := 0 to TDataModule(Application.Components[i]).ComponentCount-1 do
               if TDataModule(Application.Components[i]).Components[y] is TQuery then //ShowMessage(TDataModule(Application.Components[i]).Components[y].Name);
                 for x := 0 to identificadorQuery.Count-1 do
                  if (TDataModule(Application.Components[i]).Components[y].Name = identificadorQuery[x]) and (TDataModule(Application.Components[i]).Components[y].Owner.Name = identificadorForm[x]) then //ShowMessage(identificadorForm[x]+'.'+identificadorQuery[x]);
                   begin
                     //ShowMessage(TDataModule(Application.Components[i]).Components[y].Owner.Name+'.'+TDataModule(Application.Components[i]).Components[y].Name);
                     TQuery(TDataModule(Application.Components[i]).Components[y]).Open;
                   end;
             end;//se existe formulario ...

         except

           On E: Exception do
            begin
             ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
             if MessageDlg('Cód.Erro :'+inttostr(ErrCode)+' Formulário :'+Formulario.name+'   Mensagem:  '+E.Message+#13+#10+
                           'Deseja tentar se Re-conectar novamente ao Banco de Dados ?', mtConfirmation, [mbYes,MbNo], 0) = mrNo then
               begin
                Break;
               end;
            end;
         end;
        end;// while ;;;;


        if AConected = false then
         Application.Terminate;

      end;
  end;

 finally
  identificadorquery.Free ;
  identificadorform.Free;
 end;


{$I+}
end;

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...
  • Consultores

Troque pela classe Exception correta...

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Interessante o post, só para complementar...

 

No FireDAC existe a procedure ADConnectionRecover onde pode-se passar a ação "AAction := faRetry" para recuperar a conexão.

Utilizo esse recurso em um banco de dados MySQL conectado na web e funciona muito bem.

procedure TForm.ADConnectionRecover(ASender: TObject;
  const AInitiator: IADStanObject; AException: Exception;
  var AAction: TADPhysConnectionRecoverAction);
begin
  AAction:=faRetry
end;
Editado por Leonardo Gregianin
  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 8 anos depois...
Em 18/06/2015 at 15:17, Leonardo Gregianin disse:

Interessante o post, só para complementar...

 

No FireDAC existe a procedure ADConnectionRecover onde pode-se passar a ação "AAction := faRetry" para recuperar a conexão.

Utilizo esse recurso em um banco de dados MySQL conectado na web e funciona muito bem.

procedure TForm.ADConnectionRecover(ASender: TObject;
  const AInitiator: IADStanObject; AException: Exception;
  var AAction: TADPhysConnectionRecoverAction);
begin
  AAction:=faRetry
end;

Só pre deixar registrado aqui .. Em conexões com ambientes de rede instável 

é um perigo usar o Faretry quando a conexão cai dentro de uma transação em uma procedure que utiliza um while com  TDQUERY.EOF , segundo o manual do firedac algumas operações são descartadas..

Exemplo.. Se uma transação em andamento sofre uma queda de conexão.. Quando a conexão é recuperada as operações que foram feitas antes da queda de conexão são descartadas.. 

   Exemplo pratico.. Ao finalizar uma venda, conexão cai no meio do processo bem no meio do processamento de estoque , vários itens dessa venda não serão processados , alguns baixando estoque outros não..

  Talvez a melhor solução é trocar o While not tfdquery.eof pelo for.. Ainda não testei , mas estarei realizando testes

image.thumb.png.bb03c57d2e46f92f9efb2776aa0346db.png

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 207 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.