Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Duda de primaria..., ¿es posible y válida una estructura así? (https://www.clubdelphi.com/foros/showthread.php?t=87032)

TiammatMX 05-11-2014 20:02:27

Duda de primaria..., ¿es posible y válida una estructura así?
 
¡Hola!

De repente me surgió una duda de niño de 7 años..., ¿es posible y válida para Delphi una estructura de control como ésta?

Código Delphi [-]
try
   .
   .
   .
   for i := 0 to 'n' do
   begin
      .
      .
      .
      Insert TADOQuery;
   end;
   Commit;

except
   Rollback;
end;

El punto es que requiero añadir a una tabla una serie de datos tomados de una matriz en memoria, PERO EN CASO DE FALLA que todos los datos ingresados en la tabla SE REVIERTAN y la tabla quede como estaba antes de entrar a éste proceso...

duilioisola 05-11-2014 20:24:52

Solo tienes que explícitamente iniciar y finalizar la transacción.

Código Delphi [-]
procedure TDMMain.InsrtaElementos;
var
   Q: TSQLQuery;
   T: TDBXTransaction;
begin
   Q := TSQLQuery.Create(nil);
   with Q do
   begin
      try
         try
            T := BaseDeDatos.BeginTransaction;
            SQLConnection := BaseDeDatos;
            SQL.Text := 'INSERT INTO TABLA (???) VALUES (???)';
            for i := 0 To n do
            begin
               ParamByName('???').AsInteger := ???;
               ExecSQL;
            end;
            BaseDeDatos.CommitFreeAndNil(T);
         except
            BaseDeDatos.RollbackFreeAndNil(T);
         end;
      finally
         Free;
      end;
   end;
end;

TiammatMX 05-11-2014 20:36:49

Cita:

Empezado por duilioisola (Mensaje 484288)
Solo tienes que explícitamente iniciar y finalizar la transacción...

Por descontado que sí..., me interesaba mucho éste punto de "try...except" y el "for... to..." interno para generar mi inserción en la tabla de MS SQLServer 2008 R2.

Neftali [Germán.Estévez] 06-11-2014 13:15:13

Cita:

Empezado por tiammat (Mensaje 484287)
¡Hola!

De repente me surgió una duda de niño de 7 años..., ¿es posible y válida para Delphi una estructura de control como ésta?

Yo no le veo ningún problema.

Ñuño Martínez 11-11-2014 10:54:24

No sólo no debería haber problemas, como dice Neftali: Es que debería hacerse siempre así. Si no recuerdo mal, así se explica en "La Cara Oculta de Delphi", o quizá fue en otro libro.

La cuestión es que, si hay un error, entonces se debería "rollbackear" la transacción para evitar problemas ulteriores (corrupción de datos, actualizaciones incompletas, etc). El uso de "TRY .. EXCEPT .. END;" es, entonces, de uso obligado.

Otro tema es decidir dónde poner el bloque "TRY .. EXCEPT", si dentro o fuera del bucle. Supongo que depende de dónde haces el Committeo.

pacopenin 11-11-2014 14:08:06

Cita:

Empezado por Ñuño Martínez (Mensaje 484451)
No sólo no debería haber problemas, como dice Neftali: Es que debería hacerse siempre así. Si no recuerdo mal, así se explica en "La Cara Oculta de Delphi", o quizá fue en otro libro.
Committeo.

Totalmente de acuerdo.

mamcx 11-11-2014 14:14:10

Seria interesante saber porque te surgió la duda.

TiammatMX 11-11-2014 17:03:03

Cita:

Empezado por mamcx (Mensaje 484461)
Seria interesante saber porque te surgió la duda.

Por que tengo una función que es llamada en caso de agregarse un nuevo registro, y dentro de ésta función se añaden registros a otra tabla, una especie de bitácora.

Y de ahí, si todo es correcto, se le hace un "commit" a todos los registros recientemente añadidos, o en caso contrario, se revierte el proceso. Mi duda en concreto se centraba en que si la transacción TAMBIÉN abarcaba a los registros añadidos vía la función y los considera dentro del proceso del commit/rollback, y después de un tiempo corriendo para probarla, puedo decir que sí, los considera y los procesa como si estuviesen dentro del try mismo.

Gracias a todos por sus esclarecedoras respuestas.


La franja horaria es GMT +2. Ahora son las 11:30:50.

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