Série da semana: Primeiros passos no Angular

Veja mais

Como limpar cache do CLientDataSet do Delphi?

16/05/2019

5

Ola pessoal,
Estou usando um servidor firebird 2.5 com Delphi 10.2. Estou usando o seguinte Loop


procedure p_portico_inicial_esforcos_db;
begin
DMDados.cdsBDPortico_Inicial.First;
while not DMDados.cdsBDPortico_Inicial.Eof do
begin
if not (DMDados.cdsBDPInicial_Des.State = dsInsert) then
DMDados.cdsBDPInicial_Des.Insert;
DMDados.cdsBDPInicial_Des.Fields[0].AsInteger := DMDados.cdsBDPortico_Inicial.Fields[0].AsInteger;
DMDados.cdsBDPInicial_Des.Fields[1].AsInteger := DMDados.cdsBDPortico_Inicial.Fields[1].AsInteger;
try
DMDados.cdsBDPInicial_Des.ApplyUpdates(0);
except
MessageDlg('Não foi possível apagar tabelas',mtError,[mbOK],0);
abort
end;
DMDados.cdsBDPortico_Inicial.Next;
end;
end;

Antes de rodar essa procedure eu faço o mesmo loop em outra procedure. Acontece que quando uso o Loop pela segunda vez meu while percorre todos meus registros volta pro inicio percorre novamente os registro e só então finaliza. Aparentemente meu while esta percorrendo os dados na memoria cache do meu ClientDataSet.

Eu consegui resolver isso dando um CLose no data set e depois um Open. Tem um uma maneira mais eficiente de resolver esse problema?
Responder

Posts

20/05/2019

Renato Dias

Fala Johnny! Para limpar o cache em memória de um ClientDataSet é só usar EmptyDataSet.
Responder

20/05/2019

Johnny

Fala Johnny! Para limpar o cache em memória de um ClientDataSet é só usar EmptyDataSet.


Obrigado pela dica Renato! Eu tentei isso, mas no momento que uso novamente minha procedure me dá erro de Index. Eu vi em outro lugar que pra usar esse comando que você citou teria que fazer algo assim:

ClientDataSet.EmptyDataSet
ClientDataSet.Close
ClientDataSet.Open

Não sei se ficar abrindo e fechando os ClientDataSet gera algum problema...
Responder