Fórum DBExpress TClientDataSet Transação #174352
11/08/2003
0
Try
clientdataset1.applyupdates;
clientdataset2.applyupdates;
sqlconnection.commit(TD);
except
sqlconnection.rollback(TD);
end;
Esse có digo quase funciona ... mas ainda tenho problemas, e sério, com ele.
Minha aplicação é WEB e eu não posso trabalhar com Cache em Disco. O maior problema q eu tenho é o seguinte.
Se o primeiro applyupdates der tudo certo e o segunde der erro, eu caio no except e dou Rollback, mas o problema é que o CLIENTDATASSET1.DELTA foi perdido, ou seja, quando eu tentar dara applyupdates denovo as alterações do primeiro clientdataset não vão para o servidor.
Com o BDE e UpdateSQL eu tinha um negocio que chamava commitupdates, servia basicamente para limpar o Cache, Ou seja eu podeia dar varios applyupdates e todos eles me mandavam minha instrução SQL, ela somente não era mais mandada quando eu desse um commitupdates.
Como eu faço para solucionar esse problema com DBExpress+ClientDataSet????
[]´s
Sousa_thiago
Curtir tópico
+ 0Posts
11/08/2003
Sousa_thiago
[]´s
Gostei + 0
12/08/2003
Sousa_thiago
Gostei + 0
12/08/2003
Sousa_thiago
Só relembrando eu não posso usar cache em disco pois meu sistema é WEB ...
:)
Gostei + 0
13/08/2003
Sousa_thiago
Gostei + 0
13/08/2003
Sousa_thiago
Gostei + 0
13/08/2003
Afarias
Em geral o método sugerido quando existem CDSs com uma relação mestre/detalhe é usar Nested Datasets.
Quando se tem uma relação M/D e não se deseja usar Nested DataSets *ou* queremos atualizar vários CDSs que não possuem relação M/D no contexto de uma transação --- uma solução é usar a unidade CDSUtil do pacote MIDESS:
http://sourceforge.net/projects/midess/
Baixe o pacote e dê uma olhada no exemplo na pasta CDSUtil.
T+
Gostei + 0
14/08/2003
Sousa_thiago
Já tinham me mandado esse UNIT CDSUtils mas ela não tinha exemplos e eu não concegui entender direito como ela fcuncionava.
Baixei ela já lá no Site q vc indicou e acho q é bem isso mesmo que estou precisando.
Só não entendi muito bem o que vc falou sobre os Provider´s se vc puder me falar mais alguma coisa sobre isso .. ou me indicar um lugar onde ler sobre isso eu agradeço tb ...
[]´s
Gostei + 0
14/08/2003
Afarias
|puder me falar mais alguma coisa sobre isso
Quando vc executa o ApplyUpdates o CDS envia seu Delta (alterações realizadas pelo usuário) para o DataSetProvider q automaticamente abre a transação, envia as alterações (do Delta) para o banco de dados e então, caso esteja tudo certo, efetua o commit. -- isto se a transação estiver fechada no início de tudo -- o DataSetProvider (ou simplesmente o Provider) cuida de tudo automaticamente.
|.. ou me indicar um lugar onde ler sobre isso eu agradeço tb ...
Algumas leituras recomendadas:
http://bdn.borland.com/article/0,1410,28876,00.html
http://bdn.borland.com/article/0,1410,20567,00.html
http://bdn.borland.com/article/0,1410,22571,00.html
http://bdn.borland.com/article/0,1410,20846,00.html
T+
Gostei + 0
14/08/2003
Sousa_thiago
Com certeza vou dar uma olhada nos artigos
[]´s
Gostei + 0
14/08/2003
Sousa_thiago
Lembrando que para essa minha applicação eu não estou fazendo tratamento do erro no Evento OnReconcileError. Se você for fazer esse tratamento a sua Procedure terá de ser pouca coisa diferente dessa.
Mas acho que essa ai tá valendo pra poder entender um pouquinho da lógica por traz do Cliente+Provider
O ´PLUS´ Dessa minha procedure é o seguinte: Se algum dos Client´s não for aplicado com sucesso, nenhum deles perde o Buffer (DELTA).
procedure TForm1.btnApply(Sender: TObject);
var
Error : Integer;
TD: TTransactionDesc;
VDelta1, vDelta2:OleVariant;
begin
SQLConnection1.StartTransaction(TD);
try
vDelta1 := ClientDataSet1.Delta;
vDelta2 := ClientDataSet2.Delta;
vDelta1 := Provider.ApplyUpdates(vDelta1,-1, Error);
if error >0 then
SysUtils.Abort;
vDelta2 := Provider.ApplyUpdates(vDelta2,-1, Error);
if error >0 then
SysUtils.Abort;
SQLConnection1.Commit(TD);
//Atializa o Delta
Client.Reconcile(vDelta1);
Client.Reconcile(vDelta2);
except
SQLConnection1.Rollback(TD);
end;
end;
[]´s
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)