Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problema con ejecucion de consulta SQL por codigo (Firebird) (https://www.clubdelphi.com/foros/showthread.php?t=48991)

Cheerpipe 10-10-2007 04:01:38

Problema con ejecucion de consulta SQL por codigo (Firebird)
 
Bien, esto me esta rompiendo la cabeza, espero alguno de los maestros de aca me puedan ayudar :(

Tengo el siguiente codigo el cual es una funcion con el objetivo de insertar un registro en la DB.

Código Delphi [-]
var
  trnExecute: TIBTransaction;
  qryExecute: TIBQuery;
begin
  Result:=False;
  qryExecute:=TIBQuery.Create(nil);
  qryExecute.Database:=dbMain.dbMain;
  trnExecute:=TIBTransaction.Create(nil);
  trnExecute.DefaultDatabase:=dbMain.dbMain;
  qryExecute.Transaction:=trnExecute;
  trnExecute.Params.Clear;
  trnExecute.Params.Add('read_committed');
  trnExecute.Params.Add('rec_version');
  trnExecute.Params.Add('nowait');
  trnExecute.StartTransaction;
  qryExecute.SQL.Text:='INSERT INTO LOG_MAESTRO(ID_USUARIO,FECHA,FORMULARIO,HORA,ACCION,GUIA,OT,ID_CLIENTE,ID_CARTERO,CANTIDAD) VALUES(:ID_USUARIO,:FECHA,:FORMULARIO,:HORA,:ACCION,:GUIA,:OT,:ID_CLIENTE,:ID_CARTERO,:CANTIDAD)';

  with qryExecute do
  try
    trnExecute.StartTransaction;
    ParamByName('ID_USUARIO').value:=idUsuario;
    ParamByName('FORMULARIO').value:=formulario;
    ParamByName('FECHA').value:=date;
    ParamByName('ACCION').value:=accion;
    ParamByName('HORA').value:=time;
    ParamByName('GUIA').Value:=guia;
    ParamByName('OT').value:=ot;
    ParamByName('ID_CLIENTE').value:=idcliente;
    ParamByName('ID_CARTERO').value:=idcartero;
    ParamByName('CANTIDAD').Value:=cantidad;
    if not active then open;
    trnExecute.Commit;
    Result:=True;
  except
    trnExecute.Rollback;
  end;
  qryExecute.Free;
  trnExecute.Free;
end;

Creo la consulta y la transaccion, asigno los valores correspondientes a ambos, pero al momento de llegar a la linea

Código Delphi [-]
trnExecute.StartTransaction;


el programa me arroja los siguientes errores.

Código:

Project cprivados.exe raised exception class EIBClientError with message 'Cannot perform operation -- DB is not open'.
y

Código:

Project cprivados.exe raised exception class EIBClientError with message 'Transaction is not active'.
La verdad no se que puede ser he probado cambiando el orden de las lineas, he buscado codigos similares en internet y no veo que es lo que me falla.

Si alguien pudiese orientarme se lo agradeceria un monton.

PD: La base de datos se llama dbMain y esta en el modulo de datos dbMain. La conexion con la DB se realiza al momento de la creacion del modulo de datos, lo cual ocurre con el inicio de la aplicacion, por lo que la DB esta conectada permanentemente desde el inicio de la aplicacion.

Quizas este demas decir que todas las consultas que se hacen con componentes arrastrados desde la paleta de componentes funcionan bien, solo tengo problema con esta consulta con código.

pcicom 10-10-2007 04:31:27

Pues en el ERROR esta la Respuesta:

Te esta indicando que la BD no la tienes abierta, y obvio a raiz de eso pueden surgir mas ERRORES, te recomendaria que empieces a capturar los ERRORES cuando asi se ocupen

Código Delphi [-]
var
  qryExecute: TIBQuery;
  cSql : String;
begin
     Result:=False;

     try
         if not dbMain.dbMain.opened then 
            dbMain.dbMain.open;

         qryExecute:=TIBQuery.Create(nil);
         qryExecute.Database:=dbMain.dbMain;
         
          // Puedes INtentar construir la CLAUSULA SQL directo, y asi no te la complicaras con los PARAMETROS
          // ejemplo 
          cSql := 'INSERT INTO log_maestro (ID_USUARIO,FECHA,FORMULARIO ) VALUES (';
          cSql := cSql + inttostr(ID_USUARIO) +',';
          cSql := cSql + 'current_date,';
          csql := cSql + QuotedStr(FORMULARIO)+')';

          // Ya le agregaras tu los demas CAMPOS...
          // Loca campos Numericos los convertiras a String y los String usaras QuotedStr

          qryExecute.SQL.ADD(cSql);
          Try
               qryExecute.ExecSql;
               Result := True;
          except
               showmessage('error al ejecutar la clausula'+csql);
          end;

     except
         showmessage('No se ha abierto la BD');
         exit;
     end;

Cheerpipe 10-10-2007 18:05:20

Gracias por tu ayuda, la verdad no tenia idea que por codigo habia que abrir la db manualmente, de hecho en los codigos que vi en internet no aparecia esa linea.

Una pequeña acotacion, la propiedad opened no existe.

Aun me encuentro bajo el velo de la ignorancia, puesto que aunque con el agregar la linea .open ahora si me funciona pero. ¿Alguien podria explicarme porque es esa linea necesaria?

PD: Como todo lo que sube, tiene que bajar, asi mismo todo lo que se abre se tiene que cerrar xD (bueno, al menos eso supongo) por lo que al final de la funcion agregue la linea

Código Delphi [-]
dbMain.dbMain.close;

Ahora me va todo de maravilla, aunque aun no entiendo bien la mecanica del como funciona, mejor dicho, la diferencia entre hacerlo por codigo a usar componentes arrastrados desde la paleta :).


La franja horaria es GMT +2. Ahora son las 02:50:18.

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