Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Uso de TZQuery y TZUpdateSQL (https://www.clubdelphi.com/foros/showthread.php?t=63023)

jrperezt 26-01-2009 18:27:40

Uso de TZQuery y TZUpdateSQL
 
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:

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

tal vez debes comensar con BEGIN
 
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/construccio...es-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:
Código:

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



La franja horaria es GMT +2. Ahora son las 09:50:03.

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