Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-10-2007
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 10-10-2007
pcicom pcicom is offline
Miembro
 
Registrado: may 2003
Ubicación: MONTERREY MEXICO
Posts: 253
Poder: 21
pcicom Va por buen camino
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;
__________________
Poco ha de saber el que no pregunta.. Yo por eso soy un pregunton

Última edición por pcicom fecha: 10-10-2007 a las 04:34:21.
Responder Con Cita
  #3  
Antiguo 10-10-2007
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
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 .
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
Problema con ejecución de DTS grotero76 Conexión con bases de datos 4 20-09-2007 20:05:07
tengo un codigo repetido en una consulta narcisoplayero SQL 11 04-06-2007 20:51:34
Varios equipos en red con el servidor de Firebird en ejecución Sick boy Firebird e Interbase 2 09-06-2006 11:40:11
Error en Consulta de tablas creadas en tiempo de ejecucion javicho_villa Varios 1 02-02-2006 17:14:28
Como configurar un alias en el DataBaseDesktop, pero por codigo (tiempo de ejecución) hhuillcen Conexión con bases de datos 1 14-06-2003 06:16:45


La franja horaria es GMT +2. Ahora son las 16:35:11.


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