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 04-08-2004
Halfo Halfo is offline
Registrado
 
Registrado: jul 2004
Posts: 9
Poder: 0
Halfo Va por buen camino
Problemas de caché con CachedUpdates y OnUpadateRecord (con IBX)

Me parece que estoy teniendo problemas con las caché al usar el evento OnUpdateRecord para lanzar las sentecias de actualización a la BD. Tanto los Deletes como los Inserts me fallan a la segunda vez que los lanzo, yq que intentar borrar o insertar el registro borrado/insertado anteriormente. Monitorizando con TIBSQLMonitor observo que pasa lo siguiente:

Para el delete:

delete 1 -> Delete 1 OK
delete 2 -> Delete 2 + Delete 1 FALLA!!!

Para el insert:

Insert 1 -> Insert 1 OK
Insert 2 -> Insert 1 FALLA!!!

Tanto para el Insert como el Delete estoy usando ApplyUpdates del componente TIBDatabase (este me realiza un commitretaining automaticamente). Tengo mis dudas acerca de lo que realiza este metodo con los componenets IBX, segun he leido para BDE, realiza un commit en dos fases donde primero intenta aplicar los cambios con ApplyUpdates de cada Dataset implicado y luego realiza el CommitUpdates de cada dataset para limpiar las cachés. He dicho que tenía mis dudas sobre IBX ya que al intentar implementar manualmente este comportamiento me he encontrado que el TIBDataSet no tiene el metodo CommitUpdates , tampoco TDataSet y si lo encontré en TBDDataSet del BDE, por lo que no me queda claro como limpian la caché los componentes IBX.

El código que he usado, es el siguiente (en C++ Builder):

DSEntidades->Delete();
DSEntidades->Database->ApplyUpdates(OPENARRAY(const TDataSet *, (DSEntidades)));

y para el Insert solo el ApplyUpdates despues de realizar Edit() y modificar el dataset.

Para el evento OnUpdateRecord:

void __fastcall TmodDB::IBDSClientesUpdateRecord(TDataSet *DataSet,
TUpdateKind UpdateKind, TIBUpdateAction &UpdateAction)
{
IBUpdateSQL1->Apply(UpdateKind);
UpdateAction = Db::uaApplied;
}

Quiero comentar que he usado un componente auxiliar, el IBUpdateSQL1 para lanzar las sentecias ya que no he encontrado en el propio TIBDataSet un metodo como Apply para lanzar las sentencias ya almacendadas en el DataSet, en el IBUpdateSQL1 he puesto las mismas sentecias SQL que en el TIBDataSet.

Comentarios sobre mis pruebas:
1) He comprobado la caché con la propiedad UpdatesPending para asegurarme que despues del ApplyUpdates la caché queda limpia y efectivamente devuelve false;
2) Si despues de cada Delete o Insert cierro y abro de nuevo el dataset no hay ningun problema y todo funciona correctamente.(parece que limpie la caché)
3) He probado de quitar el codigo del evento OnUpdateRecord para que ejecute automaticamente las sentencias SQL almacenadas en las propiedades del dataset y entonces fuciona tambien correctamente (lo que evidentemente no me sirve, ya que en el fondo lo que yo quiero es personalizar mis sentecias de actualización dinamicamente en tiempo de ejecución)

Alguien sabe porque me ocurre esto? es normal? debeía cerrar y abrir el dataset cada vez??

Gracias
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:47:29.


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