PDA

Ver la Versión Completa : Uso de TZQuery y TZUpdateSQL


jrperezt
26-01-2009, 18:27:40
Estimados.

Estoy comenzando con MySql 5.1 y Zeosdbo 6.6.4, con Delphi2005.

Tengo MiQuery que hereda de TZQuery, con la propiedad CachedUpdates=True, le tengo asociada MiUpdQuery que hereda de TZUpdateSQL, con sus correspondientes metodos DeleteSql, InsertSQL y ModifySQL.

En el botón "Grabar" tengo el siguiente código:

MiQuery.Post;
if MiQuery.UpdatesPending then
MiQuery.ApplyUpdates;
MiQuery.CommitUpdates;

Pues bién, inserto y modifico correctamente, pero al salir de la aplicación y volver a entrar, los cambios se han perdido, no se ha guardado nada.

¿Que estoy haciendo mal?.

Muchisimas gracias de antemano.

jrperezt
27-01-2009, 10:59:39
Me respondo a mi mismo.

Pues, resulta que el problema estaba en el componente de conexion, ya que la propiedad AutoCommit, estaba a false, la he puesto a True y ha funcionado, y parace que el CommitUpdates no hace falta, es decir el código del botón "Grabar" lo he dejado de la siguiente manera:

MiQuery.Post;
if MiQuery.UpdatesPending then
MiQuery.ApplyUpdates;

Ahora se me presenta la siguiente duda:

Con el AutoCommit=True; en el componente de conexión, si actualizo varias tablas en un transacción y una de ellas falla, cuando haga Rollback, ¿Que pasa con las tablas ya actualidas en al misma transacción?.

En cuanto pueda probar esto, os comento los resultados.

jrperezt
27-01-2009, 16:02:05
Pues no hace Rollback correctamente.

Tengo el siguiente código:


if not DMConexionDB.ZConnection.InTransaction then
DMConexionDB.ZConnection.StartTransaction;
try
Post;
if TZQuery(Dataset).UpdatesPending then
TZQuery(Dataset).ApplyUpdates;

ProcedimientoConError; // Este procedimiento da un error forzado

DMConexionDB.ZConnection.Commit;
Result := True;
except
DMConexionDB.ZConnection.Rollback;
Result := False;
raise;
end; // Try/Except


Los cambios que se fijan en TZQuery(Dataset).ApplyUpdates, no se deshacen con el Rollback.


¿Que puede estar pasando?.

gasparsi
02-02-2009, 17:33:52
Cito lo que leí acerca de los RollBack:

"Los pasos para usar transacciones en MySQL son:

* Iniciar una transacción con el uso de la sentencia BEGIN.
* Actualizar, insertar o eliminar registros en la base de datos.
* Si se quieren los cambios a la base de datos, completar la transacción con el uso de la sentencia COMMIT. Únicamente cuando se procesa un COMMIT los cambios hechos por las consultas serán permanentes.
* Si sucede algún problema, podemos hacer uso de la sentencia ROLLBACK para cancelar los cambios que han sido realizados por las consultas que han sido ejecutadas hasta el momento."

fuente: http://www.webtaller.com/construccion/lenguajes/mysql/lecciones/transacciones-mysql-2.php

jrperezt
03-02-2009, 18:14:09
Hola gasparsi.

Gracias por el consejo, pero la implementación del BEGIN es lo que intento hacer en el siguiente código:

if not DMConexionDB.ZConnection.InTransaction then
DMConexionDB.ZConnection.StartTransaction; // Esto sería el begin