REIMERS CONSULT Company Logo

REIMERS CONSULT GmbH

Home Feedback Contents

RC.Sql Details

RC.Sql Product Logo medium

Datenbankzugriffsbibliothek


Eigenschaften von RC.Sql im Detail

Wartbarkeit
Bei Erweiterungen des Systems (z.B. neue Tabelle, Spalten,...) sind viele Fehler von vorne herein ausgeschlossen. Eine Fehlerquelle bei Statements auf der Basis von Strings ist das Weglassen von Tabellennamen als Präfix der Spalten, wenn die Spaltennamen eindeutig sind. Sollte die Datenbank einmal erweitert werden, und die Namen sind von da an nicht mehr einzigartig, muss ein zuvor geschriebenes Programm, das ohne Präfixe gearbeitet hat, aufwendig angepasst werden. Dies erübrigt sich generell unter Benutzung von RC.Sql. Die Namen der Tabellen sind in allen daraus erzeugten Objekten (wozu auch die Spalten gehören) immer enthalten.
Zur Verdeutlichung dieses wesentlichen Aspekts von RC.Sql ist folgendes Beispiel gegeben.
In einem Handelsunternehmen steht eine Datenbank für Kunden- und Warenverwaltung zur Verfügung. In einer Tabelle stehen Kunden, in einer anderen Waren, die an diese Kunden geliefert werden. Denkbar ist eine SQL-Abfrage in folgender Form:

Ausgabe aller Waren, die an Kunden im Inland geliefert werden.
Das Merkmal, ob eine Kunde im Inland angesiedelt ist, nimmt sich eine Methode, die die Kundentabelle kennt, aus der Anschrift des Kunden. Die Hauptroutine, die Waren anzeigen soll, kennt diese Tabelle. Die Anfrage kann also erzeugt werden.
Jetzt wird der Kundenstamm deutlich erweitert. Die Methode aus der Adresse das Herkunftsland zu bestimmen wird ineffizient, und man beschließt, eine neue Tabelle anzulegen, die das Land des Kunden enthält.
Die Hauptroutine fragt also wieder die Kunden Methode, die den entsprechenden SQL-String liefert. Jetzt muss aber nicht nur die Kunden-Methode, sondern auch alle anderen Routinen geändert werden, da sie alle die neue Tabelle nicht kennen. Für den Aufbau des Statements ist dies aber entscheidend.
RC.Sql hätte dieses Problem einzig auf die Kunden-Methode begrenzt. Das dort erzeugte Statement Objekt hätte alle nötigen Informationen für den gesamten Rest der Anwendung, so dass der Programmierer keine weiteren Modifikationen vornehmen muss.

Investitionsschutz
Der Datenbankhersteller spielt in Anwendungen mit RC.Sql nur eine untergeordnete Rolle. Für die Datenbankprodukte Microsoft Access, Microsoft SQL Server, IBM DB2 UDB und Sybase ASA existieren bereits fertige Implementierungen der Klasse RcsqlDatabase. Für weitere Hersteller muss die Klasse RcsqlDatabase für direkten oder die Klasse RcsqlOdbcDatabase für objektorientierten Treiberzugriff abgeleitet werden. Dabei sind die datenbankspezifischen Eigenschaften dort zu implementieren. Gibt es keine Abweichung der Datenbank zur allgemeinen ODBC-Spezifikation, lässt sich die Klasse RcsqlOdbcDatabase ohne Umweg einsetzen.
Die diversen Merkmale und Eigenschaften der verschiedenen Hersteller sind in die einzelnen bereits fertigen Klassen eingeflossen, so dass eine weitere Differenzierung zwischen beispielsweise Sybase ASE oder IBM DB2 UDB nicht vorgenommen werden muss.
Nach der Initialisierung der entsprechenden RcsqlDatabase Instanz mit Anmeldestring usw. ist der Quellcode eines Programms identisch in Bezug auf gleiche Datenbanknamen und Tabellen von verschiedenen  Anbietern. Ein Programmierer benutzt den gleichen Code für alle (vorausgesetzt auf den verschiedenen Datenbanken befinden sich inhaltlich und namentlich identische Tabellen).
So erhalten die in der Datenbank abgelegten Daten eine viel höhere Transparenz für den Benutzer. Er braucht sich über spezielle Syntaxregeln einzelner Hersteller oder ähnliches keine Gedanken zu machen, sondern implementiert seine Anfragen immer auf die gleiche Weise, und so hat er immer die gleiche gewohnte Sicht auf seine Daten.

Objektorientierte Statements
Der entscheidende Aspekt dieser Bibliothek ist, dass ein Statement Objekt aus anderen Objekten zusammengesetzt wird. Zum Beispiel besteht ein Select Statement unter anderem aus einer Select-, einer From- und einer Where-Klausel. Jedes dieser Teile ist wiederum aus Objekten aufgebaut. Beim Ausführen des Statements wird es dabei elementweise in einen SQL-String geparst. Die datenbankspezifische Syntax spielt dabei für den Anwender keine Rolle. Sie ist in der Datenbankklasse und in RcsqlSyntax definiert.
Dies ermöglicht einen identischen Zugriff auf alle Datenbanktypen. Sollte keine nur für eine bestimmte Datenquelle definierte Funktion benutzt werden, kann ein Programm für jeden beliebigen Datenbanktyp ohne Änderung zum Einsatz kommen.

Objektorientierte Klauseln
Ein weiterer Vorteil aus der Objektzusammensetzung besteht darin, dass sich der Anwender beim Aufbau eines Statements die From-Klausel nicht explizit erzeugen muss. Die Spalten Objekte in allen anderen Klauseln enthalten Verweise auf ihre Tabellen. Diese werden automatisch in die From-Klausel aufgenommen. Dies hat zum Beispiel bei Dialoganwendungen den Vorteil, dass eine Auswahl in einem Fenster nicht das Erzeugen eines kompletten Statements zur Folge haben muss.

Wiederbenutzbarkeit von Statement-Elementen
Die Wiederbenutzbarkeit von Statement-Elementen ist gegeben durch den Aufbau jedes Statements aus Objekten. Der Teil, der nicht weiter verwendet werden soll, wird durch einen einfachen Methodenaufruf gelöscht oder ersetzt.

Thread Safe
Elementare Aktionen können nicht durch einen anderen Thread unterbrochen werden. Z.B. ändert ein Thread die Where-Klausel eines Statements und gleichzeitig versucht ein anderer Thread, die Select-Klausel zu setzen. Einer der beiden würde den anderen unterbrechen. Die Klassen und Methoden von RC.Sql sind dagegen geschützt. So entsteht keine Inkonsistenz einer Instanz aus der Sicht von verschiedenen Threads.

Bound Variables
Wenn ein Statement sehr oft hintereinander benutzt werden soll, und sich dabei nur die Parameterwerte ändern, bedeutet dies bei der Benutzung von textbasierten SQL-Statements stets einen kompletten Neuaufbau des SQL-Strings. RC.Sql ermöglicht Bound Variables. Sie werden anstatt der Parameterwerte in das Statement eingefügt, anschließend mit entsprechenden Werten versorgt und das Statement ausgeführt. Für die folgenden Aktionen werden einfach nur die gebunden Variablen geändert und das Statement wieder ausgeführt. Das Statement selbst bleibt dabei unverändert und muss deswegen nicht neu geparst werden.