REIMERS CONSULT Company Logo

REIMERS CONSULT GmbH

Home Feedback Contents

RC.Dbo Tutorial

RC.Dbo Product Logo medium

Objektorientierte Sicht auf relationale Daten



Inhalt


Einleitung

Dieses Tutorial bietet eine knappe Einführung in die Gebrauchsweise der C# Klassenbibliothek RC.Dbo. Es geht zuerst auf ein paar allgemeine Sachverhalte ein und erklärt anschließend an einem kleinen Beispiel, wie eine Anwendung aufbauend auf RC.Dbo aussehen kann. Die Beispielanwendung ist in C# geschrieben. Es handelt sich um ein einfaches Programm mit Konsolenausgabe, das den Inhalt einer Tabelle löscht, zwei Datensätze in die Tabelle schreibt und anschließend den Inhalt der Tabelle in der Konsole ausgibt. Den Quelltext zu dem Beispiel finden Sie hier. Abschnitte des Quelltextes, die sich in diesem Tutorial befinden, sind grau unterlegt und in der Schriftart Courier.

nach oben


Voraussetzungen

  • installierte Version von RC.Dbo und RC.Sql
  • gültige Lizenz von RC.Dbo und RC.Sql (Test- oder Entwicklerlizenz). Zu näheren Informationen kontaktieren Sie bitte unseren Support (siehe Hauptseite RC.Dbo).
  • Microsoft .NET Framework SDK Version 1.1
  • vorhandene Datenbank mit mindestens einer Tabelle. Die Datenbank muss auf dem Rechner, auf dem die Beispielanwendung ausgeführt werden soll, eingerichtet sein.
  • Grundkenntnisse im Programmieren allgemein und speziell in C#

nach oben


Allgemeines zu RC.Dbo

RC.Dbo ist eine Klassenbibliothek zur objektorientierten Abbildung von Datenbankinhalten. Intern werden für Datenbankzugriffe die Möglichkeiten von RC.Sql benutzt. Die Vorteile von RC.Sql kommen also auch hier zum Tragen (z.B. Unabhängigkeit von Treiberimplementierungen von verschiedenen Datenbanken).
Eine Anwendung, die RC.Dbo für Datenbankzugriffe benutzt, besteht im Wesentlichen aus den vier Teilen Dom-Klasse, Ref-Klasse, Dbi-Klasse und aus der Anwendungslogik.
In der Dom-Klasse werden für jede Tabelle die Spalten als Eigenschaften der Klasse definiert.
Die Ref-Klasse ist die Schnittstelle der Anwendungslogik zu Instanzen der Dom-Klasse.
Die Dbi-Klasse ist die Schnittstelle der Anwendungslogik zur Datenbank.
Eine Anwendung muss zuerst eine Instanz der RcsqlDatabase erzeugen und der Dbi-Klasse zur Verfügung stellen. Danach kann über die Ref-Klasse jede Datenmanipulation in der durch die entsprechende Dom-Klasse repräsentierten Tabelle vorgenommen werden.

nach oben


Beispielprogramm

Das Beispielprogramm bezieht sich auf eine Tabelle namens BENUTZER in einer Microsoft  Access Datenbank. Die Tabelle besteht aus den Spalten USER_RECNO, USER_USERID und USER_NAME. USER_RECNO ist der Primärschlüssel eines Datensatzes und wird von der Tabelle automatisch beim Einfügen erzeugt. USER_USERID ist als UNIQUE definiert.
Aus Gründen der Übersicht sind alle datenbankrelevanten Parameter in einer eigenen Klasse untergebracht (DBInfo).
Dom-Klasse
Die Dom-Klasse selbst und die Spalteneigenschaften sind mit Attributen versehen. Die Klassenattribute werden von der Library und dem MapGenerator benötigt, die Eigenschaftsattribute nur vom Generator.
[RcdboSqlDom ( DBInfo.tableName, typeof( MyDbi ), typeof( BenutzerRef ) )]
[RcdboSqlDomPrimaryKey ( DBInfo.columnRecno )]
Die Spalte einer Tabelle wird als Eigenschaft in der Dom-Klasse realisiert. Mit einen ColumnAttribute wird sie als Spalte ausgezeichnet und für den Generator zugänglich gemacht. Über die get- und set-Funktionen greift die Anwendung auf die Spalteninhalte zu.
[RcdboSqlDomColumn ( DBInfo.columnRecno )]
public RcsqlLong Recno {
   get { return recno; }
   set { recno = value; }
}
Ref-Klasse
Da für jede Dom-Klasse eine Ref-Klasse als Schnittstelle zur Anwendung implementiert werden muss, überschreibt sie alle Konstruktoren mit dem Typ der entsprechenden Dom-Klasse (siehe Quelletext).
Durch die Eigenschaft Dbi werden in der Anwendung Typecasts von RcdboDbi auf MyDbi vermieden.
static public new MyDbi Dbi {...}
Der Zugriff auf das durch diese Klasse repräsentierte Dom-Objekt erfolgt durch die Eigenschaft Obj.
public BenutzerDom Obj {
    get { return (BenutzerDom)DomObj; } }
Dbi-Klasse
Die Implementierung der Dbi-Klasse dient in erster Linie der Einbettung der Datenbank Parameter. RC.Dbo holt sich bei einem Datenbankzugriff die Datenbankklasse aus Dbi.
public class MyDbi : RcdboDbi {
    public MyDbi ( Type domType ) : base ( domType ) { }
    public override RcsqlDatabase Database {
        get { return DBInfo.Database; }
    }
Die Beispielanwendung
Das Programm führt folgende Aktionen hintereinander aus: Tabelleninhalt löschen, zwei Datensätze in die Tabelle schreiben, Daten lesen und anzeigen, einen Datensatz ändern und Daten erneut lesen und anzeigen.

Delete
Um einen Datensatz aus der Tabelle zu löschen muss man erst eine Referenz darauf holen. Von dem dadurch erhaltenen Ref-Objekt wird dann die Delete-Methode aufgerufen. Um den gesamten Tabelleninhalt zu löschen, werden Referenzen für jeden Datensatz geholt und anschließend gelöscht.
refs = BenutzerRef.Dbi.Read( dboConn, new RcsqlExpr(), null );
foreach ( RcdboRef rcdboRef in refs )
    rcdboRef.Delete();


Ein Datensatz der Tabelle wird durch eine entsprechende Dom-Instanz repräsentiert. Um eine leeres Dom-Objekt zu erhalten wird die CreateNewDom Methode der Ref-Klasse benutzt. Das Dom-Objekt wird mit Werten über die Ref-Klasse versorgt, und zuletzt wird die Write-Methode aufgerufen.
BenutzerRef benRef = new BenutzerRef(null, dboConn);
benRef.CreateNewDom();
benRef.Obj.Id = "TU3";
benRef.Obj.Name = "Test User3";
benRef.Write();

Select
Zum Anzeigen von Datensätzen werden zuerst über die Ref-Klasse ihre Referenzen gelesen. Das ergibt eine ArrayList mit Ref-Objekten. Jedes Ref-Objekt hat einen Verweis auf ein Dom-Objekt. Die Liste wird dann elementweise durchgegangen und ausgegeben. Hier sollen die Datensätze nach Namen sortiert gelesen werden.
RcsqlOrderByList orderBy = new RcsqlOrderByList();
orderBy.Add(BenutzerRef.Dbi.Column("Name"), true);
refs = BenutzerRef.Dbi.Read( dboConn, new RcsqlExpr(), orderBy );
foreach ( BenutzerRef benutzerRef in refs )
Console.WriteLine(benutzerRef.Obj.Recno + " " + benutzerRef.Obj.Id + " " + benutzerRef.Obj.Name);

Update
Um einen vorhandenen Datensatz zu ändern, muss er zuerst als Dom-Objekt aus der Tabelle gelesen werden. Über die entsprechende Ref-Instanz wird er geändert und anschließend wieder in die Datenbank geschrieben.
benRef = (BenutzerRef)BenutzerRef.Dbi.ReadFirst(dboConn, BenutzerRef.Dbi.Column("Id") == "TU4");
benRef.Obj.Name = "Test-User4";
benRef.Write();

nach oben


Troubleshooting

RC.Dbo und RC.Sql im GAC
Damit ein Programm eine Klassenbibliothek benutzen kann, die weder aus dem Standard-.NET Framework stammt noch im selben Verzeichnis wie die Anwendung liegt, muss die Bibliothek im Global Assembly Cache (GAC) registriert sein. Alternativ muss sich die entsprechende DLL-Datei der Bibliothek in jedem Verzeichnis stehen, aus dem eine solche Anwendung gestartet wird. Da RC.Dbo und RC.Sql lizenziert sind, muss sich auch die Lizenz-Implementierung (RC.Lic) im GAC befinden.
gültige Lizenz für RC.Dbo und RC.Sql
Die Klassenbibliotheken RC.Dbo und RC.Sql sind im Rahmen des .NET Frameworks lizenzierte Bibliotheken. Bei jedem Aufruf wird geprüft, ob eine gültige Lizenz auf dem Rechner vorliegt. Die Lizenzdateien (RCDbo.lic und RCSql.lic) müssen sich im selben Verzeichnis befinden wie RC.Sql.dll. Ist dies nicht der Fall, wird beim Ausführen eines Programms eine Exception geworfen.
Lizenzhilfedatei im Anwendungsverzeichnis
Die Lizenzhilfedatei (licenses.licx) für RC.Dbo und RC.Sql müssen sich im Quellverzeichnis der Anwendung befinden. Microsoft Visual Studio .NET 2003 und Borland C# Builder benutzen diese Datei, um den Lizenzkompiler des Framework mit den dort eingetragenen Klassen aufzurufen.
Datenbank Verbindung
Falls keine Verbindung zur Datenbank hergestellt werden kann, kann dieses Beispiel nicht ausgeführt werden. Falls diese Situation vorliegt, sollten die Datenbank Parameter geprüft werden.

nach oben