Abrufen von Datensätzen (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Anweisungen (FireDAC)

Behandeln von Cursors

Beim Ausführen einer SQL-Anweisung, die keine Rückgabezeilen hat, erstellt das DBMS einen Cursor auf dem DBMS-Server. Eine Anwendung verwendet den Cursor zum Abrufen von Zeilen aus einer Datenbank. Je nach DBMS kann es mehrere Cursorarten geben. Mit der Eigenschaft FetchOptions.CursorKind wählen Sie die Cursorart aus. Standardmäßig wählt FireDAC die schnellste Cursorart (ckAutomatic) aus. Diese Eigenschaft ist in erster Linie für Microsoft SQL Server von Bedeutung.

Die DBMS-Cursors berücksichtigen den Transationskontext, in dem sie geöffnet wurden. Weitere Einzelheiten finden Sie im Kapitel Verwalten von Transaktionen.

Abrufen von Rowsets

Beim Abrufen von Rowsets können Sie die Anzahl der Datensätze angeben, die vom Server bei einem Netzwerkzugriff abgerufen werden. Sie können dies separat für jede SELECT-Anweisung, die Sie ausführen, optimieren, und dabei die Anzahl der Netzwerkzugriffe durch Angabe der Option RowsetSize minimieren.

Die Größe der Rowsets wird durch die Eigenschaft FetchOptions.RowsetSize gesteuert. Je höher die Zahl, desto schneller ruft FireDAC die vollständige Ergebnismenge ab, aber die Verzögerung bis zum Abrufen des nächsten Rowsets wird ebenfalls größer. Des Weiteren nimmt beim Beginnen mit "hohen" Werten auch die Leistung ab. Der geeignete "hohe" Wert liegt zwischen 2000 - 3000.

Hinweis: Nicht alle DBMSs unterstützen das Abrufen von Rowsets. FireDAC kann dies aber zulasten der Geschwindigkeit emulieren. Emuliertes Abrufen von Rowsets führt zu einer Geschwindigkeitsreduktion von 50 % im Vergleich zum tatsächlichen Abrufen.

FireDAC ruft Rowsets entsprechend der Eigenschaft FetchOptions.Mode ab:

  • fmOnDemand – Das Rowset wird automatisch abgerufen, wenn die Datenmenge versucht, die aktuelle Position hinter den letzten abgerufenen Datensatz zu verschieben.
  • fmAll – Alle Rowsets werden automatisch direkt nach Ausführung der SQL-Anweisung abgerufen. Dies entspricht dem Aufruf der Methode FetchAll.
  • fmManual – Der Programmierer ruft die Rowsets manuell mit den Methoden FetchNext oder FetchAll ab.
  • fmExactRecsMax – Alle Rowsets werden automatisch direkt nach Ausführung der SQL-Anweisung abgerufen. Wenn die Anzahl der Zeilen von FetchOptions.RecsMax abweicht, wird eine Exception ausgelöst.

Wenn FetchOptions.Unidirectional True ist und vor dem Abrufen des nächsten Rowsets, wird das vorherige Rowset aus dem Arbeitsspeicher entfernt. Dadurch wird der PC-Arbeitsspeicher beim Abrufen großer Ergebnismengen entlastet.

Wenn alle Datensätze abgerufen wurden, wird TFDDataSet.SourceEOF auf True gesetzt und die zugrunde liegende Anweisung auf Basis von FetchOptions.AutoClose geschlossen. Damit wird die Datenmenge selbst nicht geschlossen.

Hinweis: Weitere Einzelheiten finden Sie unter Anweisungsstapel.

Die Anwendung greift mit der Ereignisbehandlungsroutine TFDDataSet.AfterGetRecord auf jeden abgerufenen Datensatz zu.

Seitenweises Abrufen von Zeilen

FetchOptions.RecsSkip und RecsMax ermöglichen ein seitenweises Abrufen von Ergebnismengen. Nach dem Öffnen des Cursors werden die ersten RecsSkip Datensätze übersprungen. Die restlichen Datensätze bis zu RecxMax werden abgerufen. Wenn eine Anweisung vorbereitet wird, hat das Ändern der Eigenschaftswerte von RecsSkip und RecsMax keine Auswirkungen. Daher muss vor dem Abrufen der nächsten Seite mit Zeilen die Vorbereitung der Anweisung aufgehoben und dann erneut ausgeführt werden. Zum Beispiel:

 FDQuery1.FetchOptions.RecsSkip := 0;
 FDQuery1.FetchOptions.RecsMax := 100;
 FDQuery1.Open;
 // process rows
 
 FDQuery1.Disconnect;
 FDQuery1.FetchOptions.RecsSkip := 100;
 FDQuery1.Open;
 // process rows
 
 FDQuery1.Disconnect;
 FDQuery1.FetchOptions.RecsSkip := 200;
 FDQuery1.Open;
 // process rows

Wenn möglich und wenn die Eigenschaften RecsSkip und/oder RecsMax angegeben sind, erweitert FireDAC die ursprüngliche SELECT-Anweisung um TOP/ROWS- und ähnliche Klauseln.


Verzögertes Abrufen

Ergebnismengen können BLOB- und/oder verschachtelte Datenmengenspalten enthalten. Im Allgemeinen verlangsamen solche Spalten das Abrufen von Ergebnismengen. FireDAC ermöglicht das Abrufen solcher Spalten so lange zu verschieben, bis deren Werte wirklich gebraucht werden. Dies wird von der Eigenschaft FetchOptions.Items gesteuert:

  • Wenn fiBlobs ausgeschlossen ist, verzögert FireDAC das Abrufen von BLOB-Werten. Die Methode FetchBlobs ruft BLOB-Werte für den aktuellen Datenmengendatensatz ab. Alternativ wird beim ersten Lesen eines BLOB-Wertes FetchBlobs automatisch aufgerufen, wenn "Mode <> fmManual".
  • Wenn fiDetails ausgeschlossen ist, verzögert FireDAC das Abrufen verschachtelter Datenmengen. Die Methode FetchDetails ruft verschachtelte Datenmengen für den aktuellen Datensatz ab. Außerdem steuert fiDetails die Behandlung von Haupt/Detail-Datenmengen.

Einzelheiten zum Generieren von SQL-Anweisungen für das verzögerte Abrufen finden Sie unter Generieren von Aktualisierungsanweisungen.

Hinweis: Durch Ausschließen von fiBlobs oder fiDetails aus FetchOptions.Items wird die SELECT-Liste einer SQL-Anweisung nicht geändert. Wenn ein DBMS BLOB-Werte per Wert überträgt (z. B. Oracle LONG, MySQL, SQL Server, SQLite), werden die BLOB-Werte über das Netzwerk an den Client gesendet. Sie werden allerdings nicht im Datensatzzwischenspeicher des Clients gespeichert. Wenn aber ein DBMS BLOB-Werte per Referenz überträgt (z. B Oracle CLOB/BLOB, InterBase, Firebird), werden die BLOB-Werte weder gesendet noch gespeichert.

Erneutes Abrufen von Zeilen

Manchmal ist es erforderlich, dass eine Anwendung die neue Ergebnismenge an die bestehende anhängt oder Zeilen erneut abruft usw. Dazu wird die Methode FetchAgain verwendet.

Hinweis: Verwenden Sie Refresh zum Aktualisieren von Datenmengen.

Allgemeine Anwendungsfälle

Die folgende Tabelle enthält allgemeine Anwendungsfälle und die zugehörigen FetchOptions-Konfigurationen:

Anwendungsfall Beschreibung
Minimale Zeit für das Abrufen von großen Mengen von Datensätzen mit begrenzter Speicherauslastung. CursorKind = ckDefault oder ckForwardOnly

Mode = fmOnDemand RowsetSize = 1000 Unidirectional = True

Minimale Zeit für das Abrufen mit Verzögerung beim Öffnen der Abfrage. CursorKind = ckDefault

Mode = fmAll RowsetSize = 1000

Minimale Verzögerung beim Öffnen der Abfrage. CursorKind = ckDynamic

Mode = fmOnDemand RowsetSize = 50 Schließen Sie fiMeta aus Items aus.

Schreibgeschützte Datenmenge. Schließen Sie fiMeta aus Items aus, oder setzen Sie UpdateOptions.RequestLive auf False.
Stapelanweisung mit mehreren Ergebnismengen. "AutoClose = False"
Minimale Zeit für das Abrufen von großen Mengen von Datensätzen mit mehreren großen BLOB-Werten und begrenzter Speicherauslastung. Schließen Sie fiBlobs aus Items aus. Kombination der obigen Werte.

Siehe auch

Beispiel