[ayu] lazarus y firebird (commit transaction)

Publicado por marcosp, Junio 18, 2011, 12:13:19

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

marcosp

Hola gente! como va?..
   Queria consultarles si me pueden orientar con un problema que me esta pasando programando en lazarus 0.9.28 con la base de datos firebird 2.
  El tema es el siguiente, cuando realizo la insercion de un registro en una tabla de la base de datos, esta no aparece hasta que no ejecuto el programa de nuevo. O sea, inserto los datos, ejecuto una consulta para leer la tabla y los datos nuevos recien insertados no estan. Pero cuando cierro el programa y lo abro de nuevo, se realiza la consulta y los datos si estan.
   Me fije directamente viendo la tabla desde flamerobin y pasa lo mismo, hago la insercion, me fijo en flamerobin los datos de la tabla y no aparecen los nuevos, pero despues de cerrar el programa si lo hacen.

Tengo las funciones de base de datos en un DataModule


// Realiza la conexion con la base de datos
procedure TDMCon.ini_con(bd: string);
begin
conexion.DatabaseName:=ExtractFilePath(application.ExeName)+'/db/'+bd;
conexion.Open;
end; 

// Realiza altas, bajas o modificaciones a la base de datos
procedure TDMCon.abm(SQL: string);
begin
  sqlcons.Transaction:=self.transaccion;
  sqlcons.SQL.Clear;
  sqlcons.SQL.Text:=SQL;
  try
     sqlcons.ExecSQL;
     transaccion.Commit;
     sqlcons.close;
  Except
     showmessage('No se pudo realizar la transaccion con la base de datos');
  end;
end;           

// Realiza una consulta a la base de datos (solo lectura)
procedure TDMCon.consulta(SQL: string);
begin
  sqlcons.Transaction:=self.transaccion;
  sqlcons.SQL.Clear;
  sqlcons.SQL.Text:=SQL;
  sqlcons.Open;
end;   


Ojala se haya entendido..

Gracias.. Saludos!!!

groboko

Citar// Realiza la conexion con la base de datos
procedure TDMCon.ini_con(bd: string);
begin
conexion.DatabaseName:=ExtractFilePath(application.ExeName)+'/db/'+bd;
conexion.Open;
end;

// Realiza altas, bajas o modificaciones a la base de datos
procedure TDMCon.abm(SQL: string);
begin
  sqlcons.Transaction:=self.transaccion;
  sqlcons.SQL.Clear;
  sqlcons.SQL.Text:=SQL;
  try
     sqlcons.ExecSQL;
     transaccion.ApplyUpdates;
     transaccion.Commit;
     sqlcons.close;
  Except
     showmessage('No se pudo realizar la transaccion con la base de datos');
  end;
end;           

// Realiza una consulta a la base de datos (solo lectura)
procedure TDMCon.consulta(SQL: string);
begin
  sqlcons.Transaction:=self.transaccion;
  sqlcons.SQL.Clear;
  sqlcons.SQL.Text:=SQL;
  sqlcons.Open;
end;   

Fijate si anda...



marcosp

   Si si, ya probe utlizando el 'ApplyUpdates', pero tampoco funciona.. Es muy raro, es como si el 'transaction.commit' no se ejecutara al momento de pasar por esa linea de codigo que lo ejecuta. Aunque en realidad si se ejecuta pero recien se ven los cambios aplicados una vez que cierro y abro el programa de nuevo.
   Podria ser que al realizar la consulta despues de la insercion, no lea los datos actualizados.. Pero no creo que el problema este en el codigo que realiza la consulta.. Probablemente sea alguna cuestion en la lista objetos que uso para tener los datos, porque cerrando y abriendo el programa de nuevo, todos los objetos se cargan desde cero otra vez y ahi si se ven las modificaciones en la base de datos.
   Ya voy a ver si le encuentro la vuelta.

Gracias por responder!
Un saludo!

Predicador

Hola,
Y si usas  sqlcons.Transaction.Commit; (y/o Applychanges;) en vez de transaccion.commit;?Quizas llamar al metodo commit desde el otro objeto hace algo mas  :icon_confused: .
Exitos.
Baii
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen