2009-05-11 13 views
9

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).

Antwort

5

Wie sowohl c0rwin als auch skamradt bereits erwähnt: Das Bookmark-Verhalten hängt von dem TDataSet-Nachkomme ab, den Sie verwenden.

Im Allgemeinen Lesezeichen ungültig während:

  1. öffnen/schließen
  2. refresh (auf Datensätze, die es unterstützen)
  3. Datenänderungen (manchmal nur Deletionen)

Ich weiß, 1. und 2. können Ihre Lesezeichen in TClientDataSets ungültig machen. Ich bin mir fast sicher, dass es für TClientDataSets egal ist, welcher zugrunde liegende Provider verwendet wird (TSQLQuery, TIBQuery, etc).

Der einzige Weg, um sicherzustellen, was funktioniert und was nicht, testet es. Das bedeutet, Sie sind völlig richtig, wenn Sie sie nicht verwenden: Lesezeichen haben eine intrinsische Chance, unzuverlässig zu sein.

Um auf der sicheren Seite zu sein, rufen Sie immer BookmarkValid, bevor Sie zu einem Lesezeichen gehen.

+5

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. –

1

TDataSet implementiert virtuelle Bookmark-Methoden. Während diese Methoden sicherstellen, dass jedes von TDataSet abgeleitete Dataset-Objekt einen Wert zurückgibt, wenn eine Bookmark-Methode aufgerufen wird, sind die Rückgabewerte lediglich Standardwerte, die den aktuellen Standort nicht verfolgen. Nachkommen von TDataSet wie TBDEDataSet, neu implementieren die Lesezeichen-Methoden sinnvolle Werte zurückzubringen, wie in der folgenden Liste beschrieben:

  • BookmarkValid, zur Bestimmung, ob ein bestimmtes Bookmark in Betrieb ist.
  • VergleichenLesezeichen, um zwei Lesezeichen zu testen, um zu sehen, ob sie gleich sind.
  • GetBookmark, um ein Lesezeichen für Ihre aktuelle Position im Dataset zuzuordnen.
  • GotoBookmark, zu einem Lesezeichen zurückzukehren zuvor von GetBookmark erstellt
  • Free, ein Lesezeichen von GetBookmark zugewiesen vorher freizugeben.

Erhalten Sie sie von here

+0

Vielen Dank. Ich werde die Frage umformulieren. –

+0

Leider kann ich mich nicht erinnern Antwort auf diese Frage, seit ich Delphi Programmierung vor langer Zeit verließ. Meine Intuition sagt mir, sie sollte gültig sein, bis DataSet geöffnet ist, aber ich könnte mir eine Implementierung vorstellen, wo sie auch nach dem Öffnen/Schließen nützlich sein könnte. Ich stimme auch mit der Antwort unten zu, da es definitiv vom Anbieter abhängig sein könnte. –

4

persönlich verwende Lesezeichen selten ich je. Ich verwende stattdessen die ID des Datensatzes, den ich gerade anschaue, und führe eine Suche nach dem Datensatz durch, sobald die Aktualisierung abgeschlossen ist. Wenn ich über alle Datensätze in der Menge iterieren muss, mache ich das mit einem Klon des tClientDataset (der seinen eigenen Cursor bekommt).

Es ist meines Verständniss, dass die Implementierung des Lesezeichens bis zu dem Anbieter des tDataset-Nachkommens und zwischen den Implementierungen variieren kann. In meinem sehr einfachen Datensatz (tBinData) habe ich Lesezeichen als physische Datensatznummer implementiert, so dass es zwischen den Aktualisierungen bestehen bleibt, solange der Datensatz nicht gelöscht wurde. Ich kann das nicht für alle Implementierungen sagen.

Verwandte Themen