Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-09-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
DbExpress - Transacciones - más de un clientDataSet

Hola foro !!!
Estoy trabajando con D7, PostgreSql y utilizo dbexpress.
Quisiera saber como trabajan uds. cuando tienen varios clientDataSet y desean que todos o ninguno se actualice.
Supongo que para esto se tienen que utilizar las transacciones. Lo que he hecho es lo siguiente:

var TD: TTransactionDesc;
begin
if not SqlConnection1.InTransaction then
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
SqlConnection1.StartTransaction(TD);
try
client1.ApplyUpdates(0);
client2.ApplyUpdates(0);
SqlConnection1.Commit(TD);
except
SqlConnection1.Rollback(TD);
end;
end;
end;
Lo he probado y funciona !!! solo un detalle que no entiendo ... si el client1 está ok y el client2 está con error, el 'commit' es el que resuelve todo y no se actualiza ninguno de los 2 client. Es decir que nunca se ejecuta el RooBack pero igualmente no graba nada (ninguno de los 2 client).

Me gustaría que me aconsejen como suelen trabajar uds. cuando tienen que actualizar varios ClientDataSet con una misma transacción.

Gracias anticipada por la ayuda.
__________________
Carlos Marí
Responder Con Cita
  #2  
Antiguo 25-09-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

¿has probado a usar commitRetaining en vez del commit?

Saludos

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #3  
Antiguo 25-09-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
No he estado usando el CommitRetaining ya que según entiendo es para cuando se usa con componentes de IB. Yo estoy usando los componentes de dbexpress (SQLConnection, SQLDataSet, DataSetProvider y ClientDataSet).

Gracias por las ideas que puedan darme.
__________________
Carlos Marí
Responder Con Cita
  #4  
Antiguo 25-09-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola

En efecto el CommitRetaining es propio de Interbase/Firebird y solo se puede llamar desde componentes específicos para IB.

Tu código está bien, yo utilizo algo parecido. ¿ Porqué dices que no se ejecuta el RollBack ?. Si el ApplyUpdates del segundo ClientDataset falla, entonces entras en la sección except y se ejecuta el RoolBack.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 25-09-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 21
Julià T. Va por buen camino
El applyUpddates, no genera ningún error, si no que devuelve el numero de errores que se han producido

function applyupdates(...):integer;

por lo que si se quiere controlar en caso de erro se puede poner algo así

if client1.ApplyUpdates(0)+client2.ApplyUpdates(0)=0 then
SqlConnection1.Commit(TD);
else
SqlConnection1.Rollback(TD);
Responder Con Cita
  #6  
Antiguo 25-09-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
Marc, aunque no lo creas (yo tampoco lo podía creer) el código que antes escribí nunca entra en el rollback, aunque ocurra un error en uno de los client. Supongo que lo que dice Juliá tiene razón ... eso de que applyupdate no genera un error.

Lo interesante que luego de aplicarse los dos clientDataset (según mi ejemplo) y llegar a la línea donde está el commit no se realiza ningún commit a la base, es decir que de alguna manera detectó el error, pero no salió por el except
__________________
Carlos Marí
Responder Con Cita
  #7  
Antiguo 25-09-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 21
Julià T. Va por buen camino
puede que el commit no tenga efecto ninguno si el primer fallo está en el primer cambio que realizas en la base de datos.
El applyupdates(x) se para en el numero x de errores que tú le digas, si le pones 0, se parará en el primer error y el resto de cambios los ignorará, entonces el commit tan sólo realizará los cambios que haya permitido el applyupdates.
Responder Con Cita
  #8  
Antiguo 29-09-2003
carlosmari carlosmari is offline
Miembro
 
Registrado: jul 2003
Posts: 34
Poder: 0
carlosmari Va por buen camino
Gracias por la ayuda !!
__________________
Carlos Marí
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 09:21:11.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi