Databases in Lazarus/de

From Lazarus wiki
Revision as of 11:14, 3 August 2011 by Chronos (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Deutsch (de) | English (en) | español (es) | italiano (it)

Artikel über Datenbank-Programmierung

  • Lazarus-Datenbank-Tutorial - Eine Einführung über die Verwendung von Lazarus mit Datenbanken.
  • Datenbanken - Allgemeine Informationen über die Einsatzmöglichkeiten von Lazarus und FPC mit Datenbanken.
  • Datenbanken mit Lazarus - liefert einen allgemeinen Überblick über die Verwendung von Datenbanken mit Lazarus.
  • How to write in-memory database applications in Lazarus/FPC - Praktische Anweisungen zum programmieren mit MemDatasets
  • MySQLDatabases/de - erklärt, wie man auf eine einfachere Weise eine Verbindung mit einem MySQL Server herstellt.
  • Zeos_tutorial/de - Erzeugen von Datenbank-Anwendungen mit den Zeos-Komponenten.
  • Zeos+SQLite Tutorial - Gutes Tutorial mit Screenshots und Screencasts es wird auf spanisch erläutert, wie SQLite und Zeos, verwendet werden.
  • Pascal Data Objects is a database API that worked for both FPC and Delphi and utilises native MySQL libraries for version 4.1 and 5.0 and Firebird SQL 1.5, and 2.0. It's inspired by PHP's PDO class.
  • Lazarus Tdbf Tutorial/de - Datenbank-Entwicklung unter Verwendung der TDbf-Komponente (entwickelt von Micha Nelissen) mit Lazarus
  • Lazarus DB FAQ (deutsch) - Häufig gestellte Fragen zur Datenbank-Programmierung mit Lazarus.
  • Firebird - Firebird zusamen mit FPC/Lazarus verwenden
  • ODBCConn - Verwendung von 'ODBCConn' unter FPC/Lazarus für Verbindungen zu ODBC-Datenquellen.
  • MS Access - Zugriff auf eine MS-Access Datenbank

Ziel

Diese Seite liefert einen allgemeinen Überblick über die Verwendung von Datenbanken in Lazarus. Sie soll auch eine Seite sein, von der aus andere Datenbankseiten erreicht werden können.

Datasets

Die Verwendung von Datenbanken in Lazarus (oder FreePascal) basiert hauptsächlich auf der Klasse 'TDataset'. Diese repräsentiert für Ihre Anwendung eine Tabelle oder Abfrage. Aber wie bei vielen anderen fundamentalen Klassen, benutzen Sie nicht die Klasse 'TDataset' selbst, sondern einen Nachkommen von ihr. Davon gibt es viele. Sie bieten Zugriff auf unterschiedliche Arten von Datenbanken, sowohl auf lokale Datenbanken und Textdateien als auch auf Serverdatenbanken wie PostgreSQL, Firebird, MySQl und so weiter. Einige TDataset-Abkömmlinge linken direkt auf Datenbanktabellen, während andere dafür zusätzliche Komponenten oder Bibliotheken benötigen.

Die Seite Databases/de dokumentiert solche Nachkommen.

Dataset-Nachkommen die nichtvisuelle Komponenten sind, finden Sie (normalerweise) als Teil der Free Component Library (FCL), seltener in der Lazarus Component Library (LCL).

Verwendung von Datasets

Sie können Datasets programmatisch oder auch mit visuellen Steuerelementen verwenden. Eine typische Lazarus-Datenbankanwendung benutzt oft beide Verfahren. In jedem Fall ist der erste Schritt das Erzeugen eines TDataset-Nachkommen, ihn zu initialisieren für eine Verbindung mit der gewünschen Tabelle oder Abfrage, und diese zu öffnen. Dies kann entweder im Code zur Laufzeit geschehen oder Sie geben eine Komponente auf Ihr Formular und stellen deren Eigenschaften zur Entwurfszeit ein. Die Details dazu unterscheiden sich erheblich (abhängig von den verschiedenen TDataset-Nachkommen), schauen Sie also unter Databases/de nach, was für Ihre jeweilige Datenbank gemacht werden muss.

Wenn das Dataset geöffnet ist, wird eine Anzahl von Feldkomponenten erzeugt, eine für jedes Feld oder jede Spalte Ihrer geöffneten Tabelle oder Abfrage. Jede Feldkomponente ist ein Nachkomme von TField, passend für den besonderen Datentyp des Feldes, z.B. TStringField.

Verwendung von Datasets aus dem Code heraus

Der programmatische Zugriff wird detaillierter erklärt in Using Dataset and Field components, aber als sehr einfacher Überblick folgendes:

  • Nehmen Sie einen TDataset-Nachkommen zum Öffnen der Tabelle oder Abfrage, zum Filtern der Zeilen nach gewünschten Daten, und zum Bewegen von Zeile zu Zeile.
  • Nehmen Sie die TField-Nachkommen für:
    • den Zugriff auf allgemeine Informationen über Felder
    • den Zugriff auf bestimmte Datenwerte der aktuellen Zeile. (Verwenden Sie Eigenschaften 'As...', wie in AsString, AsInteger, etc.)
  • Greifen Sie auf die Felder des TDataset-Nachkommen zu, entweder durch:
    • die Eigenschaft 'Fields', z.B. Fields[0] ist das erste Feld, oder durch
    • die Methode 'FieldByName', z.B. FieldByName('ALTER') ergibt das Feld verbunden mit dem Datenbankfeld namens 'ALTER'

Verwendung der visuellen (datenabhängigen) Steuerelemente

Um Datenbanken in einer einfachen, grafischen Lazarus-Anwendung zu benutzen, konfigurieren Sie üblicherweise den TDataset-Nachkommen zur Entwurfszeit und verwenden dann die datenabhängigen Steuerelemente. Dazu ist folgendes nötig:

  • Fügen Sie einen TDataset-Nachkommen für die Datenbank Ihrer Wahl Ihrem Formular hinzu, zusammen mit etwaigen Hilfskomponenten, und öffnen Sie die ihn (Setzen Sie die Eigenschaft 'Active' auf 'true').
  • Fügen Sie eine TDatasource-Komponente (von der Komponentenseite "Data Access") zu Ihrem Formular hinzu, und "verknüpfen" Sie diese mit dem Dataset (= setzen Sie die Eigenschaft 'DataSet').
  • Fügen Sie datenabhängige Steuerelemente (von der Komponentenseite "Data Controls") zu Ihrem Formular hinzu, und verknüpfen Sie ein jedes mit der Komponente 'DataSource' (nicht 'Dataset'!).
  • Die meisten Steuerelemente verknüpfen ein einzelnes Feld, deshalb müssen Sie auch das Feld genau angeben.

Siehe #Data Controls unten für weitere Details über die Steuerelemente

Status der Datenmengen (Datasets)

Datasets können mehrere Zustände einnehmen. Obwohl es mehr solche gibt (-sehen Sie dazu im Quelltext von 'TDataSetState' nach-), sind die wichtigsten, die Sie anfangs kennen sollten:

Status Funktion
dsInactive Die Datenmenge ist geschlossen.
dsBrowse Der Benutzer kann durch die Datenmenge blättern und die Werte betrachten.
dsEdit Der Benutzer kann die Werte der aktuellen Zeile bearbeiten. Die Werte werden erst gespeichert, wenn das Senden (engl. "post") ausgeführt wurde.
dsInsert Eine neue Zeile wurde angefügt und der Benutzer kann die Werte eingeben. Dieser Datensatz wird erst gespeichert, wenn das Senden (engl. "post") ausgeführt wurde.

Die anderen Zustände sind ziemlich vorübergehend und werden normalerweise "automatisch" verarbeitet. Sie werden nur intern und in komplizierterem Code gebraucht. Falls Ihre Datenbank nur die Daten anzeigt, und Sie die Datenmenge zur Entwurfszeit öffnen, können Sie den Status überhaupt ignorieren, da er meisten bei 'dsBrowse' liegt. Trotzdem werden die meisten Anwendungen irgendwann auch die Daten ändern müssen. Wenn Sie dazu datenabhängige Steuerelemente benutzen, werden diese viele Dinge automatisch regeln. Wenn Sie beispielsweise den Text in einem DBEdit-Steuerelement ändern, versetzt dieses die Datenmenge in den Zustand 'dsEdit' - außer sie ist bereits in 'dsEdit' oder 'dsInsert'. Wenn Sie zu einem anderen Datensatz "springen" während der Status bei 'dsEdit' oder 'dsInsert' ist, dann wird dieser Datensatz "gesendet" und die Datenmenge kehrt zurück zum Zustand 'dsBrowse'. Falls Sie allerdings aus Ihrem Code heraus auf die Datenmenge zugreifen, werden Sie auch öfter den Status im Code ändern müssen. Das Steuerelement dbNavigator (siehe unten) erlaubt dem Benutzer ausdrücklich, auch den Zustand zu ändern.

Senden und Abbrechen (Post and Cancel)

Wenn Sie einen Datensatz bearbeitet oder eingefügt haben, werden die neuen Werte in einem Puffer gehalten.

  • Der Aufruf der TDataset-Methode 'Cancel' entfernt einen neu eingefügten Datensatz oder setzt die bearbeiteten Werte auf die vorherigen Werte zurück.
  • Der Aufruf der TDataset-Methode 'Post' speichert die bearbeiteten Werte oder den eingefügten Datensatz. Bei einigen Nachkommen von TDataset werden diese sofort in die Datenbank geschrieben, während diese bei anderen erst zu einer Änderungsliste gespeichert werden bis ein weiterer Aufruf sämtliche Änderungen in der Datenbank speichert. Möglicherweise müssen Sie sogar noch eine Methode "commit" aufrufen, damit die Datenbank Ihre Änderungen endgültig übernimmt. All dies variiert aber mit dem eingesetzten TDataset-Nachkommen, schlagen Sie also die Details für den von Ihnen benutzen nach.

Datensteuerelemente

Um diese Steuerelemente zu verwenden, fügen Sie das Steuerelement Ihrem Formular hinzu und setzen Sie zumindest die Eigenschaft 'Datasource'. Andere wichtige Eigenschaften sind angegeben.

Steuerelemente für einzelne Felder

Diese Steuerelemente betreffen alle ein einzelnes Feld. Geben Sie neben der Datenquelle 'Datasource' auch den Feldnamen an. Diese Steuerelemente enthalten:

Das Steuerelement DBGrid

Dieses Steuerelement zeigt mehrere Felder in einem Gitterlayout an - als Vorgabe werden alle angezeigt. Mit individuellen Einträgen in derColumns collection schränken Sie sich auf bestimmte Felder ein und legen die Breiten und Titel der einzelnen Spalten fest.

Derzeit scheint es einige Probleme mit dem Bearbeiten in dbGrid zu geben. Obwohl das Bearbeiten also möglich ist, ist es sicherer, nur Daten anzuzeigen (-setzen Sie 'readonly' auf 'true') und verwenden Sie zum Bearbeiten Einzelfeldsteuerelemente.

Das Steuerelement Navigator

Dieses Steuerelement gibt dem Benutzer die direkte Kontrolle über die Datenmenge. Es erlaubt dem Benutzer folgendes:

  • Bewegen zm nächsten oder vorigen Datensatz, zum Anfang oder zu Ende der Datensätze
  • Hinzufügen eines neuen Datensatzes (äquivalent zum Aufruf der Methode 'dataset.insert')
  • die Datenmenge in den Edit-Modus zu stellen
  • Löschen eines Datensatzes
  • Senden oder Abbrechen der aktuellen Änderungen (Post or Cancel)
  • Wiedereinlesen der Daten (nützlich in Mehrbenutzer-Datenbankanwendungen)

Schlüsseleigenschaften:

  • VisibleButtons: Überlässt Ihnen die Kontrolle über die für Benutzer erlaubten Aktionen. Beispiel: wenn das Löschen nicht gestattet ist, verstecke den Löschknopf. Oder Sie entschließen sich, in einem DBGrid nicht die Knöpfe 'Nächster' und 'Voriger' anzuzeigen.
  • Width: Wenn Sie nicht alle Knöpfe anzeigen, setzen Sie vielleicht die Breite auf (Höhe*Anzahl_der_sichtbaren_Buttons)