Ho un codice come sotto in un progetto che sto lavorando.Quanto tempo rimane valido un segnalibro TDataset?
procedure TForm.EditBtnClick(Sender:TObject);
begin
// Mark is form variable. It's private
Mark = cdsMain.GetBookmark;
// blabalbal
.
.
.
end;
procedure TForm.OkBtnClick(Sender:TObject);
var
mistakes: Integer;
begin
//Validation stuff and transaction control
//removed to not clutter the code
If cdsMain.ChangeCount <> 0 then
mistakes := cdsMain.AppyUpdates(-1);
cdsMain.Refresh;
try
cdsMain.GotoBookmark(Mark);
// Yes, I know I would have to call FreeBookmark
// but I'm just reproducing
except
cdsMain.First;
end;
end;
Personalmente, io non uso i segnalibri molto - se non per riposizionare un insieme di dati in cui mi sono trasferito solo la posizione del cursore (per creare un profilo, riempire una lista di stringhe, ecc). Se I Refresh
, aggiornamento (specialmente quando un filtro può rendere invisibile il record), refetch (Close
/Open
) o qualsiasi operazione che modifica i dati nel set di dati, non utilizzo i segnalibri. Preferisco Locate
sulla chiave primaria (utilizzando un TClientDataset
, ovviamente) o la richiesta di modifica dei parametri.
Fino a quando è valido un segnalibro? Fino a un Refresh
? Fino a quando non viene effettuato il Close
/Open
per il recupero dei dati? Dove finisce la zona sicura?
Prendere in considerazione nella risposta Sto usando TClientDataset
con un TSQLQuery
(DbExpress).
Dopo alcune sperimentazioni, anche BookmarkValid si dimostra inaffidabile. Succede quando si attiva un filtro sul set di dati - restituisce true anche se il record non corrisponde alla condizione del filtro. Il risultato finale è il lancio di un'eccezione. –