Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-11-2007
Mfi Mfi is offline
Miembro
 
Registrado: may 2007
Posts: 16
Poder: 0
Mfi Va por buen camino
Error "Transaction is not Active"

Bueno, estoy haciendo un procedimiento que verifica la versión de la base de datos (almacenada en un registro de la tabla IbTableInfo) y que si no es la versión mas reciente la actualiza mediante scripts. El caso es que todo funciona bien hasta que voy a cambiar el registro de la base de datos para decirle que ya es la nueva version, al hacer el post me salta una excepcion de "Transaction is not active" y si hago un Transaction.StartTransaction me salta "Transaction is active" ...
Código Delphi [-]
 begin
    //DataModule2.IBMgDB.CloseDataSets;
    DataModule2.IbScript1.Script.Clear;
    //sacamos la versión actual de la Base de DAtos
    try
    IbTableInfo.Active:=true;
    version:=strtofloat(IbtableInfo.FieldByName('VERSIONDB').AsString);
    except
      version:=0;
    end;
    //Si hace falta actualizar se procede.
    showmessage(ultimaversion());
    if (version < strtofloat(UltimaVersion())) then
    begin
      //Cargamos el script para actualizar la BD
      DataModule2.IBScript1.Script.Text := LeerScript('BDS'+floattostr(version));
      showmessage (DataModule2.IBScript1.Script.Text);
      if (DataModule2.IbScript1.ValidateScript) then
        begin
        //DataModule2.IbScript1.ExecuteScript;
        showmessage ('Script Ejecutado');
        IBMgDB.Close;
        IBMgDB.Open;
        IBTableInfo.open;
        IBTableInfo.Transaction.CommitRetaining;
        IBTableInfo.Edit;
        IBTableInfo.FieldByName('VERSIONDB').value:=sigVersion(floattostr(version));
        IBTableInfo.Post;
        IBTableInfo.Transaction.commitretaining;
        showmessage(IBTableInfo.FieldByName('VERSIONDB').AsString);
        end else ShowMessage ('El escript no es válido, se cancela la Actualización.');
    end;
    end;

como podeis ver en el código cierro la base de datos y la abro, he puesto algunos showmessage para ir controlando lo que se ejecutay he desactivado la linea que hace la actualización propiamente dicha solo para intentar localizar este error, pero nada.. al hacer el post me salta la excepcion.

La transaccion la tengo configurada con la base de datos y puesta como transaccion por defecto en la IbTableInfo, esa transaccion no se usa para nada mas. EStá como saCommitRetaining y como TACommit y el autostart a true, en propiedades read commited...

Gracias por anticipado.
Responder Con Cita
  #2  
Antiguo 19-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
El IBScript ¿tiene asignado el Transaction?

Yo usaría este código:
Código Delphi [-]
if Datamodule.Transaction.Intransaction then
  Datamodule.Transaction.Commit;

Datamodule.Transaction.StartTransaction;
        IBTableInfo.Edit;
      IBTableInfo.FieldByName('VERSIONDB').value:=sigVersion(floattostr(version));
        IBTableInfo.Post;
if Datamodule.Transaction.Intransaction then
  Datamodule.Transaction.Commit;

No es un código optimizado, pero si es muy seguro en cuanto a transacciones activas.

Lo hago así, porque al hacer un post, puede que se haga un Commit en la transacción, (por el AutoCommit del TDatabase) o tu configuración

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 19-11-2007
Mfi Mfi is offline
Miembro
 
Registrado: may 2007
Posts: 16
Poder: 0
Mfi Va por buen camino
Talking

Pues muchas gracias.. ya está, si te soy sincero al ver tu respuesta pensé que no serviría, pues había probado practicamente lo mismo sin el if y el error me seguía dando en el post... peeeero.. he probado tu codigo al que he tenido que añadir un IbTableInfo.open; despues del transaction.StartTransaction y tatachaaaan!!!..

Por si a alguien le interesa mi codigo final ha quedado así, ni me molesto en depurar pues esta operación posiblemente se ejecute una vez al año con que funcione vale.
Código Delphi [-]
   if IbTransaction1.Intransaction then
              IbTransaction1.Commit;
        IbTransaction1.StartTransaction;    
        IBTableInfo.open;
        IBTableInfo.Edit;
        IBTableInfo.FieldByName('VERSIONDB').value:=sigVersion(floattostr(version));
        IBTableInfo.post;
        IBTableInfo.Transaction.commitretaining;
        showmessage(IBTableInfo.FieldByName('VERSIONDB').AsString);

Bueno.. muchisimas gracias otra vez
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Porque sale este error "Error al copiar archivo o carpeta"? JuanErasmo API de Windows 1 18-11-2009 17:24:49
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53
Error: Transaction is active Tauro78 Firebird e Interbase 1 09-02-2007 11:38:38
Error: "SQLConnection: there is no active transaction" jmlifi Conexión con bases de datos 3 26-06-2006 18:11:23
"Transaction not assigned error" T-man Firebird e Interbase 0 15-10-2004 13:16:14


La franja horaria es GMT +2. Ahora son las 21:46:13.


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