Home » Tutorials » Datenbanken » SQLite3 mit Delphi und dbExpress

SQLite3 mit Delphi und dbExpress

SQL-Befehle

SQL-Befehle ausführen – SQLConnection

Es gibt zwei Arten von SQL-Befehlen.

Mit Ergebnis: SQL-Befehl SELECT liefert Datensätze in einem TDataset.

SQLConnection.Execute(SQL-Befehl, NIL, TDataset);

Ohne Ergebnis: SQL-Befehle wie CREATE, INSERT, DELETE, UPDATE, DROP usw..

SQLConnection.Execute(SQL-Befehl, NIL);
oder
SQLConnection.ExecuteDirect(SQL-Befehl);

Beispiel SELECT

Alle Datensätze der Tabelle Buecher in einem Dataset speichern. Fehler mit Try-Except abfangen.

Var FDSSQLResults: TDataset; // Ergebnis SQL-Befehl SELECT speichern
Try
  // Datensätze der Tabelle Buecher selektieren und in einem Dataset speichern
  SQLConnection.Execute('SELECT * FROM Buecher', NIL, FDSSQLResults);
Except On E: EDatabaseError Do 
  ShowMessage(E.Message);
End;

SQL-Befehle ausführen – SQLDataSet

Wird ein SQLDataSet verwendet, dann werden SQL-Befehle wie folgt ausgeführt:

Mit Ergebnis: SQL-Befehl SELECT liefert Datensätze in dem SQLDataset.

SQLDataset.CommandText := 'SQL SELECT Befehl';
SQLDataset.Open;

Ohne Ergebnis: SQL-Befehle wie CREATE, INSERT, DELETE, UPDATE, DROP usw..

SQLDataset.CommandText := 'SQL CREATE oder INSERT … Befehl';
SQLDataset.ExecSQL;

Beispiel SELECT

Alle Datensätze aus der Tabelle Buecher selektieren und in einem Stringgrid sgSQLiteDBQueryToStringGrid darstellen.

Procedure TfrmMain.SQLiteQueryToStringGrid(Sender: TObject);
Var i: Integer;
Begin
  Try
    FSQLCommandText := 'SELECT * FROM Buecher;';
    // Alle Informationen aus der Tabelle Buecher lesen
    FSQLDataSet.Open;
    // Spaltenzahl anpassen
    sgSQLiteDBQueryToStringGrid.ColCount := FSQLDataSet.FieldCount + 1;
    // Zeilenzahl anpassen
    sgSQLiteDBQueryToStringGrid.RowCount := FSQLDataSet.RecordCount + 1;
    For i := 0 To FSQLDataSet.FieldCount -1 Do
      // Spaltenüberschriften
      SgSQLiteDBQueryToStringGrid.Cells[i + 1,0] := FSQLDataSet.Fields[i].FieldName;
    i := 1;
    FSQLDataSet.First;
    // Daten aus Dataset im StringGrid übertragen
    While NOT FSQLDataSet.EOF Do Begin
      sgSQLiteDBQueryToStringGrid.Cells[1,i] := FSQLDataSet.Fields[0].AsString;
      // Zelle Spalte 1, Zeile i
      sgSQLiteDBQueryToStringGrid.Cells[2,i] := FSQLDataSet.Fields[1].AsString;
      // Zelle Spalte 2, Zeile i
      FSQLDataSet.Next;
      i := i +1;
    End;
  Except on E: EDatabaseError do
    ShowMessage(E.Message);
  End;
End;

SQL-Befehl Beispiele

Einige Beispiele anhand der Tabelle Buecher aus der Datenbank BUECHER.DB.

  • In den Beispielen werden SQL-Befehle im String LSQL gespeichert.
  • Groß-/Kleinschreibung bei SQL-Befehlen beachten.

CREATE TABLE Tabelle (Spalte1 Typ, SpalteN Typ)

Beispiel: Eine neue Tabelle Buecher erstellen.

  • SQLite Datentypen („Storage Classes“) : NULL, INTEGER, REAL, TEXT, BLOB


SQL-Befehle, um die Tabellen Autoren und Buecher zu erstellen:
Var LSQLCreateAutoren, LSQLCreateBuecher, LSQLCreateLog: String;

LSQLCreateAutoren := 'CREATE TABLE Autoren (AutorID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, Name VARCHAR(40) NOT NULL, Beschreibung VARCHAR(255), Homepage VARCHAR(100));';

LSQLCreateBuecher := 'CREATE TABLE Buecher (BuchID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, Titel VARCHAR(100) NOT NULL, AutorID INTEGER, ISBN VARCHAR(20));';

LSQLCreateLog := 'CREATE TABLE Log (LogID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, Datum VARCHAR(20) NOT NULL, Info VARCHAR(255) NOT NULL);';

SQLConnection Execute Möglichkeit:

SQLConnection.Execute(LSQLCreateAutoren,NIL);
SQLConnection.Execute(LSQLCreateBuecher,NIL);
SQLConnection.Execute(LSQLCreateLog,NIL);
  • Tabelle erstellen, falls nicht vorhanden: CREATE TABLE IF NOT EXISTS …
  • Anstatt SQLConnection.Execute(SQL-Befehl) kann auch SQLConnection.ExecuteDirect(SQL-Befehl) eingesetzt werden
  • Namen für Tabellen und Spalten können auch in Anführungszeichen angegeben werden. Vgl. „Buecher“.
  • Datentyp TEXT wird in DBGRID als Memo dargestellt. Um eine Zeichenkette (String) darzustellen, VARCHAR(Länge) verwenden. Vgl. VARCHAR(20) entspricht einer Zeichenkette mit der Länge von 20 Zeichen.


SQLDataSet ExecSQL Möglichkeit:

SQLDataset.CommandText := LSQLCreateAutoren;
SQLDataset.ExecSQL;
SQLDataset.CommandText := LSQLCreateBuecher;
SQLDataset.ExecSQL;
SQLDataset.CommandText := LSQLCreateLog;
SQLDataset.ExecSQL;

INSERT INTO Tabelle (Spalte1, SpalteN) VALUES (Wert1, WertN)

Beispiel: Datensätze in die Tabelle buecher einfügen
Via SQLConnection.ExecuteDirect

SQLConnection.ExecuteDirect('INSERT INTO Buecher(Titel) VALUES("Titel 1");');
SQLConnection.ExecuteDirect('INSERT INTO Buecher(Titel, AutorID) VALUES("Titel 2", 1);');

Via einem TSQLDataSet (siehe auch weiter unten) Testdaten mittels For Schleife erstellen:

For i := 1 To 5 Do Begin
  SQLDataset1.CommandText :=
  'INSERT OR REPLACE INTO Buecher (BuchID, Titel, AutorID, ISBN) ' +
  'VALUES(NULL, "Titel ' + IntToStr(i) + '", "' + IntToStr(i) + '", "' + IntToStr(i) + '");';
  SQLDataset1.ExecSQL;
End;

INSERT INTO Tabelle (Spalte1, SpalteN) VALUES (:Spalte1, :SpalteN)

Datensätze können in die Tabelle Buecher auch durch Angabe von Parametern einfügt werden.
Die Verwendung von Parametern, :Spalte1 .. :SpalteN, vereinfacht die Handhabung der Zuweisung von Werten.
Beispiel SQLConnection > SqlDataSet > StringGrid

SQLDataSet definieren:

SQLDataSet1 ist mit SQLConnection1 verbunden.

Tabelle Buecher Spalten mit Testdaten füllen:

For i := 1 To 5 Do Begin
  // Parameter definieren (Spaltennamen verwenden)
  CommandText := 'INSERT INTO Buecher (BuchID, Titel, AutorID, ISBN) VALUES(:BuchID, :Titel, :AutorID, :ISBN);';
  // Parameter Werte zuweisen (Spaltennamen verwenden)
  SQLDataset1.ParamByName('BuchID').Value := NULL;
  SQLDataset1.ParamByName('Titel').Value := 'Mein Buch ' + IntToStr(i);
  SQLDataset1.ParamByName('AutorID').Value := i;
  SQLDataset1.ParamByName('ISBN').Value := 'ISBN' + IntToStr(i);
  // Und Werte in der Tabelle Buecher einfügen
  SQLDataset1.ExecSQL;
End;

Ausgabe im StringGrid:

CommandText := ' SELECT * FROM Buecher;';
SQLDataset1.Open;
StringGrid1.ColCount := SQLDataset1.FieldCount + 1; // Spalten
StringGrid1RowCount := SQLDataset1.RecordCount + 1; // Zeilen
// Spaltenüberschrift
For i := 0 To FieldCount - 1 Do
StringGrid1.Cells[i + 1,0] := SQLDataset1.Fields[i].FieldName;
// Werte im Stringgrid ausgeben
i := 1;
SQLDataset1.First;
While NOT SQLDataset1.EOF Do Begin
  // Spalte Nr
  SQLDataset1.Cells[1,i] := SQLDataset1.Fields[0].AsString;
  // Spalte Titel
  SQLDataset1.Cells[2,i] := SQLDataset1.Fields[1].AsString;
  SQLDataset1.Next;
  i := i + 1;
End;

SELECT Spalten FROM Tabelle(n) WHERE Bedingung ORDER BY Sortierung GROUP BY Gruppierung HAVING Einschränkung

Bestimmte Datensätze lesen und als Ergebnis in einem Dataset zurückgeben.

SELECT Operator Bedeutung
* Alle Felder eine Tabelle anzeigen
DISTINCT Felder kumuliert anzeigen
COUNT(*) Anzahl Treffer zur optionalen Bedingung
GROUP BY Ergebnis gruppieren
GROUP BY … HAVING Ergebnis gruppiert einschränken
ORDER BY … ASC, DESC Ergebnis auf- oder absteigend sortieren
Aggregatfunktionen MIN(Feld), MAX(Feld), AVG(Feld), SUM(Feld), COUNT(Feld)
WHERE Operator Bedeutung
= Gleich
<> Ungleich
> Größer
< Kleiner
>= Größer Gleich
<= Kleiner gleich
BETWEEN Zwischen einem numerischen Bereich
LIKE Ungefähre Übereinstimmung
Platzhalter % (beliebig viele Zeichen), _ (ein Zeichen)
IN einem Wertesatz
IS NULL Leere Einträge abfragen
IS NOT NULL Keine leeren Einträge abfragen
AND, OR Verknüpfung logischer Operationen


Beispiele

Anhand TSQLDataset SQLDataset.CommandText :=
Alle Datensätze der Tabelle Buecher lesen ‚SELECT * FROM Buecher‘;
Nur Buch mit ISBN 1 selektieren ‚SELECT * FROM Buecher WHERE ISBN = „ISBN 1“ ‚;
Alle Datensätze sortiert nach Titel absteigend DESC; oder aufsteigend ASC ‚SELECT * FROM Buecher ORDER BY Titel DESC‘;
Alle Datensätze mit AutorID und Autorname (SELECT auf mehrere Tabellen (JOIN)) ‚SELECT Buecher.BuchID,Buecher.Titel,Buecher.AutorID, Autoren.Name,Buecher.ISBN FROM Autoren, Buecher WHERE Autoren.AutorID=Buecher.AutorID‘;
SQL-Befehl ausführen.
Das Ergebnis wird im SQLDataset gespeichert.
SQLDataset.Open;

UPDATE Tabelle SET Spalte1=Wert, SpalteN=Wert WHERE Spalte=Bedingung

Beispiel: Tabelle Buecher aktualisieren.
Aufgabe: Titel 2 in Buchtitel 2 ändern

SQLConnection.ExecuteDirect('UPDATE Buecher SET Titel="Buchtitel 2", isbn="ISBN 2-2" WHERE Titel="Titel 2";');

DELETE FROM TABLE WHERE Spalte=Bedingung

Beispiel: Alle Datensätze aus der Tabelle Buecher löschen.

SQLConnection.ExecuteDirect('DELETE FROM Buecher;');

Beispiel: Datensatz mit der BuchID=1 aus der Tabelle Buecher löschen.

SQLConnection.ExecuteDirect('DELETE FROM Buecher WHERE BuchID=1;');

DROP TABLE Tabellenname

Beispiel: Tabelle Buecher aus der Datenbank löschen.

SQLConnection.ExecuteDirect('DROP TABLE IF EXISTS Buecher;');

CREATE INDEX Indexname ON Tabelle(Spalte)

Beispiel: Auf Spalte ISBN einen eindeutigen Index erstellen.

SQLConnection.ExecuteDirect('CREATE UNIQUE INDEX idx_isbn ON Buecher(ISBN);');

Hinweis: SQLite verwendet den Index automatisch.

DROP INDEX Indexname

Beispiel: Index idx_isbn löschen.

SQLConnection.ExecuteDirect('DROP INDEX IF EXISTS idx_isbn;');