Auf deutsch anzeigenDisplay in English

 

:: Home  :: Sitemap  :: Downloads  :: Shop  :: Impressum  :: Newsletter

:: Produkte  :: Support  :: dataweb

Support

:: NEWS :: Mit NShape können Entwickler MS Visio-ähnliche Funktionalität in Ihre Anwendungen integrieren. NShape ist Open Source und speziell für industrielle Anwendungen gemacht. Mehr...

Support-Optionen ::
Häufig gestellte Fragen ::
Produktdokumentation ::
Ergänzendes Material ::
Diskussions-Forum ::
NShape Feedback ::
Partner ::
Service-Releases ::
Artikel ::
Datenbank- und SQL-Links ::
ISAPI-Links ::

Alternative gesucht!

Die Borland Database Engine hat den Delphi-Entwickler lange Zeit begleitet, hat ihm gute Dienste geleistet und ihn manchmal auch geärgert. Nun entwickelt Borland sie nicht mehr aktiv weiter und bietet insbesondere auch keine Linux-Version für Kylix an, was die Portierung von Delphi-Anwendungen - insbesonder von Web-Server-Applikationen - deutlich behindert. Aber auch reine Windows-Programmierer müssen sich früher oder später nach einem Ersatz umsehen. Dieser Artikel bespricht die deutsche BDE-Alternative TurboDB und untersucht insbesondere, wie einfach vorhandene Applikationen damit tatsächlich zu portieren sind.

Doch bevor man sich für ein spezielles Produkt entscheidet, steht erst einmal die grundlegendere Frage an, welchen Typ von Datenbank man einsetzen will. Soll es ein leistungsfähiger Open Source-Server wie Interbase sein? Oder lieber eine teure Edelversion wie DB2 oder Oracle? Greift man zu gut und preiswert der Marke MS oder zu Delphi-spezifischen Exoten wie z.B. Advantage? Man muss sich ja auch nicht auf ein spezielles Produkt festlegen, mit dbExpress, ADO oder ODBC kann man sich etwas Unabhängigkeit sichern. Und schließlich gibt es noch die Kategorie der klassischen Datei-basierten Datenbanken wie Apollo, DBISAM und TurboDB. Die Zahl der Optionen ist hier so hoch, dass sich der anonyme Kolumnist in der aktuellen Ausgabe des englischsprachigen Delphi Magazine zum Verfassen eines Songs inspiriert gefühlt hat: "Fifty Ways to Write a Database App" (zu singen nach der Melodie "Fitfty Ways to leave your lover" von Paul Simon).

Desktop oder Server?

Auch wenn man nicht auf die Idee kommen würde, Unternehmens-weite Anwendungen auf der Basis einer Desktop-Datenbank zu implementieren, gibt es doch eine ganze Reihe von Gründen, warum diese Kategorie in vielen Fällen eine sinnvolle Option darstellt. Desktop-Datenbanken

  • erfordern erheblich weniger Aufwand bei der Umstellung von der BDE
  • haben ein einfacheres Programmiermodell (ISAM)
  • sind einfacher bei der Installation, Konfiguration und Wartung
  • lassen sich auch von CD aus benutzen
  • kosten keine Lizenzgebühren
  • ermöglichen oft eine direkteres Feedback, wenn andere Applikationen Datenänderungen vornehmen
  • verursachen als Web-Anwendung weniger Administrations-Aufwand

Um den ersten Punkt dieser Liste zu untermauern, sehen wir uns am Beispiel der TurboDB-Komponenten (dataweb GmbH) an, welchen Aufwand die Portierung einiger BDE-Beispiel-Anwendungen aus dem Demo-Verzeichnis von Delphi verursacht. Da TurboDB auch für Kylix verfügbarist, haben wir die Resultate dann gleich für Linux übersetzt und damit eine Plattform-übergreifende Lösung geschaffen. Für diesen Beitrag, verwenden wir die aktuelle Version 3.4 dieser Komponenten.

TurboDB kommt als Komponentensammlung mit je einer Komponenten-Klasse für Tabelle (TTdbTable), Datenbank (TTdbDatabase), Abfrage (TTdbQuery) und als Besonderheit auch Stapelverarbeitung (TTdbBatchMove). Selbstverständlich sind TTdbTable und TTdbQuery von TDataSet abgeleitet und damit kompatibel mit allen Daten-sensiblen Steuerelement.

Komponenten-Palette

Bild 1: Nach der Installation von TurboDB befinden sich vier neue Komponenten in der Palette.

Darüberhinaus hat sich dataweb auch Mühe gegeben, die zusätzlichen Methoden und Eigenschaften wie z.B. TTable.CreateTable, TTable.AddIndex, TTable.GotoKey, TQuery.Prepare und TQuery.DataSource getreu nachzubilden und damit die Portierung zu erleichtern.

TurboDB als Alternative

Neben den üblichen Merkmalen, weist TurboDB einige Besonderheiten auf, die einen Einsatz interessant machen. Da ist zum einen die schon erwähnte Plattform-Unabhängigkeit, aber auch die Fähigkeit, einen Volltext-Index über eine Tabelle anzulegen und dann sehr schnell nach Begriffen in beliebigen Feldern zu suchen. Das funktioniert ganz ähnlich wie eine Suchmaschine im Internet.

Bemerkenswert ist auch die Unterstützung für die Tabellen-Verknüpfung. Das ADL genannte System basiert auf speziellen Datentypen für die 1:N- und die M:N-Verknüpfung. Bei der 1:N-Verknüpfung enthält die Spalte der Detail-Tabelle eine eindeutige Nummer als Verweis auf den Master-Datensatz. Diese eindeutige Nummer wird wie bei einem Zähler oder AutoInc-Feld für jeden Datensatz der Master-Tabelle automatisch erzeugt. ADL kümmert sich bei der Eingabe von Detail-Datensätzen darum, dass der entsprechende Master-Datensatz auch tatsächlich existiert.

Bei der M:N-Verknüpfung legt TurboDB transparent eine Zwischen-Tabelle an, welche mittels zweier 1:N-Verknpfungen die M:N-Verknüfpung realisiert. So einfach haben Sie noch nie Tabellen verknüpft! Puristen werden einwenden, dass damit das relationale Modell durchbrochen wird und hierarchische Elemente Einzug halten. Aber das Verfahren ist wirklich nützlich und außerdem muss man es ja nicht einsetzen. Alle normalen relationalen Mechanismen wie z.B. Joins funktionieren ebenfalls.

Für unser Vorhaben haben wir einige Anwendungen aus den von Borland gelieferten Beispielprogrammen ausgewählt. Für den Einstieg das sehr einfache aber wegen seiner schönen Bilder immer wieder gern gesehene Fish Fact. Als Beispiel für das Filtern in Datenmengen die Anwendung Filter, Stock Browser für den Einsatz von berechneten und Lookup Fields sowie Marine Adventures (MastApp) als Beispiel für eine Anwendung mit etwas mehr Datenbank-Komponenten (zehn Tabellen und fünf Abfragen). Schließlich noch der auf WebSnap basierende CountryEditor als Vertreter der Gattung Web-Applikationen. Das Beispiel mit einem konkreten Produkt soll nicht nur zeigen, wie die Umstellung für TurboDB aussieht, sondern auch eine Vorstellung davon vermitteln, wie eine Portierung generell vor sich gehen kann.

Assistierte Portierung

TurboDB unterstützt den Entwickler dabei durch einen Assistenten, der die Daten einer BDE-Tabelle direkt in eine TurboDB-Tabelle übernimmt (Bild 2).

Import Assistent

Bild 2: In drei Schritten wird eine BDE-Tabelle in eine TurboDB-Tabelle konvertiert.

Grundsätzlich geht die Portierung in drei Schritten vor sich. Zuerst entfernt man die TDatabase- und TSession-Komponenten und ersetzt sie durch eine TTdbDatabase-Komponente. Ähnlich wie z.B. bei den IBX Controls unterscheidet TurboDB nicht zwischen Datenbank und Sitzung. Als nächstes legt man je eine TTdbTable-Komponente neben jede TTable-Komponente und eine TTdbQuery-Komponente neben jede TQuery-Komponente und startet den Konvertierungs-Assistenten.

Im Falle einer Tabelle kann man hier nach der Auswahl der Quell-Komponente einen Datei-Namen für die neu zu erstellende TurboDB-Komponente eingeben. Der Assistent erzeugt eine neue Tabelle und übernimmt die Daten aus der BDE-Tabelle. Dabei ist es gleichgültig, ob es sich bei der BDE-Tabelle um ein dBase-Format oder um Paradox handelt. Gleichzeitig werden alle Indexe entsprechend den Indexen der BDE-Tabelle generiert. TurboDB unterstützt sowohl Index-Ausdrücke wie in dBase als auch normale hierarchische Indexe, die über eine Feldliste definiert sind. Der Assistent übernimmt auch die relevanten Eigenschaften der TTable in die TTdbTable. Die Definition der Master-Tabelle in der Eigenschaft DataSource lässt er dabei aber weg, weil es sonst zu Verwirrungen zwischen den DataSets und DataSources kommt. Hier muss man anschließend noch per Hand nacharbeiten, genauso übrigens wie bei den Feldern in der Eigenschaft Fields.

Die Übernahme einer Abfrage ist im Vergleich sehr einfach. Der Assistent kopiert alle Eigenschaften von TQuery nach TTdbQuery und ist damit schon fertig. Im Gegensatz zu Tabellen werden Abfragen übrigens prinzipiell nicht automatisch geöffnet. Die Wahrscheinlichkeit ist zu groß, dass noch nicht konvertierte Tabellen in der Abfrage benutzt werden oder dass ein neuer Tabellenname nicht mit einem alten Tabellennamen übereinstimmt.

Vertrauen ist gut, ...

Nachdem man alle DataSets übernommen hat, sollte eine Kontrolle der Eigenschaften und Verweise erfolgen. Gleichzeitig kann man nun evtl. vorhandene TField-Objekte aus dem Feldeditor der BDE-Komponente ausschneiden und im Feldeditor der TurboDB-Komponente wieder einfügen. Es ist wichtig, die Felder auszuschneiden und nicht nur zu kopieren, da Delphi ansonsten neue Komponenten-Namen im Formular ermittelt. Eine längere Editier-Aktion zum Austausch der entsprechenden Bezeichnungen wäre dann die Folge.

Nun folgt der entscheidende Schritt: Alle BDE-Komponenten werden aus dem Formular gelöscht und die TurboDB-Komponenten so umbenannt, dass sie die BDE-Komponenten im Quellcode ersetzen. Damit sollte die Umstellung beendet sein. Die Anwendung wird übersetzt und gestartet.

Wenn das Programm auch unter Linux laufen soll, kommen natürlich noch die dazugehörigen Portierungsschritte hinzu. Die VCL-Units werden durch ihre CLX-Gegenstücke ersetzt, Pfadnamen müssen die jeweiligen Konventionen berücksichtigen, usw.

Zur Tat

Zum Einstieg nehmen wir uns Fish Fact vor, das unter demos\db\ im Delphi-Verzeichnis zu finden ist. Die Anwendung wird geöffnet und unter einem anderen Namen gesichert. Sie enthält nur eine einzige Tabelle, die nach der oben beschriebenen Vorgehensweise konvertiert wird. Wenn man nun zusätzlich noch die Schritte für VCL-nach-CLX-Portierung durchführt, hat man auch schon eine Fish Fact unter Linux.

Das nächste Demo-Programm heißt Filter und demonstriert den Einsatz eines Daten-Modus mit einer TQuery, die über ihre DataSource-Eigenschaft mit einer Master-Tabelle verknüpft ist, um Detail-Datensätze anzuzeigen. Außerdem werden Filter sowohl über die Filter-Eigenschaft als auch über das OnFilterRecord-Ereignis gesetzt. Auch hier führt die Umstellung sofort zum Erfolg. Insgesamt dauert die Portierung inklusive der Umstellung auf Kylix nur ca. 20 Minuten.

Ein kleines Problem tauchte beim Testen mit GdsDemo auf. Hier wird visuelle Form-Vererbung eingesetzt, indem die tabellarische Darstellung der Daten in einem Grid und die satzweise Darstellung in Daten-sensiblen Eingabefeldern in zwei verschiedenen Formularen realisiert sind, die aber beide vom selben Basisformular abgeleitet sind. Die TDatabase -Komponente liegt in diesem Demo auf dem Basisformular, wodurch zur Laufzeit drei Instanzen davon erstellt werden. Da in TurboDB die Datenbank mit der Sitzung identisch ist, würde eine eins-zu-eins-Übertragung dieser Struktur zu drei verschiedenen Sitzungen führen, was sicher nicht gewollt und von TurboDB auch nicht unterstützt wird. Deshalb muss man hier entweder auf die Datenbank-Komponente ganz verzichten oder sie in ein Daten-Modul auslagern, so dass sie nur ein einziges mal instanziiert wird.

Der Stock Browser aus demos\db\ctrlgrid setzt ein Control Grid und berechnete Felder ein. Summen werden zur Laufzeit durch eine Schleife über eine Detail-Tabelle berechnet. Felder werden über eine Format-Spezifikation formatiert, und außerdem verwendet der Stock Browser Bookmarks, um nach dem Berechnen der Summen wieder den aktuellen Datensatz zu finden. Die Konvertierung von der BDE nach TurboDB verlief weitgehend ohne Probleme. Allerdings überschrieb der Konvertierungs-Assistent einen der Indexe, weil zwei Index-Namen identisch waren und wir mussten den entsprechenden Index mit dem TurboDB Index Manager neu generieren. Gleichnamige Indexe sind in Paradox keine Schwierigkeit, weil die Dateinamen nur durchnummeriert werden. In TurboDB dagegen sind die Dateien nach den Indexen benannt, so dass es keine gleichen Index-Namen für verschiedene Tabellen im selben Verzeichnis geben darf.

Die größte Anwendung, die in den Delphi-Demos enthalten ist, heißt Marine Adventures und ist im Verzeichnis demos\db\mastapp\ zu finden. Sie ist nicht nur wegen der größeren Zahl an Datenbank-Komponenten interessant sondern auch deshalb, weil sie relativ viel Datenbank-bezogenen Code sowie mit QuickReport erstellte Berichte enthält. In Bild 3 ist das Daten-Modul vor und nach der Umstellung angezeigt.

Datamodule MastData in BDEDatamodule MastData mit TurboDB

Bild 3: Das Datenmodul von Marine Adventures vor und nach der Umstellung.

Trotz des Assistenten beginnt die Portierung hier in Arbeit auszuarten, einfach weil man den Prozess 16 mal wiederholen muss. Ansonsten geht auch hier bis auf eine Stelle alles glatt. TurboDB unterstützt keine Cached Updates, d.h. alle Datensätze werden sofort in die Datenbank geschrieben. Das ist auch das Standard-Verhalten der BDE, allerdings beherrscht sie auch das Zwischenspeichern geänderter Datensätze und diese Option wird in MastApp verwendet. Bei der Konvertierung haben wir deshalb einfach auf die Möglichkeit, mehrere Datensatzänderungen am Stück rückgängig zu machen verzichtet. Ansonsten funktionierte alles klaglos und die Linux-Version war in weniger als einer Stunde fertiggestellt (Bild 4).

MastApp unter Linux

Bild 4: Dies ist wohl die erste Linux-Version der Marine Adventures. Die Reports konnten wir allerdings nicht portieren, weil es für Kylix noch keinen Ersatz zu QuickReports gibt

Zum Abschluss haben wir uns noch eine WebSnap-Anwendung vorgenommen. Für solche Web-basierte Anwendungen ist die BDE ganz besonders ungeeignet. Welcher Netzwerk-Adminstrator oder gar Internet-Provider möchte schon gerne die Borland Database Engine auf seinem Web-Server installieren? Außerdem scheiden Linux Web-Server damit von vorneherein aus und davon gibt es bekanntlich ziemlich viele. Der WebSnap-Framework selbst ist dagegen sowohl für Delphi 6 verfügbar als auch für Kylix 2. Das bedeutet, dass man WebSnap und TurboDB Datenbank-basierte Web-Applikationen erstellen kann, die keine externe Datenbank-Installation (BDE, MySQL, Interbase o.ä.) benötigen und dabei auch noch sowohl für Windows als auch Linux übersetzt werden können. Eine mit WebSnap erstellte Anwendung kann damit durch simples Uploaden in ein ausführbares Verzeichnis installiert werden. Eine Einschränkung gibt es allerdings mit der aktuellen Version von TurboDB: Das sie nicht Multi-Threading fähig ist, können ISAPI-Module nicht ohne weiteres übernommen werden. Hier muss man mit einer CriticalSection dafür sorgen, dass immer nur ein Zugriff gleichzeitig auf die Datenbank-Engine erfolgt. CGI- und Apache-Module basieren nicht auf Multi-Threading und stellen somit kein Problem dar.

Als Beispiel wählen wir den eher simplen Country Editor. Er erlaubt das Editieren einer Länderliste im Web-Browser und benötigt dazu nur eine TSession- und eine TTable-Komponente. Diese werden durch eine TTdbDatabase und ein TTdbTable ersetzt und die Datenbank-Tabelle konvertiert. Die Anwendung läuft sofort und lässt sich anders als das BDE-Beispiel ohne weiteres auf einem beliebigen ausführbaren Web-Verzeichnis in Betrieb nehmen (Bild 5).

WebSnap

Bild 5: Der Country-Editor läuft auf einem Web-Server ohne Datenbank-Server und BDE-Installation. In diesem Fall handelt es sich um den IIS aber der selbe Quellcode ist auch für Apache und Linux übersetzbar.

Die mit TurboDB übersetzte Anwendung ist nur um 300 KB größer als die entsprechende BDE-Anwendung, obwohl sie den gesamten Datenbank-Code enthält und keine Treiber oder DLLs benötigt.

Zusammenfassend können wir festhalten, das die Portierung an sich erstaunlich wenig Schwierigkeiten gemacht hat. Einige kleine Haken sind aufgetreten, konnten aber leicht behoben werden, sobald die Ursache ermittelt war. Definitiv nicht in Frage kommt diese Lösung eigentlich nur für Entwickler, die mit Multi-Threading oder Cached Updates arbeiten müssen. Ansonsten stellt TurboDB eine problemlose und leistungsfähige Alternative zur BDE dar. Dies gilt sowohl für Desktop- als auch für Web-Anwendungen und beschränkt sich nicht auf die Plattform Windows. Gerade auch für Linux-Applikationen oder Plattform-übergreifende Anwendungen bietet sich TurboDB an.