Durchsuchen von Tabellen (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Anweisungen (FireDAC)

Verwenden von TFDTable

Mit der Komponente TFDTable können Sie eine einzelne Datenbanktabelle durchsuchen, Datensätze sortieren und filtern sowie alle Daten, die FireDAC bereitstellt, bearbeiten. TFDTable generiert eine SELECT-Anweisung auf Basis der TFDTable-Eigenschaftswerte und der aufgerufenen Methoden und sendet sie an ein DBMS.

TFDTable arbeitet in zwei Hauptmodi:

  • Modus "Live-Datenfenster". Ermöglicht die bidirektionale Navigation durch große Datenmengen mit einer minimalen Speicherauslastung.
  • Standardmodus. Dieser Modus entspricht TFDQuery. TFDTable generiert eine einzelne SELECT-Anweisung und navigiert anhand der Ergebnismenge durch die Datensätze der Tabelle.

Zum Öffnen einer Tabelle muss die Eigenschaft TableName angegeben werden. Zusätzlich können die Eigenschaften IndexFieldNames oder IndexName festgelegt werden.

Hinweis: Für die Eigenschaft IndexName muss fiMeta in FetchOptions.Items enthalten sein. Zum Beispiel:
FDTable1.TableName := 'CUSTOMERS';
FDTable1.IndexFieldNames := 'CustNo';
FDTable1.Open;

Damit TFDTable Feldnamen in Anführungszeichen setzt, legen Sie FormatOptions.QuoteIdentifiers auf true fest.

Hinweise zur Verwendung von TFDTable mit TClientDataSet und TDataSetProvider

Wenn Sie die Komponente TFDTable mit TClientDataSet und TDataSetProvider (DataSnap) verwenden, öffnet TFDTable möglicherweise bei jeder Änderung erneut die gesamte Datenmenge. Führen Sie zur Lösung dieses Problems einen der folgenden Schritte aus:

Modus "Live-Datenfenster"

Im Modus "Live-Datenfenster" (Live Data Window, LDW) behält FireDAC nur 2 * FetchOptions.RowsetSize an Datensätzen im Arbeitsspeicher und fragt diese ab, was als "Fenster in die Tabellendaten" bezeichnet werden kann. Wenn die Anwendung durch die Tabellendaten navigiert, führt FireDAC automatisch einen Bildlauf aus bzw. positioniert das LDW an der erforderlichen Position. Dadurch werden die folgenden Vorteile erzielt:

  • Minimierung der Speicherauslastung und Möglichkeit mit großen Datenmengen, ähnlich wie mit einer unidirektionalen Datenmenge, zu arbeiten.
  • Aktivierung der bidirektionalen Navigation, im Unterschied zu einer unidirektionalen Datenmenge.
  • Stetige Anzeige aktueller Daten, was die Notwenigkeit einer Aktualisierung der Datenmenge reduziert.
  • Keine Verzögerung beim Abrufen der gesamten Daten der Ergebnismenge, die zum Sortieren, Suchen von Datensätzen, Wechseln zum letzten Datensatz usw. erforderlich sind.

Die Eigenschaft Filter, die Bereichsfilterung, die Eigenschaften IndexFieldNames und IndexName, die Methoden Locate und Lookup, das Suchen von Schlüsselwerten, das Setzen von RecNo, das Setzen einer Positionsmarke usw. werden durch weitere SELECT-Anweisungen oder durch Festlegen zusätzlicher Klauseln für die Haupt-SELECT-Anweisung durchgeführt. Nach dem Ändern von Filter, IndexFieldNames oder IndexName kann sich auch die aktuelle Position in der Datenmenge ändern. Speichern Sie vor der Änderung eine Positionsmarke, und stellen Sie sie nach der Änderung wieder her, um die aktuelle Position beizubehalten.

In LDW-Modus wird der Filter-Eigenschaftswert unverändert in die WHERE-Klausel eingesetzt. Damit ein Ausdruck kompatibel mit dem DBMS und der lokalen Ausdrucks-Engine ist, können in der Anwendung FireDAC-Escape-Sequenzen verwendet werden. Zum Beispiel:

FDTable1.Filter := 'DateField = {d ' + FormatDateTime('yyy-mm-dd', Trunc(MonthCalendar1.Date)) + '}';
FDTable1.Filtered := True;

Im LDW-Modus wird standardmäßig immer die ORDER BY-Klausel in die SELECT-Anweisungen eingefügt. Für den LDW-Modus gelten die folgenden Hauptanforderungen:

  • Eine Tabelle muss über einen eindeutigen oder Primärschlüssel verfügen. Weitere Einzelheiten finden Sie unter Eindeutige Kennzeichnungsfelder.
  • Die serverseitige Sortierreihenfolge und die clientseitige Sortierreihenfolge müssen übereinstimmen. Ansonsten könnte TFDTable doppelte Zeilen produzieren und den Fehler "Verletzung des eindeutigen Schlüssels" auslösen.

Zwar minimiert FireDAC im LDW-Modus die Anzahl der generierten und ausgeführten SQL-Anweisungen, aber es wird dennoch eine höhere DB-Auslastung als mit TFDQuery verursacht. Daher sollten sich Entwickler die Verwendung von TFDTable und des LDW-Modus sorgfältig überlegen.

Festlegen des LDW-Modus

Der LDW-Modus wird verwendet, wenn die folgenden Bedingungen zutreffen:

Andernfalls wird der Standardmodus verwendet.

Sie können den Modus nur ändern, wenn TFDTable nicht aktiv ist. Folglich können Sie CachedUpdates nur ändern, wenn die Tabelle inaktiv ist. Die Leistung kann durch Ändern von FetchOptions.LiveWindowParanoic (standardmäßig False) und FetchOptions.LiveWindowFastFirst (standardmäßig False) verbessert werden.

Vermeiden des Fehlers "Verletzung des eindeutigen Schlüssels" im LDW-Modus

Damit die Sortierreihenfolge der Datenbank mit der des Clients übereinstimmt, können Sie mit FormatOptions.SortLocale und FormatOptions.SortOptions die clientseitige Sortierreihenfolge anpassen. Beispielsweise könnten deutschsprachige Entwickler TFDTable so einrichten, dass die Firebird-Datenbank mit dem Zeichensatz ISO8859_1, abgefragt wird, der deutsche Stringdaten enthält:

uses
  Windows;
...
// Set locale ID to German phone book collation
FDTable1.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT);
// Use the the punctuation and other symbols case insensitive sorting
FDTable1.FormatOptions.SortOptions := [soNoSymbols];
FDTable1.IndexFieldNames := 'NAME';
FDTable1.TableName := 'CUSTOMERS';
FDTable1.Open;

Abhängig vom DBMS können Sie die folgenden zusätzlichen Einstellungen vornehmen:

DBMS Einstellungen
Firebird Das Einbeziehen von soNoSymbols in SortOptions kann erforderlich sein.
MySQL Das Einbeziehen von soNoSymbols in SortOptions kann erforderlich sein.
Oracle Die Ausführung von ALTER SESSION SET NLS_COMP=ANSI kann erforderlich sein.
SQLite Setzen Sie SortLocale auf 0.

Oracle-Entwickler könnten z. B. die folgende Anweisung ausführen:

FDConnection1.Connected := True;
FDConnection1.ExecSQL('ALTER SESSION SET NLS_COMP=ANSI');

Darüber hinaus sollte FormatOptions.StrsTrim auf False gesetzt werden.

Hinweis: Wenn ein Entwickler die clientseitige Sortierreihenfolge nicht anpasst, könnte der LDW-Modus durch Setzen von FetchOptions.CursorKind auf ckDefault, ckStatic oder ckForwardOnly deaktiviert werden.

Siehe auch