PDA

Ver la Versión Completa : Problemas de caché con CachedUpdates y OnUpadateRecord (con IBX)


Halfo
04-08-2004, 13:59:38
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