Fragen zu SQLite-Datenbanken (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu FAQ (FireDAC)

Dieses Thema enthält eine Liste mit Fragen und Antworten zu SQLite-Datenbanken.

F1: Wie kann ich in einer SQLite-Datenbank Sortiersequenzen definieren?

A: In "FireDAC\Samples\DBMS Specific\SQLite\UserCollation" finden Sie fertige Sortierungen, Funktionen, Erweiterungs-APIs und Demos.

Wenn Sie Sortierungen/Funktionen zur Entwurfszeit benötigen, erstellen Sie ein Entwurfszeit-Package ("simulierte" Komponente), indem Sie Benutzersortierungen/-funktionen registrieren.

F2: SQLite-Exception "[FireDAC][DApt]-401. Record is locked by another user" (Datensatz ist von einem anderen Benutzer gesperrt)

A: Die Exception wird bei der UPDATE-Anweisung ausgelöst, wenn eine andere DB-Verbindung einen Cursor auf derselben Tabelle hat und nicht alle Datensätze daraus abgerufen wurden. Sie müssen FetchOptions.Mode=fmAll verwenden. Sie können diese Option auf der ADConnection-Ebene setzen, damit alle damit verknüpften Datenmengen diese Option erben.

F3: Der Datentyp für das SELECT-Listenelement, das nicht zu einer Tabelle gehört, ist falsch. (oder) Meine Aggregatfunktion gibt einen String-Wert zurück. Was ist falsch?

A: SQLite gibt keine Datentypen für SELECT-Listenelemente zurück, die nicht zu einer Tabelle gehören. Wenn es sich bei einem Element um einen Ausdruck handelt, kann FireDAC dessen Datentyp nicht ermitteln. Er wird daher einfach mit ftWideString beschrieben. FireDAC kann den Datentyp für SELECT-Elemente festlegen: <Element> as "<Alias>::<Datentyp>". Zum Beispiel:

 SELECT count(*) as "cnt::int" from ...

F4: Werden Zeichenmakros mit SQLite nicht unterstützt? Ich habe CONCAT, LEFT, SUBSTR, UCASE ausprobiert.

A: Diese Funktionen sind mit der FireDAC-Ausdrucksauswertung implementiert. Wenn Sie zur Laufzeit eine Verbindung herstellen, müssen Sie "uADStanExprFuncs.pas" in die uses-Klausel einbeziehen.

SQLite hat einen begrenzten Satz von integrierten Funktionen, ermöglicht aber das Schreiben und Registrieren von benutzerdefinierten Funktionen. FireDAC verfügt über viele benutzerdefinierte Funktionen, die zur Ausdrucksauswertung implementiert sind. Deren Implementierungen und Registrierungen befinden sich in der unit FireDAC.Stan.ExprFuncs. Der SQLite-Treiber registriert automatisch alle bekannten Ausdrucksauswertungsfunktionen mit "sqlite3.dll".

F5: Wird sqlite3_progress_handler mit FireDAC implementiert?

A: Ja. Verwenden Sie Code wie den folgenden:

 procedure Tform1.FormCreate(Sender: TObject);
 begin
   FDConnection1.Open;
   with TSQLiteDatabase(FDConnection1.ConnectionIntf.CliObj) do
   begin
     ProgressNOpers := 50000;
     OnProgress := SQLiteOnProgress;
   end;
 end;
 
 procedure Tform1.SQLiteOnProgress(ADB: TSQLiteDatabase; var ACancel: Boolean);
 begin
   Application.ProcessMessages;
 end;

F6: WAL-Dateien werden in unserer Multithread-Anwendung extrem groß (>1 GB). Haben Sie einen Vorschlag, wie die Größe von WAL-Dateien begrenzt werden kann?

A: Wenn WAL-Dateien immer größer werden, bedeutet das, dass es nicht möglich ist, Daten aus der Protokolldatei in die Datenbankdatei zu verschieben. Wahrscheinlich wird die Datenbank permanent von Lese-Threads verwendet, und/oder DML-Operationen werden ohne Übergabe einer Transaktion durchgeführt. Die Lösung besteht in diesem Fall darin, nur kurze Transaktionen zu verwenden oder einen separaten Thread für DML-Operationen zu erstellen (Transaktionen sollten dabei laufend übergeben werden).

Wenn ein Prüfpunkt ausgeführt wird und alle WAL-Daten in die Datenbank kopiert werden, beginnt der nächste Schreibvorgang wieder am Beginn der WAL-Datei. Die WAL-Datei wird hier gewöhnlich nicht abgeschnitten (siehe PRAGMA journal_size_limit, wenn das der Fall sein soll). Und zwar, weil es schneller ist, eine vorhandene Datei zu überschreiben, als sie abzuschneiden und dann Daten anzuhängen.

Daher sollte, wenn alles funktioniert, SQLite nach jedem Prüfpunkt am Anfang der WAL-Datei beginnen, dadurch wird verhindert, das die WAL-Datei unendlich groß wird. Die folgenden beiden Probleme können auftreten:

  • Ein Reader könnte verhindern, dass bei einem Prüfpunkt alle Daten aus der WAL-Datei in die Datenbankdatei geschireben werden, oder
  • Während ein Prüfpunkt ausgeführt wird, könnte ein anderer Prozess in die Datenbank schreiben (und Daten an die WAL-Datei anhängen).

Wenn eines der beiden obigen Probleme auftritt, werden beim nächsten Schreibvorgang Daten an die WAL-Datei angehängt, anstatt sie am Anfang der Datei einzufügen. Wenn dies für jeden Prüfpunkt auftritt, dann wird die WAL-Datei immer größer.