Ich habe Code wie unten in einem Projekt, das ich arbeite.Wie lange bleibt ein TDataset-Lesezeichen gültig?
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;
Ich persönlich Lesezeichen nicht viel verwenden - außer einen Datensatz neu zu positionieren, wo ich nur die Cursor-Position bewegt (eine Liste zu erstellen, eine String-Liste füllen, etc). Wenn ich Refresh
, update (insbesondere wenn ein Filter den Datensatz unsichtbar machen kann), reetch (Close
/Open
) oder eine Operation, die die Daten im Dataset ändert, verwende ich keine Lesezeichen. Ich bevorzuge Locate
auf dem Primärschlüssel (unter Verwendung eines TClientDataset
, natürlich) oder requery, das die Parameter ändert.
Bis wann ist ein Lesezeichen gültig? Bis eine Refresh
? Bis ein Close
/Open
getan wird, um Daten erneut zu holen? Wo endet die sichere Zone?
Betrachten Sie in der Antwort Ich verwende TClientDataset
mit einem TSQLQuery
(DbExpress).
Nach einigen Experimenten erweist sich auch BookmarkValid als unzuverlässig. Dies passiert, wenn Sie einen Filter für das Dataset aktiviert haben - er gibt true zurück, auch wenn der Datensatz nicht mit der Filterbedingung übereinstimmt. Das Endergebnis ist das Auslösen einer Ausnahme. –