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