Home » Tutorials » Datenbanken » SQLite3 mit Delphi und dbExpress

SQLite3 mit Delphi und dbExpress

SQLite SELECT Beispiele

SELECT ausführen

Wie schon erwähnt, liefert der SQL-Befehl SELECT ein Ergebnis in einem TDataset.

Beispiel SQL-Befehl SELECT und Ergebnis in einem TMemo „memoSQLOutput“ ausgeben:

Var
  fSLNames: TStringList; // Liste Feldnamen Tabelle
  i: Integer; // Laufvariable
  currentField: TField; // Das aktuelle Tabellenfeld
  currentLine: string; // Aktuelle Memozeile Feldergebnis
Begin
  memoSQLOutput.Lines.Add('Datensätze:' +IntToStr(FDLSQLResults.RecordCount));
  fSLNames := TStringList.Create; // Liste der Feldnamen initialisieren
  FDLSQLResults.GetFieldNames(fSLNames); // Feldnamen lesen Ergebnisdataset
  FDLSQLResults.First; // Ergebnis Satz für Satz lesen
  While NOT FDLSQLResults.Eof Do Begin
    currentLine := '';
    For i := 0 To fSLNames.Count - 1 Do Begin
      currentField := FDLSQLResults.FieldByName(fSLNames[i]);
      currentLine := currentLine + ' ' + currentField.AsString;
    End;
    memoSQLOutput.Lines.Add(currentLine); // Datensatz anzeigen
    FDLSQLResults.Next;
  End;
  fSLNames.Free;
End;

Es gibt Situationen, in denen nicht alle Informationen des SELECT Befehls im TDataSet gespeichert werden. Obwohl TDataSet Daten enthält, kann es zu Fehlermeldungen kommen, wie „Reader has no more rows“. Ein Beispiel ist die Anwendung von TDataSet.RecordCount. Um die Anzahl der Datensätze zu ermitteln, ist es sicherer, eine eigene Funktion zu definieren, anstatt RecordCount zu verwenden.

Function TfrmMain.DatasetRecordCount(DS: TDataSet): Integer;
Var i : Integer;
Begin
  Result := 0;
  If DS = NIL Then Exit;
  If DS.IsEmpty Then Exit;
  i := 0;
  DS.First;
  While Not DS.Eof Do Begin
    i := i + 1;
    DS.Next;
  End;
  Result := i;
End;

// Aufruf: 
nCnt := DatasetRecordCount(FDSSQLResults);

SELECT Ergebnis im StringGrid darstellen

Beispiel Ergebnis SQL-Befehl SELECT in einem StringGrid ausgeben.

StringGrid-Komponente Form hinzufügen:
sgSQLResults: TStringGrid;

Prozedur erstellen, die das SQL-Ergebnis in einem StringGrid zeigt

Procedure TfrmMain.ActionSQLResultsToStringGridExecute(Sender: TObject);
Var
  nCol, nLin: Integer;
Begin
  If Not FDLSQLResults.IsEmpty Then Begin
    sgSQLResults.ColCount := FDLSQLResults.FieldCount + 1;
    sgSQLResults.RowCount := FDLSQLResults.RecordCount + 1;
    sgSQLResults.FixedCols := 1;
    sgSQLResults.FixedRows := 1;
    // Spaltenüberschriften setzen
    For nCol := 0 To FDLSQLResults.FieldCount - 1 Do
      sgSQLResults.Cells[nCol + 1, 0] := FDLSQLResults.Fields[nCol].FieldName;
    nLin := 0;
    // Daten im Stringgrid zeigen
    FDLSQLResults.First;
    While Not FDLSQLResults.Eof Do Begin
      For nCol := 0 To FDLSQLResults.FieldCount - 1 Do Begin
        sgSQLResults.Cells[nCol + 1, nLin + sgSQLResults.FixedRows] :=
FDLSQLResults.Fields[nCol].AsString;
      End;
      FDLSQLResults.Next;
      Inc(nLin);
    End;
  End;
End;

SQL-Befehl SELECT ausführen und Ergebnis im StringGrid zeigen

Try
  SQLConnection.Execute('SELECT * FROM Buecher', NIL, FDLSQLResults);
  ActionSQLResultsToStringGridExecute(Sender);
Except On E: EDatabaseError Do 
  ShowMessage(E.Message);
End;

SELECT Ergebnis TLabel und TEdit zuweisen

Das Ergebnis des SQL SELECT Befehls wird in einem TDataSet gespeichert.
Die Werte aus dem TDataSet können entsprechenden Komponenten wie TLabel, TEdit, TLabeledEdit usw. zugewiesen werden.

Var
  ledTitel: TLabeledEdit;
  lblTitel: TLabel;

// Tabelle Buecher, Spalte Titel Wert an TLabeledEdit und TLabel zuweisen
ledTitel.Text := FDLSQLResults.FieldByName('Titel').AsString;
lblTitel.Caption := FDLSQLResults.FieldByName('Titel').AsString;

SELECT Ergebnis TStringList und TListBox zuweisen

Das Ergebnis des SQL SELECT Befehls in einem TStringList speichern und anschließend einer TListBox zuweisen.

Stringlist erstellen:

Function BookTitelList(LSQL: String) : TStringList;
// Stringlist mit Buchtitel erstellen.
// SQL-Befehl „SELECT Titel FROM Buecher;“.
Var i: Integer;
  fSL: TStringList;
  DS: TDataSet;
Begin
  fSL := TStringList.Create;
  Try
    SQLConnection.Execute(LSQL, NIL, DS);
    DS.First;
    While Not DS.Eof Do Begin
      fSL.Add(DS.FieldByName('Titel').AsString);
      DS.Next;
    End;
  Except On E: Exception Do 
    ShowMessage(E.Message);
  End;
  Result := fSL;
End;

StringList TListBox zuweisen:

// TListbox Komponente hinzufügen
Var
  lbCodeList: TListBox;

// Alle Buchtitel in der Listbox zeigen.
lbCodeList.Items := BookTitelList('SELECT Titel FROM Buecher;');

Hinweis: SELECT-Befehl erweitern, z.B. mit WHERE ISBN = ‚123‘;

SELECT-Ergebnis in HTML-Tabelle ausgeben

Inhalt SQL-Tabelle in eine HTML Tabelle ausgeben und im Standardbrowser darstellen.

Procedure TfrmMain.ActionSQLSelectAllBooksToHTMLExecute(Sender: TObject);
Const
  CCRLF = #13#10;
  CHTMLCSS = '' + CCRLF +
    'table { width:100%; background-color:#D7E4F2; border:1px; } '+ CCRLF +
    'h1 { font:bold 2.0em Arial; color:#000080; background-color:#; border:1px; solid #000; vertical-align:top; overflow:hidden; }' + CCRLF +
    'th { font:bold 1.6em Arial; color:#000080; background-color:#F0F8FF; border:1px; solid #000; vertical-align:top; overflow:hidden; }' + CCRLF +
    'td { font:normal 1.0em Arial; color:#000000; background-color:#; border:1px; solid #000; vertical-align:top; overflow:hidden; }' + CCRLF +
    'div { font:normal 0.6em Arial; color:#000080; background-color:#; border:1px; solid #000; vertical-align:top; overflow:hidden; }' + CCRLF +
    '';
  CHTMLBEGIN = '' + CCRLF +
    '' + CCRLF +
    '' + CCRLF+ CHTMLCSS + CCRLF +
    '

Buchtitel

'; CHTMLEND = '

Erstellt mittels ropDelphiSQLite (c) 2013 Robert W.B. Linn, Pinnberg, Germany

'; Var DS: TDataSet; fSL: TStringList; sFile, sField: String; i: Integer; Begin Try SQLConnection.Execute('SELECT * FROM Buecher', NIL, DS); Except On E: Exception Do Begin ShowMessage(E.Message); Exit; End; End; If DS.IsEmpty Then Exit; sFile := ExtractFilePath(Application.ExeName) + 'booklist.htm'; fSL := TStringList.Create; fSL.Add(CHTMLBEGIN); fSL.Add(''); For i := 0 To FieldCount - 1 Do fSL.Add('' + DS.Fields[i].FieldName + ''); fSL.Add(''); DS.First; While Not DS.Eof Do Begin fSL.Add(''); For i := 0 To DS.FieldCount - 1 Do Begin sField := DS.Fields[i].AsString; If sField = '' Then sField := ' '; fSL.Add('' + sField + ''); End; DS.Next; fSL.Add(''); End; fSL.Add(CHTMLEND); fSL.SaveToFile(sFile); ShellExecute(Handle, NIL, PChar(sFile), NIL, NIL, SW_SHOW); End;

SELECT auf mehrere Tabellen (JOIN)

Beispiel: Alle Autor Name (Tabelle Autoren) und Titel (Tabelle Buecher) sortiert nach Autor Name ausgeben.

SQL-Befehl SELECT und Ergebnis:

SELECT sqlite_master

Die spezielle SQLite-Tabelle sqlite_master enthält alle Informationen über Tabellen, Indizes, Views, Trigger einer SQLite Datenbank.
Der SELECT-Befehl verwenden um Informationen aus der Tabelle sqlite_master zu lesen.
Das Ergebnis sind die Spalten type (table, index, view, trigger), name, tbl_name, rootpage und sql.

Beispiele anhand der Datenbank buecher.db
Alle Datensätze der Tabelle sqlite_master

SELECT * FROM sqlite_master;


Alle Tabellennamen der Tabelle sqlite_master

SELECT name FROM sqlite_master WHERE type="TABLE" ORDER BY name;

name
Autoren
Buecher
Log
sqlite_sequence

SELECT CAST ( Ausdruck AS Datentyp [ ( Länge ) ] )

CAST in SQLite konvertiert einen Ausdruck von einem Datentyp in einen anderen.

Beispiele
Die Tabelle sqlite_master enthält alle SQLite Datenbankinformationen, wie Tabellen, Indices, Views, Triggers.

Ausgabe Liste der Tabellentypen und Tabellenname:

Ohne Cast Mit Cast
SELECT type, tbl_name FROM sqlite_master SELECT type AS „Typ“, (CAST(tbl_name AS VARCHAR(10))) AS „Tabellen“ FROM sqlite_master