Ir para conteúdo
  • Cadastre-se

dev botao

Problemas para editar registro usando Firedac.


Ver Solução Respondido por Helder Lúcio Dias,
  • Este tópico foi criado há 582 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Solution

Boa noite,

Criei uma aplicação utilizando o Firedac para conectar ao banco de dados MySql hospedado no Godady.
Utilizo os componentes tFDFConnection, tFDQuery, TDataSource.

Criei uma base de pessoas, faço a pesquisa, retorno num DBGrid. Seleciono um determinado registro, abro uma query específica para a edição. 

Eu tenho no máximo 60 segundos para salvar o registro em edição. Se levar mais tempo o sistema retorna o erro "class ezsqlexception with message 'sql error: Lost connection to mysql server during query'".


Vi um questionamento semelhante respondido por Marcelo Calvi Belanga, 1 Julho, 2019. 
"https://www.projetoacbr.com.br/forum/topic/52214-conex%C3%A3o-firedac-mysql-na-web/#comment-343686"
Só que a resposta no site
http://docwiki.embarcadero.com/RADStudio/Rio/en/Recovering_Connection_(FireDAC)
Não está disponível.

Agradeço a ajuda.
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

@Helder Lúcio Dias

Boa tarde.

Por mais que conexão direta não seja a indicada, eu estou testando para uma pequena aplicação o SaveInCloud com Firebird.

Eu tive o mesmo problema de desconexão depois de um tempo ocioso.

Então eu crie uma thread na mesma conexão para a cada XXX minutos, seja executada um select simples na base.

Desta forma a conexão não cai.

Veja se isso te ajuda.

Link para o comentário
Compartilhar em outros sites

  • Moderadores
1 hora atrás, Marcelo Calvi Belanga disse:

@Helder Lúcio Dias

Boa tarde.

Por mais que conexão direta não seja a indicada, eu estou testando para uma pequena aplicação o SaveInCloud com Firebird.

Eu tive o mesmo problema de desconexão depois de um tempo ocioso.

Então eu crie uma thread na mesma conexão para a cada XXX minutos, seja executada um select simples na base.

Desta forma a conexão não cai.

Veja se isso te ajuda.

não faça isso. tu vai gastar banda de seu cliente e também questão de cpu, hd e memoria do seu servidor e seu cliente.

como dito anterior o correto é tu tem uma API

e se ainda assim tem que insistir o banco existe no firedac a situação pra tratar corretamente e no zeos também

pois notei que a primeira msg é via zeos e a outra via firedac

  • Curtir 1
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

Prezados Marcelo, Leandro e Juliomar,

Muito obrigado pelas dicas.

Helder.

......................................

Leandroaoa,
Funcionou.

......................................

Prezado Marcelo.

Não tinha utilizado as dicas do Leandroaoa [evento OnRecover (AAction := faRetry)] e 
[dm.fnn.ResourceOptions.AutoReconnect := true]. Depois delas 

Mesmo sem gostar, já tinha feito algumas tentativas que não funcionaram.
Dentro da ApplicationEvents00Exception primeiro tentei um ping. Não funcionou.
Depois estabeleci um timer de 40 segundos. Quando atingia, executei um select simples.
O select funcionava, mas não sensibilizou a conexão de edição.

Para contonar, fiz isso abaixo:

...
var
  vPsa :
    Record
      NR_PSA   : Integer;
      NM_PSA   : String;
      TX_TLFNE : String;
      {...}
    end;

begin

  vPsa.NR_PSA   := dm.qPSA_edit.FieldByName('NR_PSA').Value;
  vPsa.NM_PSA   := dm.qPSA_edit.FieldByName('NM_PSA').Value;
  vPsa.TX_TLFNE := dm.qPSA_edit.FieldByName('TX_TLFNE').Value;
  {...}

  dm.fnn.Connected := false;
  dm.fnn.Connected := true;

  dm.qPSA_edit.Close;
  dm.qPSA_edit.ParamByName( 'xNR_PSA' ).value :=   vPsa.NR_PSA;
  dm.qPSA_edit.Active := True;

  dm.qPSA_edit.Edit;
  dm.qPSA_edit.FieldByName('NR_PSA').Value := vPsa.NR_PSA;
  dm.qPSA_edit.FieldByName('NM_PSA').Value := vPsa.NM_PSA;
  dm.qPSA_edit.FieldByName('TX_TLFNE').Value := vPsa.TX_TLFNE;
  dm.qPSA_edit.Post;
...

Com a diga do Leandroaoa, não preciso usar esse recurso.

......................................

Juliomar,

É a primeira vez que iremos hospedar uma base em um ambiente remoto.
Há muito a aprender.

Helder.
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Moderadores
32 minutos atrás, Helder Lúcio Dias disse:

Prezados Marcelo, Leandro e Juliomar,

Muito obrigado pelas dicas.

Helder.

......................................

Leandroaoa,
Funcionou.

......................................

Prezado Marcelo.

Não tinha utilizado as dicas do Leandroaoa [evento OnRecover (AAction := faRetry)] e 
[dm.fnn.ResourceOptions.AutoReconnect := true]. Depois delas 

Mesmo sem gostar, já tinha feito algumas tentativas que não funcionaram.
Dentro da ApplicationEvents00Exception primeiro tentei um ping. Não funcionou.
Depois estabeleci um timer de 40 segundos. Quando atingia, executei um select simples.
O select funcionava, mas não sensibilizou a conexão de edição.

Para contonar, fiz isso abaixo:

...
var
  vPsa :
    Record
      NR_PSA   : Integer;
      NM_PSA   : String;
      TX_TLFNE : String;
      {...}
    end;

begin

  vPsa.NR_PSA   := dm.qPSA_edit.FieldByName('NR_PSA').Value;
  vPsa.NM_PSA   := dm.qPSA_edit.FieldByName('NM_PSA').Value;
  vPsa.TX_TLFNE := dm.qPSA_edit.FieldByName('TX_TLFNE').Value;
  {...}

  dm.fnn.Connected := false;
  dm.fnn.Connected := true;

  dm.qPSA_edit.Close;
  dm.qPSA_edit.ParamByName( 'xNR_PSA' ).value :=   vPsa.NR_PSA;
  dm.qPSA_edit.Active := True;

  dm.qPSA_edit.Edit;
  dm.qPSA_edit.FieldByName('NR_PSA').Value := vPsa.NR_PSA;
  dm.qPSA_edit.FieldByName('NM_PSA').Value := vPsa.NM_PSA;
  dm.qPSA_edit.FieldByName('TX_TLFNE').Value := vPsa.TX_TLFNE;
  dm.qPSA_edit.Post;
...

Com a diga do Leandroaoa, não preciso usar esse recurso.

......................................

Juliomar,

É a primeira vez que iremos hospedar uma base em um ambiente remoto.
Há muito a aprender.

Helder.
 

Então já faça de forma a vir lhe dar um caminho correto e menos custozo para sua aplicação , cliente, servidor e investimentos.

API será o caminho correto

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
Em 22/02/2022 at 15:50, Juliomar Marchetti disse:

não faça isso. tu vai gastar banda de seu cliente e também questão de cpu, hd e memoria do seu servidor e seu cliente.

como dito anterior o correto é tu tem uma API

e se ainda assim tem que insistir o banco existe no firedac a situação pra tratar corretamente e no zeos também

pois notei que a primeira msg é via zeos e a outra via firedac

Sem dúvida nenhuma Juliomar.... O mais correto é API mesmo.

Como já temos um ERP Desktop, vamos subir a base em nuvem (conexão direta) e ir migrando módulos para consumo da forma correta.

A intensão do SELECT simples, seria apenas para não perder conexão, mesmo sabendo do custo disso e apenas para teste.

Uma vez que o cliente não deve manter um registro sendo editado por muito tempo (mesmo com API), a solução correta é recuperar a conexão se ela cair.

Obrigado pela preocupação e dicas!

9 horas atrás, Helder Lúcio Dias disse:

Prezados Marcelo, Leandro e Juliomar,

Muito obrigado pelas dicas.

Helder.

......................................

Leandroaoa,
Funcionou.

......................................

Prezado Marcelo.

Não tinha utilizado as dicas do Leandroaoa [evento OnRecover (AAction := faRetry)] e 
[dm.fnn.ResourceOptions.AutoReconnect := true]. Depois delas 

Mesmo sem gostar, já tinha feito algumas tentativas que não funcionaram.
Dentro da ApplicationEvents00Exception primeiro tentei um ping. Não funcionou.
Depois estabeleci um timer de 40 segundos. Quando atingia, executei um select simples.
O select funcionava, mas não sensibilizou a conexão de edição.

Para contonar, fiz isso abaixo:

...
var
  vPsa :
    Record
      NR_PSA   : Integer;
      NM_PSA   : String;
      TX_TLFNE : String;
      {...}
    end;

begin

  vPsa.NR_PSA   := dm.qPSA_edit.FieldByName('NR_PSA').Value;
  vPsa.NM_PSA   := dm.qPSA_edit.FieldByName('NM_PSA').Value;
  vPsa.TX_TLFNE := dm.qPSA_edit.FieldByName('TX_TLFNE').Value;
  {...}

  dm.fnn.Connected := false;
  dm.fnn.Connected := true;

  dm.qPSA_edit.Close;
  dm.qPSA_edit.ParamByName( 'xNR_PSA' ).value :=   vPsa.NR_PSA;
  dm.qPSA_edit.Active := True;

  dm.qPSA_edit.Edit;
  dm.qPSA_edit.FieldByName('NR_PSA').Value := vPsa.NR_PSA;
  dm.qPSA_edit.FieldByName('NM_PSA').Value := vPsa.NM_PSA;
  dm.qPSA_edit.FieldByName('TX_TLFNE').Value := vPsa.TX_TLFNE;
  dm.qPSA_edit.Post;
...

Com a diga do Leandroaoa, não preciso usar esse recurso.

......................................

Juliomar,

É a primeira vez que iremos hospedar uma base em um ambiente remoto.
Há muito a aprender.

Helder.
 

Muito bom que deu certo Helder.

Como eu disse acima, fiz um teste em homologação apenas para não perder a conexão.

Mas o correto nesse cenário e isso mesmo.

Recuperar a conexão apenas se cair.

Link para o comentário
Compartilhar em outros sites

  • 5 meses depois ...
  • Este tópico foi criado há 582 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.