DataBase voor
objecten
db4o is een open-source objectendatabase waarin je je objecten kan opslaan.Ze is
ontwikkeld voor java-programmeurs,maar ze heeft in de loop der tijd toch de weg
naar .NET gevonden.
code Klasse Persoon Code in module1
de zipfile
Meer uitleg kan je vinden op deze
site waar ook een voorbeeld op staat.
Ik ga mij hier beperken tot het aanmaken van een eenvoudige klasse,nl de klasse
Persoon.
En start een nieuw project ,een console applicatie (Demo_db4o_Persoon).En voeg daaraan
een nieuw item aan toe,een Classe die noem ik Persoon.vb.
De klasse Persoon.
Een klasse kan je bezien als
een verzameling gegevens die iets te maken heeft met het object,in ons geval is
het object een Persoon.
Omdat we hier met een database werken lijkt 't mij verstandig om een persoonsID
aan te maken.
Verder wil ik er ook een voornaam,een achternaam en woonplaats in verwerken.
In die Klasse maak ik de variabelen aan .
Private m_persoonsID
As Integer
Private m_vNaam As String
Private m_aNaam As String
Private m_woonPlaats As String
We hebben hier
in de klasse Persoon 4 velden aangemaakt,deze velden zijn alleen bereikbaar in de
klasse Persoon zelf (Private).
De m_ voor de benamingen is niet verplicht,maar het programmeerd veel beter,de m
zou voor member staan en maakt het verschil duidelijk tussen velden en eigenschappen.
Nu maken we de eigenschappen aan.
Public Property PersoonsID()
As Integer
Get
Return
m_persoonsID
End Get
Set(ByVal Value As Integer)
m_persoonsID
= Value
End Set
End Property
De rest van de eigeschappen
maak je op dezelfde manier aan zodat je ook 4 eigenschappen hebt.
Dus Public Property PersoonsID() As Integer, Public Property VoorNaam() As String,Public Property AchterNaam()
As String en Public Property WoonPlaats() As String.
Nu gaan we Constructors toevoegen aan onze klasse.
1 constructor lijkt mij op't eerste zicht genoeg.
Public Sub New(ByVal
persoonsid As Integer)
m_persoonsID = persoonsid
End Sub
Deze hebben we dan nodig omdat we de database gaan laten zoeken op PersoonsID.
Ik heb deze speciaal aangemaakt omdat er personen kunnen bestaan met dezelfde naam
en voornaam.
Nu kunnen we de klasse afwerken met de Public Overrides Function ToString() As String
Wat willen we Displayen? De voornaam , achternaam en de woonplaats.
Public Overrides
Function ToString() As String
Return
m_vNaam & " " &
m_aNaam & " " & m_woonPlaats
End Function
(code klasse Persoon)
De Module1(code)
Vwola onze klasse is af.(dat denken we tenminste)Het
is een eenvoudige klasse,welke we gaan gebruiken om gegevens in onze db4o database
te plaatsen.
Je kan er natuurlijk nog gegevens bijvoegen zoals geboortedatum,man of vrouw,beroep,hobbys..enz
.
Nu is het tijd om te programmeren in onze console applicatie.
Eerst zet je de db4o dll in je bin map,ik gebruikte versie 5.0.10.0 voor vb.net
2003.
Je kan ook een andere versie gebruiken die kan je
hier
downloaden.
Er is ook 1 voor vb2005 te downloaden.
Nu moet je een reference maken met die dll,dit doe je via de Solution Explorer.
Rechts klik op Demo_db4o_Persoon en selecteer Add Reference...
Wacht tot als het venster openspringt en klik op browse...daar zie je de bin map
staan, maak die open en als je de dll erin hebt gezet dubbel klik op de db4o dll
en klik op ok.
In de Solution Explorer kan je ze nu zien staan tussen de references.
In de module1.vb moeten nu nog 3 Imports gedaan worden.Dit doe je helemaal bovenaan.
Imports
System.IO
Imports com.db4o
Imports dbO = com.db4o.query
We gaan 4 personen aanmaken
waarvan er 2 dezelfde naam hebben.
Maar eerst maken we in de Sub Main een ObjectContainer aan en openen we onze database.
Deze database noemen we Personen.yap ,db4o wil blijkbaar dat hun databases de extensie
yap hebben.
' File.Delete("Personen.yap")
Dim db As
ObjectContainer
db = Db4o.OpenFile("Personen.yap")
De rest van de code zetten we in een Try Catch blok,omdat ik de fouten die zouden
kunnen gebeuren wil opvangen.
Ook wil ik telkens de foutboodschap ontvangen.
Dus....
Try
'hier komt onze code (niet onze code voor de subprocedures)
'wel de aanroep voor onze subprocedure.
' VoegPersonenToe(db)
Catch ex
As Exception
Console.WriteLine(ex.Message)
Finally
db.Close()
End Try
Console.ReadLine()
De code om een persoon aan te maken is heel eenvoudig.Je maakt er nog 3 andere aan
Pers2 enz...
Let er wel op dat je alle getallen veranderd Persoon(1) wordt dan Persoon(2) dit
is dan het PersoonID (Constructor)
Ik maakte dan 2 Bart Peeters aan, 1 in Tervuren en 1 in Leuven.
Dim
pers1 As New Persoon(1)
pers1.VoorNaam
= "Bart"
pers1.AchterNaam = "Peeters"
pers1.WoonPlaats = "Tervuren"
db.Set(pers1)
Deze zette ik in een subprocedure.Denk
eraan dat subprocedures buiten de sub main geprogrammeerd worden, ze blijven wel
binnen de Module1
Private Sub VoegPersonenToe(ByVal
db As ObjectContainer)
Nadat je alle 4 personen hebt
aangemaakt en in de database hebt gestopt mag je de subprocedure VoegPersonenToe(db)
en de File.Delete("Personen.yap") afblokken.Het programma moet uiteraard 1x hebben
gedraaid om ze in de database te stoppen.
Nog niet verwijderen want we hebben ze nog nodig omdat er een foutje zit in onze
klasse welke we nog moeten aanpassen.
Daardoor zullen we fouten tegenkomen verder die we moeten kunnen oplossen.
Je zal nog niets gezien hebben ,omdat we de database gegevens nog niet hebben laten
displayen.
Daar gaan we nu aan beginnen.
Private Sub AllePersonen(ByVal db As ObjectContainer)
Dim proto
As New Persoon(0)
Dim result
As ObjectSet = db.Get(proto)
While (result.HasNext)
Dim
pers As Persoon = CType(result.Next,
Persoon)
Console.WriteLine(ControlChars.Tab &
pers.ToString)
End While
End Sub
Tussen de Try Catch blokken
voegen we nu een aanroep naar die subprocedure toe
AllePersonen(db)
De console heeft dus 1x gedraaid
met alleen de sub VoegPersonenToe(db) daardoor is de database nu gevuld met de gegevens
vanuit de klasse Persoon.
Die is nu afgeblokt evenals File.Delete("Personen.yap")
Als je ze nu zal laten draaien krijg je dit resultaat.
Ik laat dus alle gegevens zien door te laten zoeken in de database op PersoonID
= 0
Dim proto
As New Persoon(0)
Nu wil ik ook kunnen zoeken
op voornaam?
Dus moeten we een constructor aanmaken in onze klasse Persoon.
1 constructor was dus niet genoeg.
Public Sub New(ByVal
voornaam As String)
m_vNaam = voornaam
End Sub
Nu moeten we ook nog een subprocedure
bijmaken in onze Module1.Die noem ik OpVoorNaam.
De code lijkt op die van AllePersonen.Dus kopïeren we die helemaal en plakken ze
onder de rest van de subprocedures.
We veranderen Alleen de Naam Van de Subprocedure --> OpVoorNaam.
en Dim proto As New
Persoon("Bart")
Vervolgens roepen we de SubProcedure aan in onze try Catch
blok.
Console.WriteLine("Ik wil
alle Bartjes displayen")
OpVoorNaam(db)
Maar omdat we onze klasse hebben zitten aanpassen gaan we eerst onze
Personen.yap deleten door File.Delete("Personen.yap") te hergebruiken en onze database moet natuurlijk ook
weer worden opgevuld door de subprocedure
VoegPersonenToe(db) te hergebruiken.
Belangrijk : Als je iets hebt zitten aanpassen of iets hebt toegevoegd in je
klasse Persoon ,raad ik je aan om de yap file te wissen.
We kunnen het programma nu eens runnen,en...

En we krijgen alle voornamen Bart te zien + hun id. Omdat ik in Module1 in
de Subprocedure OpVoorNaam (dus niet in de klasse persoon) hun id erbijvoegde.
Console.WriteLine(ControlChars.Tab
& pers.ToString & " id = " & pers.PersoonsID)
Nu moeten we ook personen kunnen updaten en deleten.
Als je op naam zoekt en je wil Bart updaten ?Er zijn er wel 2 hé met dezelfde voor-
en achternaam dan nog wel !!!
Daarom is het belangrijk dat je een id aanmaakt dat je kan programmeren welke Bart
je wil updaten.
We gaan nu eens proberen om Bart van Tervuren naar Vossem te laten verhuizen.
De constructor die alleen op id zocht hebben we al.
We gaan er toch ene bijvoegen die zoekt op id en voornaam.
Normaal gezien als je een klasse gaat programmeren moest je dat al voorzien hebben,dit
is echter een voorbeeld om dit duidelijk te maken voor de volgende keer je zo iets
ineen wil steken.
We voegen dus in de klasse Persoon bij.
Public Sub New(ByVal
voornaam As String, ByVal
persoonsid As Integer)
m_vNaam = voornaam
m_persoonsID = persoonsid
End Sub
Weeral zou ik nu de yap file
wissen,het is een goede gewoonte geloof mij,onze database moet natuurlijk ook weer
worden opgevuld door de subprocedure
VoegPersonenToe(db) te hergebruiken.
Laat het programma dus nu maar weer eens
runnen en blok ze daarna terug af.
De code om te updaten is ook niet zo moeilijk. Ik Noem deze UpdateBart.
Private Sub UpdateBart(ByVal db As ObjectContainer)
Dim proto
As New Persoon("Bart", 1)
Dim result
As ObjectSet = db.Get(proto)
While (result.HasNext)
Dim
pers As Persoon = CType(result.Next,
Persoon)
pers.WoonPlaats = "Vossem"
db.Set(pers)
End While
End Sub
De codes lijken wel heel sterk op elkaar echt moeilijk is het dus niet.
Nadat we die subprocedure hebben aangeroepen in Sub Main,roep ik de andere subprocedure
OpVoorNaam ook nog eens aan zodat je duidelijk kan zien dat Bart is verhuist naar
Vossem.
Ik zet er dan ook telkens wat commentaar tussen zodat alles goed te volgen is.
Console.WriteLine("Bart uit
Tervuren verhuisd naar Vossem")
UpdateBart(db)
OpVoorNaam(db)

Nu gaan we een persoon deleten,die code is dan even simpel als alle anderen.
We gaan Bert deleten.Je moet normaal gezien alleen zijn persoonsid kennen.
Maar we gaan hem toch zoeken met naam en id.De subprocedure noem ik DeleteBert.
Private Sub DeleteBert(ByVal db
As ObjectContainer)
Dim proto
As New Persoon("Bert", 4)
Dim result
As ObjectSet = db.Get(proto)
While (result.HasNext)
Dim
pers As Persoon = CType(result.Next,
Persoon)
db.Delete(pers)
End While
End Sub
Om alles goed duidelijk te laten volgen laat ik na de aanroep van DeleteBert(db) in Sub Main, nog eens
de subprocedure AllePersonen(db)
aanroepen + schrijf ik er nog
eens commentaar tussen.De code tussen het Try Catch blok ziet er dan zo uit.
Of kijk eens hier.
'hier
komt onze code (niet onze code voor de subprocedures)
'wel de aanroep voor onze subprocedure.
' VoegPersonenToe(db)
Console.WriteLine("Alle Personen")
AllePersonen(db)
Console.WriteLine("Ik wil alle Bartjes displayen")
OpVoorNaam(db)
Console.WriteLine("Bart uit Tervuren verhuisd naar Vossem")
UpdateBart(db)
OpVoorNaam(db)
Console.WriteLine("Bert zal nu worden gedelete,vaarwel Bertje")
DeleteBert(db)
AllePersonen(db)
Het gehele resultaat ziet er dan zo uit.Bart uit Tervuren zit nu wel telkens in
Vossem,aja we lieten hem verhuizen Hé.

Tot slot !
toch nog enkele opmerkingen...
Vergeet zeker nooit,als je veranderingen gaat aanbrengen in je klasse dat je de
yap file het best delete--> File.Delete("Personen.yap")
.
In de Demo_db4o_Persoon.zip staat deze dus niet afgeblokt. evenals de subprocedure
VoegPersonenToe(db)
.
Je kan als je dit eens wil uit testen ook alles meteen kopïeren,of je daarmee veel
gaat leren laat ik aan u over.
Het minste foutje en de hele mikmak werkt niet,daarom staat hier alles netjes uitgelegd.
Je kan met db4o natuurlijk ook Windows Applicaties maken ipv Console Applicaties.
Je kan die gegevens die in de yap staan ook naar het geheugen schrijven,ze zal dan
zo vlug gaan als een professionele database.
Voor meer uitleg kan je eens een kijkje nemen hier.
Je kan hier het hele programma downloaden.Alle files staan erin.
Groeten home