Harbour Handbuch – DE
HTML-Ausgabe

Kapitel 6

Hinweis: Dies ist die vollständige deutsche Übersetzung des Kapitels. Die Codebeispiele sind sprachunabhängig gültig.

Kapitel 6: Dateien und Datenbanken

Dieses Kapitel behandelt die Fähigkeiten von Harbour zur Dateiverarbeitung – vom Low-Level-Dateizugriff bis zur Datenbankverwaltung, einem Grundpfeiler der Sprache.

Low-Level-Dateizugriff

Harbour bietet – ähnlich wie C – eine Reihe von Funktionen für den direkten Dateizugriff auf Betriebssystemebene. Diese Funktionen ermöglichen vollständige Kontrolle über Lese- und Schreibvorgänge. Sie eignen sich ideal für Textdateien, Konfigurationsdateien, Binärdateien oder andere Formate, die .dbf nicht verwenden.

Die wichtigsten Funktionen sind:

Weitere Funktionen:


// Beispiel: Schreiben und Lesen im Low-Level
#include "fileio.ch"

PROCEDURE Main()
    LOCAL hFile, cTexto

    // Datei erstellen und schreiben
    hFile := FCREATE( "test.txt" )
    IF hFile != -1
        FWRITE( hFile, "Hallo, Harbour!" )
        FCLOSE( hFile )
        ? "Datei 'test.txt' wurde erstellt."
    ELSE
        ? "Fehler beim Erstellen der Datei."
    ENDIF

    // Datei öffnen und lesen
    hFile := FOPEN( "test.txt", FO_READ ) // FO_READ = 0
    IF hFile != -1
        cTexto := Space( 1024 )
        FREAD( hFile, @cTexto, 1024 )
        FCLOSE( hFile )
        ? "Inhalt:", Trim(cTexto)
    ELSE
        ? "Fehler beim Öffnen der Datei."
    ENDIF
RETURN

Das .dbf-Dateiformat

Das Herzstück der Datenverwaltung in Harbour ist das Format .dbf, übernommen von dBase – ein Standardformat zur Speicherung tabellarischer Daten.

Ein .dbf-Datei besteht aus zwei Hauptteilen:

  1. Kopfbereich (Header): Metadaten – Anzahl der Datensätze, Spaltennamen, Typen (Zeichen, Zahl, Datum, Logik, Memo), Länge, Dezimalstellen etc.
  2. Datensätze (Records): Eine Sequenz fester Länge mit den eigentlichen Daten.

Diese Struktur ermöglicht einen schnellen Zugriff durch Harbour.

Datenbankfunktionen

Harbour stellt eine einfach zu benutzende Sprache zur Bearbeitung von .dbf-Dateien bereit.


// Beispiel: Datensatz hinzufügen
PROCEDURE Main()
    IF !File("kunden.dbf")
        dbCreate( "kunden.dbf", { ;
            { "NAME", "C", 25, 0 }, ;
            { "STADT", "C", 20, 0 }, ;
            { "ALTER", "N", 3, 0 } ;
        } )
    ENDIF

    USE "kunden.dbf"

    APPEND BLANK
    REPLACE NAME  WITH "Max Mustermann"
    REPLACE STADT WITH "Berlin"
    REPLACE ALTER WITH 42

    COMMIT
    CLOSE DATABASES
    ? "Datensatz hinzugefügt."
RETURN

Indizes: Schnelle Suche

Bei großen Tabellen ist sequentielles Suchen langsam (LOCATE). Dafür verwendet man **Indizes**.

Ein Index (.ntx) ist eine sortierte Kopie eines oder mehrerer Felder. Suchen über Indizes sind deutlich schneller, da direkt zur Position im .dbf gesprungen wird.


// Beispiel: Index-Nutzung
USE "kunden.dbf"
IF !File("kunden.ntx")
    INDEX ON NAME TO "kunden"
ENDIF

SET INDEX TO "kunden"
SEEK "Max Mustermann"

IF Found()
    ? "Gefunden:", NAME, STADT
ELSE
    ? "Kunde nicht gefunden."
ENDIF
CLOSE DATABASES

Relationale Datenbanksysteme (RDDs)

Eine der stärksten Funktionen von Harbour ist das Konzept der **austauschbaren Datenbanktreiber** (RDD = Replaceable Database Drivers).

Dank RDDs bleibt der Code für USE, SEEK, REPLACE etc. gleich – egal ob du .dbf, SQLite oder MySQL nutzt. Harbour abstrahiert das Datenbanksystem.


// Beispiel: FoxPro-kompatibler Treiber
REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")
USE "lieferanten.dbf"
...

Harbour unterstützt nativ DBFNTX, DBFCDX, DBFNSX sowie externe RDDs für moderne Systeme wie **PostgreSQL, MySQL, SQLite, Oracle** – perfekt für Client/Server-Architekturen.