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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.