PDA

Ver la Versión Completa : Transacciones en Lazarus


PabloTech
15-07-2011, 04:42:03
Hola gente...

Les comento como tengo organizada mi aplicación y después cuál es mi problema.

Tengo un formulario principal que se encarga de abrir la conexión de la BD y de llamar a las otras ventanas para hacer las distintas operaciones. Además tengo un módulo de datos con los siguientes componentes:

*Un TODBCConnection,
*Un TSQLTransaction para transacciones de lectura y otro
*TSQLTransaction para transacciones de escritura.

Para las transacciones de lectura no tengo problema. Porque asocio un TSQLQuery a esa transacción y todos los SELECT funcionan casi de maravilla. Digo casi de maravilla porque hay algunas cosillas no puede hacer funciona pero no vienen al caso en este momento.

Los problemas se me presentan cuando quiero agrupar varias sentencias SQL en una sola transacción; y, si ocurriera algún error poder hacer vuelta atrás. Lo hice muchas veces en Delphi pero Lazarus no lo puedo hacer. mmm...

Quiero hacer algo como lo que sigue:
TransWrite.StartTransaction;
try
SQL.Text := 'INSERT INTO tabla_A (col1, col2) VALUES (1, 1)';
ExecSQL;
SQL.Text := 'UPDATE tabla_B SET col1 = 1 WHERE cond = 1';
ExecSQL;
TransWrite.Commit;
except
on e: Exception do
begin
TransWrite.Rollback;
Application.MessageBox(PChar('Error: ' + e.Message), 'Error', MB_ICONERROR);
end;
end;


Quiero pensar que se puede hacer así es que si alguin lo logró me cuenta... =D

Casimiro Notevi
15-07-2011, 09:56:09
¿Así no funciona?

PabloTech
17-07-2011, 06:55:22
Lamentablemente, así no funciona. Si ejecuto una sentencia sql con error durante la transacción, se invoca el rollback y termina la transacción; pero, no se hace una vuelta atrás de las sentencias que se ejecutaron hasta ese momento; sino que, quedan confirmadas. Quiero acotar que la base de datos está en Access. ¿Es posible que la programación de Lazarus esté incompleta? Es importante conocer este detalle, porque en este caso, es probable que genere muchas inconsistencias en producción; y sea muy difícil su mantenimiento. No quisiera migrar a otro motor de BD pues el sistema es sencillo.

Casimiro Notevi
17-07-2011, 09:39:48
Puede que el componente query que estás usando tengo una propiedad "autocommittransaction" o algo así, algunos lo traen, y seguramente está activo.