DBO kann für verschiedene Zwecke eingesetzt werden.
Läßt man die Datenbankfunktion außer acht, so kann DBO als "Poor Man's Rose" (Rose ist eingetragenes Warenzeichen von Rational) benutzt werden. Man erstellt mit Access eine Datenbank mit Tabellen entsprechend der Klassen, die man erzeugen will, Relations in der Db können zu Relations zwischen Objekten werden.
Für jede Tabelle einer Datenbank kann eine Form angelegt werden.
Es muß kein einziger SQL-Befehl mehr für Laden, Speichern, Löschen und Ändern in eine Datenbank getippt werden. Kein ärgerliches Suchen mehr nach Tipfehlern in einer 3 Zeilen Insert Anweisung, kein stumpfes Eintippen der immer gleichen SQL-Befehle...
Wie bitte, Vererbung - mit Visual Basic - das geht natürlich nicht. DBO trickst ein bißchen. Man kann beim Erzeugen von Klassen Attribute und Methoden anderer Klassen "erben" - sie werden einfach in die Klasse kopiert (Also keine richtige Vererbung und es ist nur eine Generation pro Durchlauf möglich).
Mögliche Vaterklassen sind Klassen, die DBO aus einem Ordner eingelesen hat. Als Standartrepository liest DBO beim Start den Ordner AppPath\Repository. Man kann weitere Ordner angeben.
Neuerdings können sogar Forms von einander erben
DBO legt in jeder Datei Kommentare an der Form :
'eigene ..
'eigene .. Ende
Wird ein erneuter Druchlauf mit DBO gestartet (weil z.B. sich die DB-Struktur geändert hat), so kann das bestehende VB-Projekt ausgelesen werden. Code der zwischen diesen Kommentaren steht bleibt unberührt.
Vorsicht : Ändert man die Oberfläche der erzeugten Forms, so werden diese Änderungen überschrieben. (Option "Forms nicht ändern" ist geplant)
Wer schon immer der Meinung war, daß Visual Basic Projekte schnell unübersichtlich werden ... dem gebe ich sofort recht.
Ein Ausweg : Komponenten à man hat ein VB-Projekt für die DataServices und UserServices und ein VB-Projekt für den Rest (naja, die Aufteilung geht noch nicht so recht in Richtung 3-stufiger Architektur, aber ich arbeite daran..)
Dazu ist einfach "ActiveX Komponente erstellen" wählen, das Projekt in Visual Basic öffnen, kompilieren, Regsvr32.exe xy sagen und als Komponente in das andere Projekt laden (kleiner Tip : es gibt Projektgruppen zum Zusammenfassen von VB-Projekten)
DBO erzeugt pro Tabelle eine Klasse mit entsprechenden Attributen. Für Fremdschlüssel werden außerdem Objekte der entsprechenden Klasse angelegt (Beispiel Adressverwaltung : die Klasse Person enthält nicht nur ORT_ID als Long, sondern auch ein Objekt m_ORT der Klasse Ort). Umgekehrt wird bei 1-n Relation auf der anderen Seite ein Kontainerobjekt angelegt, welches alle Objekte laden kann, die auf das entsprechende Objekt verweisen (Beispiel Adressverwaltung : die Klasse ORT enthielte ein Kontainerobjekt m_Personen, welches alle Personen dieses Ortes enthalten kann).
Attribute
ID as String
Werte des
Schlüssel (durch ":" getrennt, falls mehrteiliges
Schlüssel)
Form as Form (falls eine Form für
diese Klasse erzeugt werden soll)
Verweis auf die Form zu diesem
Objekt
AutoUpdateInDb as Boolean
Falls
Attribute Private sind, kann bei Property Let automatisch ein Update
des Attributwertes in die Datenbank erfolgen
IdName As String
die Namen der
Spalten des Schlüssels (durch ":" getrennt, falls
mehrteiliges Schlüssel)
Methoden :
SetValues (...)
setzt alle
Werte für das Objekt
SetValuesByRs(Recordset)
liest
Werte aus dem aktullen Datensatz des Recordsets ein und legt sie im
Objekt ab
SetValuesByForm() - nur wenn eine
Form generiert werden soll
liest Werte aus der dem Objekt
zugehörigen Form und legt sie im Objekt ab
ShowNewForm
setzt eine neue ID
(falls der Key numerisch und einspaltig ist)
ruft die Form auf
und setzt gegebenfalls die Werte
ShowChangeForm
dito, ohne neue
ID
Insert ()
SQL Befehl Insert mit
den aktuellen Objektattributwerten
UpdateXY()
SQL Befehl Update
für das Attribute XY
Update()
SQL Befehl Update für
alle Attribute
DeleteInDb()
SQL Befehl Delete
Property Let, Get und Set - falls die Option Attribute sind private gewählt wurde
LoadXY()
lädt die Werte
für das zugehörige XY Objekt aus der DB
LoadXYs()
lädt die Werte
für die zugehörigen XY Objekte aus der DB in das
Kontainerobjekt
Wird die Option "eigene Kontainerobjekte" gewählt, so wird für jede Klasse noch eine eigene Kontainerklasse mit erweiterter Funktionalität angelegt
Unter anderem : select Befehl auf eine bestimmte Eigenschaft, liefert ein Dictionary mit Objekten zurück, wo diese Eigenschaft zutrifft
Ansonsten wird als Kontainerobjekt ein Dictionary verwendet
Zu groß, zu langsam, aber was erwartet man von einer eierlegenden Wollmilchsau ?
Man muß die DBO Klassen anschauen und verstehen (aber eben nicht selbst eintippen!), allerdings sind ja alle Klassen dann gleich aufgebaut
Manchmal ist eine SQL-Abfrage einfach noch praktischer (z.B. Join über mehrere Tabellen)
Stephan Riedel - letzte
Aktualisierung