Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-12-2005
Avatar de FunBit
FunBit FunBit is offline
Miembro
 
Registrado: jun 2005
Ubicación: Santa Maria d'Oló
Posts: 572
Poder: 19
FunBit Va por buen camino
Transacción en tablas InnoDB

Buenos días,
trabajo con delphi 6 y DB MySQL con tablas tipo InnoDB.

Dentro de mi programa tengo un menu con los procedimientos:
Código Delphi [-]
//Abre la tabla
Create 
DS.tabla1.open;

Código Delphi [-]
//Realiza la transacción (Con el try-except y el RollBack)
Transaccion
DS.tabla1.SQL.Clear;
DS.tabla1.SQL.Add('start transaction');
DS.tabla1.Execute;
 
DS.tabla1.SQL.Clear;
DS.tabla1.SQL.Add('UPDATE tabla1 SET');
DS.tabla1.SQL.Add('Campo='+DatoString);
DS.table1.SQL.Add('WHERE Campo='+CondicionStr);
DS.table1.Execute;
 
DS.tabla1.SQL.Clear;
DS.tabla1.SQL.Add('commit');
DS.tabla1.Execute;

Código Delphi [-]
//Cierra las tablas
Close
DS.tabla1.close;

El problema es que la primera vez que ejecuto el menu va perfecto, pero la segunda vez (en la misama ejecución del programa base) me lanza una exepcion EDataBaseError: Query must return exactly result set - use Execute.

Nota: Si ejecuto el menu, pero no hago ninguna modificación de los datos, funciona correctamente.

Resumen evolución de la ejecución del programa:

Caso 1:
Ejecucion Programa general
Abrir tablas (Abrir menu)
Transacción tablas (Modificar datos)
Cerrar tablas (Cerrar menu)
Abrir tablas (Abrir menu) -> Error!!

Caso 2:
Ejecucion Programa general
Abrir tablas (Abrir menu)
Cerrar tablas (Cerrar menu sin modificar)
Abrir tablas (Abrir menu) -> OK!!

Espero haberme explicado bien. Gracias de antemano por su atención y ayuda!
Saludos!
__________________
Brot Psicòtik
Responder Con Cita
  #2  
Antiguo 02-01-2006
Avatar de FunBit
FunBit FunBit is offline
Miembro
 
Registrado: jun 2005
Ubicación: Santa Maria d'Oló
Posts: 572
Poder: 19
FunBit Va por buen camino
Ya he solucionado mi problema. Pongo el código final para que sirva de ayuda si alguien lo necesita.

Código Delphi [-]
    try

      //Preparamos la transacción
      DataSet.SQL.Clear;
      DataSet.SQL.Add('SET AUTOCOMMIT = 0');
      DataSet.Execute;

      //Inicializamos la transacción
      DataSet.SQL.Clear;
      DataSet.SQL.Add('start transaction');
      DataSet.Execute;

      //Seleccionamos el registro a modificar con propiedades correctas
      DataSet.SQL.Clear;
      DataSet.SQL.Add('SELECT * FROM tabla LOCK IN SHARE MODE');
      DataSet.Execute;

      //Actualizamos los datos del campo correspondiente
      DataSet.SQL.Clear;
      DataSet.SQL.Add('UPDATE tabla SET');
      DataSet.SQL.Add('campoDB=datosAct');
      DataSet.SQL.Add('WHERE condicion<>0');
      DataSet.Execute;

      //Finalizamos la transacción
      DataSet.SQL.Clear;
      DataSet.SQL.Add('commit');
      DataSet.Execute;

      //Restauramos las propiedades originales
      DataSet.SQL.Clear;
      DataSet.SQL.Add('SET AUTOCOMMIT = 1');
      DataSet.Execute;

    except

      on E: Exception do begin
        //Deshacemos los pasos de la transacción
        DataSet.SQL.Clear;
        DataSet.SQL.Add('RollBack');
        DataSet.Execute;

      end;

    end;
Si alguien ve alguna "irregularidad" en el código agradeceré cualquier comentario u opinión.

Un saludo!!!
__________________
Brot Psicòtik

Última edición por FunBit fecha: 02-01-2006 a las 17:29:30.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 22:21:53.


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