Lazarus Tdbf Tutorial/de

From Lazarus wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) português (pt) русский (ru) 中文(中国大陆) (zh_CN)


Zurück zu den Zusätzlichen Informationen.


Überblick

Dieses Tutorial behandelt die grundlegende Datenbank Entwicklung unter Verwendung der TDbf Komponente (entwickelt von Micha Nelissen) mit Lazarus. Zusätzliche Dokumentation für TDbf ist verfügbar. Diese Seite wurde erstellt von Tony Maro aber auch andere Mitwirkende sind willkommen!

Für ein TDbf Dokumentation PDF gehen sie zur SourceForge Seite. Es mag hilfreich sein, während des Lesens das PDF neben dieses Dokument zu halten.

Was sie benötigen werden

Das DBFLaz Package wird inzwischen standardmäßig bei der Installation von Lazarus mitinstalliert. Die TDbf Komponente befindet sich auf der 'Data Access' Seite in der Komponentenpalette.

Was TDbf bietet

TDbf bietet Zugriff auf dBase und FoxPro Datenbank Tabellen für Lazarus (und andere). Es erlaubt das Lesen, Schreiben und Erzeugen von dBase III+, dBase IV, Visual dBase VII und FoxPro Tabellen. Es tut alles das, ohne zusätzliche Bibliotheken oder Datenbank Engines zu benötigen. Einfach TDbf auf ihrem Formular ablegen und sie haben sofortigen Zugriff auf eine cross-platform Datenbank-Umgebung. TDbf funktioniert unter Windows und Linux unter Verwendung von Lazarus.

Wie man eine neue Datenbank Tabelle erzeugt

Da es noch keine "Datenbank Desktop" Anwendung für Lazarus gibt, müssen wir eine neue Datenbank im Code erzeugen.

Setzen des Pfades

Es ist eine gute Idee, der Datenbank ihrer Anwendung ein eigenes Verzeichnis zu spendieren. Dies vereinfacht das Erstellen von Backups der Daten. Es gibt zwei Wege, um den Pfad zu setzen. Sie können den vollständigen Pfad setzen, indem sie die FilePathFull Eigenschaft nutzen, oder sie können einen Pfad relativ zur aktuellen Anwendung setzen mit FilePath. Zum Beispiel, das Setzen von FilePath zur Laufzeit auf "data/" würde ein data Unterverzeichnis nutzen einfach unter der .EXE Datei. Das Setzen der FilePathFull Eignschaft auf "/var/data/" würde alles in diesem bestimmten Ordner platzieren, den Ort der Anwendung ignorierend.

Wählen eines Tabellenlevels

Per Voreinstellung wird TDbf dBase IV Tabellen erzeugen. Während dies sehr kompatibel ist, gibt es Features, die sie benutzen möchten, die aber nicht unterstützt werden. Um auto-incrementing Felder zu unterstützen, müssen sie etwas neueres benutzen. Die Tabellentypen sind:

  • 3 dBase III+
  • 4 dBase IV
  • 7 Visual dBase VII
  • 25 FoxPro

Sie wählen einen Tabellentyp, indem sie die TableLevel Eigenschaft entsprechend setzen.

Hinzufügen von Feldern

Das Erzeugen von Feldern für ihre neue Tabelle zur Laufzeit folgt so ziemlich dem alten Delphi Standard. Sobald sie die FilePath, TableLevel, und TableName Eigenschaften gesetzt haben, manipulieren sie die FieldDefs Eigenschaft, um die Struktur festzulegen. Zum Beispiel:

 MyDbf.FilePathFull := '/Ort/für/meine/Daten';
 MyDbf.TableLevel := 7;
 MyDbf.TableName := 'customers.dbf'; // Notiz: Wird .dbf wirklich benötigt?
 With MyDbf.FieldDefs do begin
   Add('Id', ftAutoInc, 0, True);
   Add('Name', ftString, 80, True);
 End;

Feld Typen sind definiert als:

  • ftUnknown
  • ftString
  • ftSmallInt
  • ftInteger
  • ftWord
  • ftBoolean
  • ftFloat
  • ftCurrency (TableLevel 25)
  • ftBCD (TableLevel 25)
  • ftDate
  • ftTime
  • ftDateTime
  • ftBytes (TableLevel 25)
  • ftVarBytes
  • ftAutoInc (TableLevel 7 oder 25)
  • ftBlob
  • ftMemo
  • ftGraphic
  • ftFmtMemo
  • ftParadoxOle
  • ftDBaseOle
  • ftTypedBinary
  • ftCursor
  • ftFixedChar
  • ftWideString
  • ftLargeInt
  • ftADT
  • ftArray
  • ftReference
  • ftDataSet
  • ftOraBlob
  • ftOraClob
  • ftVariant
  • ftInterface
  • ftIDispatch
  • ftGuid
  • ftTimeStamp
  • ftFMTBcd

Fett geschriebene Typen werden gegenwärtig unterstützt.

In Delphi (RAD Studio 12) zusätzlich definierte Typen, die ebenfalls bisher nicht unterstützt werden:

  • ftOraTimeStamp
  • ftOraInterval
  • ftLongWord
  • ftShortint
  • ftByte
  • ftExtended
  • ftConnection
  • ftParams
  • ftStream
  • ftTimeStampOffset
  • ftObject
  • ftSingle

Erzeugen sie die Tabelle !

Sobald sie die Felder definiert haben, die sie in ihrer neuen Tabelle benutzen wollen, können sie vorangehen und sie mit:

    MyDbf.CreateTable;

erzeugen.

Wie man einen Index zu einer Tabelle hinzufügt

Wenn ihre Datenbank größer ist als ein paar Datensätze, wollen sie möglicherweise Indizes definieren, um das Suchen zu beschleunigen. Um die Indexstruktur einer Tabelle zu ändern, benötigen wir exklusiven Zugriff auf die Tabelle - welchen wir ohnehin haben, während wir ihn erzeugen.

        MyDbf.Exclusive := True;
        MyDbf.Open;

Nun, müssen wir einfach den Index hinzufügen.

        MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
        MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
        MyDbf.Close;

Alles zusammen ergibt...

Das folgende Beispiel erzeugt eine neue Tabelle "customers" im Code. Dies muss natürlich nur einmal getan werden, und danach öffnen sie die Tabelle nur, erzeugen sie sie nicht (erneut) ;-)

{$MODE OBJFPC}
Program DatabaseTest;  
{ Wir benötigen die folgenden Units im USES Abschnitt:       }
uses Dbf, db, Dbf_Common;            
{ Dbf wird automatisch eingetragen wenn TDbf auf einem Formular abgelegt }
{ wird...   aber sie benötigen db für das DataSet Objekt und }
{ Dbf_Common für Dinge wie die Feldtyp Definitionen          }

var
  MyDbf: TDbf;
begin
  MyDbf := TDbf.Create(nil);
  try
    { benutzen sie relative Pfade zum "data" Verzeichnis}
    MyDbf.FilePath := 'data/'; 

    { wir wollen Visual dBase VII kompatible Tabellen benutzen }
    MyDbf.TableLevel := 7;
    MyDbf.Exclusive := True;
    MyDbf.TableName := 'customers.dbf';
    With MyDbf.FieldDefs do begin
      Add('Id', ftAutoInc, 0, True);
      Add('Name', ftString, 80, True);
    End;
    MyDbf.CreateTable;

    MyDbf.Open;
    MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
    { fügt einen sekundären Index hinzu }
    MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
    MyDbf.Close;
  finally
    MyDbf.Free;
  end;
end.

Externe Index Dateien

TDbf unterstützt auch das Speichern von Sekundärindexen in einer separaten Datei. Dies mag hilfreich sein, wenn die Datenbank sehr groß ist. Sekundärindex Dateien werden fast identisch erzeugt wie normale Indexe, aber mit dem Anhängen der '.ndx' Dateierweiterung:

     MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);

Jedes Mal wenn TDbf geöffnet wird, muss die Indexdatei geladen werden:

     MyDbf.OpenIndexFile('custname.ndx');

Und Indexe müssen referenziert werden inklusive der Erweiterung:

     MyDbf.IndexName := 'custname.ndx';

Index Dateien werden separat komprimiert mit:

     MyDbf.CompactIndexFile('custname.ndx');

Wie man TDbf mit datensensitiven Komponenten verbindet

Das Beispiel oberhalb zeigt wie man eine neue Datenbank Tabelle erzeugt im Code. Das Benutzen dieser Tabelle ist sogar noch einfacher.

Datensensitive Komponenten in Lazarus (so wie das TDbEdit Bedienelement) verbinden sich mit einer TDataSource Komponente unter Verwendung ihrer DataSource und DataField Eigenschaften. Die TDataSource Komponente wickelt die Kommunikation zwischen der Datenbank-Engine und den datensensitiven Komponenten ab. Eine TDataSource verbindet sich dann mit der TDbf Komponente unter Verwendung ihrer DataSet Eigenschaft. Die Verbindung sieht wie folgt aus:

TDbEdit-------
             |
TDbEdit------|-->TDataSource-->TDbf
             |
TDbNavigator--


Stellen sie sicher, die FilePath (oder FilePathFull), TableLevel, und TableName Eigenschaften ihrer TDbf Komponente zu setzen bevor sie

TDbf.Active := True;

aufrufen.

Es gibt viel mehr als gesagt werden kann über die Programmierung mit Datenbanken in Lazarus, und ich würde ein gutes Delphi Datenbank Programmierung Buch oder zwei empfehlen da die grundlegenden Konzepte die selben sind. Ich verweise ständig auf mein Exemplar von "Delphi 2 Unleashed" weil die Konzepte und der wesentliche Code sich in 8 Jahren nicht sehr geändert haben.

Komprimieren und Erneuern der Tabellen

Wenn ein Datensatz gelöscht wird, ist er nicht wirklich aus der physikalischen Tabelle entfernt. Periodisch müssen sie eine Tabelle komprimieren, um diesen verlorenen Platz wiederzuerlangen. Dies sollte getan werden mit der Exklusivmodus Einstellung.

 MyDbf.Exclusive := True;
 MyDbf.Open;
 MyDbf.PackTable;
 // erneuert auch alle Indexe
 MyDbf.RegenerateIndexes;
 MyDbf.Close;
 MyDbf.Exclusive := False;

Master Tabellen Beziehungen

Wirkliche Leistung bei der Datenbank Programmierung beginnt wenn sie mehrere Tabellen haben, die sich auf einander beziehen. Während TDbf die referentielle Integrität noch nicht unterstützt, unterstützt es eine Master / Detail Beziehung zwischen TDbf's.

Wenn zwei Tabellen in Beziehung stehen, zum Beispiel:

[Kunden]
Id       <----|
Name          |
Phone         |
Address       |
              |  Die CustID in Rechnungen bezieht sich auf ein Kunden Primärfeld
[Rechnungen]  |
Id            |
Amount        |
CustID   -----|  * Diese Feld ist als as "idxcustid" indiziert


Wenn sie alle Rechnungen zu einem bestimmten Kunden anzeigen wollen, kann die Detailtabelle (Rechnungen) automatisch in Synchronizität mit der Mastertabelle (Kunden) bleiben.

In der Rechnungen TDbf Komponente stellen sie das Folgende ein:

 InvDbf.IndexName := 'idxcustid'; // unser Feld, das der Kunden Tabellen ID entsprechen wird
 InvDbf.MasterSource := dsCustomers; // Datasource die mit der Kunden TDbf verbunden ist
 InvDbf.MasterFields := 'Id'; // Feld in der Kunden Tabelle, das wir gegen unseren Index abgleichen

Beispielanwendung - DB Browser

Ich habe eine einfache Anwendung geschrieben, welche TDbf benutzt, um Datenbank Tabellen unter Verwendung des dbGrid Bedienelements zu öffnen und anzuzeigen. Das Linux executable zusammen mit den Projektquellen, welche auch unter Windows kompilieren sollten, ist verfügbar von: tony.maro.net

Dinge, deren sie sich bewusst sein müssen

Gegenwärtig gibt es keine Unterstützung für referentielle Integrität oder intern verschlüsselte .dbf Dateien.

See also