Fórum Transações com ADOConn + ClientDataSet #131195
26/03/2010
0
Geralmente não utilizo ADO, mas estou usando ADO com conexão ODBC para o MySQL 5.1. Tudo funciona OK, exceto por um problema de Rollback vs ClientDataSet...
Tenho uma conexão ADO (ADOConn, e algumas Queries ligadas ao ADOCOnn, e nestas queries clientDataSets e tenho as seguintes operações em resumo:
open dos client data sets ....
....
teste de transação usando ADO:
try
ADOConn.BeginTrans;
//Deleta records, cds1.Delete;
cds2.Delete; //ApplyUpdates...
if cds1.ChangeCount > 0 then
if cds1.ApplyUpdates(0) <> 0 then //OK !!! Record foi deletado do client dataset e Apply passou
raise Exception.Create('Erro ....'); //Forço aqui um erro depois do primeiro ApplyUpdates para entrar no rollback de propósito raise Exception.Create('Erro para teste....'); //Força ir para except if cds2.ChangeCount > 0 then
if cds2.ApplyUpdates(0) <> 0 then raise Exception.Create('Erro ....');
//
ADOConn.CommitTrans; OK !!!
except
on E:Exception do
begin
ADOConn.RollbackTrans; OK !!! Continua tudo certinho no banco de dados ShowMessage(IntToStr(cds1.ChangeCount)); //Está com valor zero !? mas não devia ter revertido o Apply ? Estou tendo que restaurar o client data set de outra forma ...
//Reverte records dos client data sets
cds1.CancelUpdates; //Mas ==> Registro que foi deletado do CDS1 não volta no ClientDataset !?
ShowMessage(IntToStr(cds1.ChangeCount)); //Está com valor zero !? Exit;
end;
end; O rollback funciona certinho no Banco de dados, por causa do rollback, o registro do ClientDataSet1 que foi deletado não foi efetivado no banco de dados... OK Porém, o ClientDataSet1 não retorna o status do delete pendente !? Um jeito que tenho para resolver é fazendo o refresh novamente no client data set, e fazendo o delete novamente, mas isso é um bug ? Será que há algo errado ? Tenho a mesma situação em outro programa só que usando componentes Zeos, mas o client Data Set é restaurado e aqui não, trabalho com isso já faz um tempão... mas talvez eu não esteja vendo algo... Roberto
ADOConn.BeginTrans;
//Deleta records, cds1.Delete;
cds2.Delete; //ApplyUpdates...
if cds1.ChangeCount > 0 then
if cds1.ApplyUpdates(0) <> 0 then //OK !!! Record foi deletado do client dataset e Apply passou
raise Exception.Create('Erro ....'); //Forço aqui um erro depois do primeiro ApplyUpdates para entrar no rollback de propósito raise Exception.Create('Erro para teste....'); //Força ir para except if cds2.ChangeCount > 0 then
if cds2.ApplyUpdates(0) <> 0 then raise Exception.Create('Erro ....');
//
ADOConn.CommitTrans; OK !!!
except
on E:Exception do
begin
ADOConn.RollbackTrans; OK !!! Continua tudo certinho no banco de dados ShowMessage(IntToStr(cds1.ChangeCount)); //Está com valor zero !? mas não devia ter revertido o Apply ? Estou tendo que restaurar o client data set de outra forma ...
//Reverte records dos client data sets
cds1.CancelUpdates; //Mas ==> Registro que foi deletado do CDS1 não volta no ClientDataset !?
ShowMessage(IntToStr(cds1.ChangeCount)); //Está com valor zero !? Exit;
end;
end; O rollback funciona certinho no Banco de dados, por causa do rollback, o registro do ClientDataSet1 que foi deletado não foi efetivado no banco de dados... OK Porém, o ClientDataSet1 não retorna o status do delete pendente !? Um jeito que tenho para resolver é fazendo o refresh novamente no client data set, e fazendo o delete novamente, mas isso é um bug ? Será que há algo errado ? Tenho a mesma situação em outro programa só que usando componentes Zeos, mas o client Data Set é restaurado e aqui não, trabalho com isso já faz um tempão... mas talvez eu não esteja vendo algo... Roberto
Roberto Novakosky
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)