Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Transaction is active (https://www.clubdelphi.com/foros/showthread.php?t=86003)

Carmelo Cash 05-06-2014 00:23:40

Transaction is active
 
Hola foro:

He realizado con éxito una migración de base de datos de InterBase a Firebird.

Ahora estoy tratando de no utilizar más BDE para la conexión,

Para conectarme decidí utilizar TIBDatabase (lo nombré "DBConexion").
y un TIBTransaction enlazado (lo nombré "Administracion").

A continuación transcribo el código que utilizo "hasta ahora" para modificar datos utilizando transacciones.

Código Delphi [-]
begin
  D_Datos.Administracion.StartTransaction;
  Try
    qUpdate.ParamByName('P_ID_Operador').Value:=1;
    qUpdate.ExecSQL;
    D_Datos.Administracion.Commit;
  Except
    D_Datos.Administracion.Rollback;
    MessageDlg('Error');
    raise;
  end;
end;


en la línea D_Datos.Administracion.StartTransaction, da el error "Transaction is active"

Les recuerdo que "Administracion" es el componente TIBTransaction.

Bueno. Desde ya gracias por su atención.

Caminante 05-06-2014 00:42:41

Podrias poner

Código Delphi [-]
begin
if not D_Datos.Administracion.intransaction then
  D_Datos.Administracion.StartTransaction;
  Try
    qUpdate.ParamByName('P_ID_Operador').Value:=1;
    qUpdate.ExecSQL;
    D_Datos.Administracion.Commit;
  Except
    D_Datos.Administracion.Rollback;
    MessageDlg('Error');
    raise;
  end;
end;

Espero te sea util.

Saludos

Carmelo Cash 05-06-2014 02:26:51

Sí.
 
Gracias Caminante.
Funciona bien pero no entiendo cual es la razón, ya que funciona igual que si no coloo el .StartTransaction;. ¿? :confused:

o sea, esto tambien funciona:

Código Delphi [-]
begin
  Try
    qUpdate.ParamByName('P_ID_Operador').Value:=1;
    qUpdate.ExecSQL;
    D_Datos.Administracion.Commit;
  Except
    D_Datos.Administracion.Rollback;
    MessageDlg('Error');
    raise;
  end;
end;

Casimiro Noteví 05-06-2014 09:56:38

Porque ya tienes abierta una transacción desde que conectas a la BD

Carmelo Cash 07-06-2014 03:08:40

Resuelto
 
Gracias Casimiro y Caminante, aclaro como fue:

Si estoy conectado con BDE esto funciona bien

Código Delphi [-]
begin
  QueryConsulta.open;                Abro una consulta y luego comienzo la transacción

  D_Datos.Administracion.StartTransaction;
  Try
    qUpdate.ParamByName('P_ID_Operador').Value:=1;
    qUpdate.ExecSQL;
    D_Datos.Administracion.Commit;
  Except
    D_Datos.Administracion.Rollback;
    MessageDlg('Error');
    raise;
  end;
end;

Si estoy conectado con TIBDatabase esto No funciona bien

Código Delphi [-]
begin
  QueryConsulta.open;                Abro una consulta y aparentemente esto ya dispara un comienzo de transacción

  D_Datos.Administracion.StartTransaction;            Entonces esto da error
  Try
    qUpdate.ParamByName('P_ID_Operador').Value:=1;
    qUpdate.ExecSQL;
    D_Datos.Administracion.Commit;
  Except
    D_Datos.Administracion.Rollback;
    MessageDlg('Error');
    raise;
  end;
end;

Por lo tanto la solución propuesta por Caminante es correcta.
Eso es todo.
Saludos

ecfisa 07-06-2014 03:28:39

Cita:

Empezado por Carmelo Cash (Mensaje 477465)
....
Si estoy conectado con TIBDatabase esto No funciona bien
...

Hola Carmelo Cash.

En realidad puede funcionar bién o no dependiendo de el valor que tenga asignada la propiedad AutoStopAction del TIBTransaction. Aquella puede tomar los valores: saCommit, saCommitRetaining, saNone, saRollback y saRollbackRetaining.

Si la propiedad está en: saNone, saCommitRetaining o saRollbackRetaining la transacción no es finalizada por lo que no es necesario usar el método StartTransaction para volver a ejecutar el código.

Saludos :)

Carmelo Cash 09-06-2014 05:38:47

No funcionó
 
Hola Eficsa

Probé tu sugerencia de modifica la propiedad AutoStopAction del TIBTransaction, pero si no coloco

Código Delphi [-]
if not D_Datos.Administracion.intransaction then
  D_Datos.Administracion.StartTransaction;

Sigue apareciendo el error.. :(

ecfisa 09-06-2014 16:45:13

Hola Carmelo Cash.

No fuí claro en el mensaje anterior, no quise sugerir que no usaras lo que te propuso Caminante, eso es correctísimo ya que previene cualquier posibilidad de entrar al código con el estado Active en False. Es decir si el IBTransaction esta inactivo es necesario cambiar su estado para operar qualquier TDataSet vinculado a él.

Lo que quise mencionar es el comportamiento del TIBTransaction cuando no se explicita la acción mediante los métodos: Commit, CommitRetaining, Rollback o RollbackRetaining.
En ese caso el TIBTransaction usará la acción definida en la propiedad AutoStopAction cuando se cierre el último TDataSet asociado a esa transacción.

Saludos :)

Carmelo Cash 10-06-2014 01:44:25

Ok.
Gracias.


La franja horaria es GMT +2. Ahora son las 14:55:10.

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