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;');