Ver Mensaje Individual
  #12  
Antiguo 07-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Reputación: 26
maeyanes Va por buen camino
Lo que sucede es que en realidad tengo creado un tipo de framework para trabajar con objetos en lugar de registros...

Entonces, en lugar de hacer DataSet.Post, en realidad hago algo como Objeto.Store, entonces, internamente el método mencionado hace el manejo de las transacciones...

Ahora, cuando quiero manejar inserciones masivas, vamos a decirle así, por ejemplo tipo master-detail, lo que hago es iniciar una transacción, realizar el ciclo de inserciones (Objeto.Store) y al final el Commit o Rollback dependiendo de si todo estuvo bien u ocurrió un error.

Mi código es más o menos ásí:

Código Delphi [-]
var
  Objeto: TObjetoFrameWork;

begin
  Connection.StartTransaction;
  try
    for I := 0 to ListaObjetos.Count - 1 do // ListaObjetos es un TList
    begin
      Objeto := TObjetoFrameWork(ListaObjetos[i]);
      repeat
        Stored := True;
        try
          Objeto.Store
        except
          on E: EIBInterBaseError do
          begin
            // Si existe DeadLock, cambio a False Stored para repetir la inserción...
            Stored := not E.SQLCode = -901; 
            if Stored then // Si Stored sigue siendo verdadero, la excepción fue otra y la relanzo...
              raise
          end
        end
      until
        Stored
    end;
    Connection.CommitTransaction
  except
    Connection.RollbackTransaction
  end
end;

Espero que con esto te aclare mejor las cosas...



Saludos...
Responder Con Cita