3. De casestudy
We willen een .NET-toepassing schrijven waarmee een gebruiker simulaties kan uitvoeren voor de loonberekening van de kinderopvangmedewerkers van de vereniging „Maison de la petite enfance“ in een gemeente. We zullen zowel aandacht besteden aan de opbouw van de code DotNet van de applicatie als aan de code zelf.
3.1. De database-
De statische gegevens die nodig zijn voor het opstellen van de loonstrook zijn opgeslagen in een SQL Server Express-database met de naam dbpam (pam = Paie Assistante Maternelle). Deze database heeft een beheerder met de naam sa en het wachtwoord msde.
![]() |
De database bevat drie tabellen: EMPLOYES, COTISATIONS en INDEMNITES, met de volgende structuur:
Table EMPLOYES : rassemble des informations sur les différentes assistantes maternelles
Structuur:
![]() |
|
De inhoud zou als volgt kunnen zijn:
![]()
Table COTISATIONS : rassemble les taux des cotisations sociales prélevées sur le salaire
Structuur:
![]() |
De inhoud zou als volgt kunnen zijn:
De sociale premiepercentages zijn onafhankelijk van de werknemer. De bovenstaande tabel bevat slechts één rij.
Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
![]() |
|
De inhoud zou als volgt kunnen zijn:

Er zij opgemerkt dat de vergoedingen kunnen variëren van kinderverzorgster tot kinderverzorgster. Ze zijn namelijk gekoppeld aan een specifieke kinderverzorgster via haar salarisindex. Zo heeft mevrouw Marie Jouveinal, die een salarisindex van 2 heeft (tabel EMPLOYES), een uurloon van 2,1 euro (tabel INDEMNITES).
De relaties tussen de drie tabellen zijn als volgt:
![]() |
Er is een vreemde-sleutelrelatie tussen de kolom EMPLOYES (INDICE) en de kolom INDEMNITES (INDICE).
De zo aangemaakte database [dbpam] genereert twee bestanden in de map van SQL Server Express:
![]() |
De [dbpam.mdf, dbpam_log.ldf]-bestanden kunnen naar een andere machine worden overgezet en opnieuw worden gekoppeld aan de SGBD SQL Server Express op die machine. Ga als volgt te werk:
- de bestanden van de BD en [dbpam] worden gekopieerd naar een map
![]() |
- start u SQL Server Express
- met de client SQL Server Management Studio Express, en koppel het bestand [dbpam.mdf] aan SGBD:
![]() |
![]() |
- rechtsklikken op [Databases] / Toevoegen
- kies het bestand [dbpam.mdf] via een knop [Add] (niet afgebeeld)
- het bijgevoegde bestand leidt tot een BD dat nog niet mag bestaan. Hier, in het veld [Attach As], is de naam [dbpam2] gegeven aan de nieuwe BD.
- We zien het nieuwe bestand BD en de bijbehorende tabellen
Deze techniek om een BD te koppelen is handig om een BD van de ene post naar de andere over te brengen en we zullen deze hier af en toe gebruiken.
3.2. Berekeningswijze van het salaris van een kinderoppas
We leggen nu uit hoe het maandsalaris van een kinderoppas wordt berekend. Als voorbeeld nemen we het salaris van mevrouw Marie Jouveinal, die in de te betalen maand 150 uur heeft gewerkt, verdeeld over 20 dagen.
Er wordt rekening gehouden met de volgende elementen: | | |
Het basissalaris van de kinderopvangmedewerkster wordt berekend aan de hand van de volgende formule: | ||
Op dit basisloon moeten een aantal sociale premies worden ingehouden: | | |
Totaal aan sociale premies: | ||
Bovendien heeft de kinderopvangmedewerkster voor elke gewerkte dag recht op een verblijfsvergoeding en een maaltijdvergoeding. In dit kader ontvangt zij de volgende vergoedingen: | | |
Uiteindelijk bedraagt het aan de kinderopvangmedewerkster uit te betalen nettoloon: |
3.3. Herinneringen ADO.NET
De applicatie voor loonberekening heeft de gegevens uit de database [dbpam] nodig. De architectuur ervan zal als volgt zijn:
![]() |
- in [1] dient de gebruiker een verzoek in
- in [2] verwerkt de salarisapplicatie deze aanvraag.
- de applicatie kan dan gegevens uit de database nodig hebben. Vervolgens doet de applicatie een verzoek aan de provider ADO.NET van de door SGBD gebruikte [4].
- Deze raadpleegt de database [5] en stuurt de resultaten terug naar de provider ADO.NET, die ze op zijn beurt doorgeeft aan de applicatie
- deze verwerkt deze resultaten en stelt een antwoord [5] op voor de gebruiker
We zullen nu de belangrijkste interfaces bespreken die een leverancier ADO.NET aan zijn klanten [3] aanbiedt.
In de verbonden modus doet de applicatie het volgende:
- een verbinding met de gegevensbron
- werkt met de gegevensbron in lees-/schrijfmodus
- sluit de verbinding af
Drie ADO.NET-interfaces zijn voornamelijk betrokken bij deze bewerkingen:
- IDbConnection, die de eigenschappen en methoden van de verbinding omvat.
- IDbCommand, dat de eigenschappen en methoden van de uitgevoerde opdracht SQL omvat.
- IDataReader, dat de eigenschappen en methoden van het resultaat van een SQL Select-opdracht omvat.
De interface IDbConnection
Wordt gebruikt om de verbinding met de database te beheren. Tot de methoden M en eigenschappen P van deze interface behoren onder andere de volgende:
Naam | Type | Rol |
P | verbindingsstring naar de database. Deze bevat alle parameters die nodig zijn om verbinding te maken met een specifieke database. | |
M | opent de verbinding met de database die is gedefinieerd door ConnectionString | |
M | sluit de verbinding | |
M | start een transactie. | |
P | verbindingsstatus: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken |
Als Connection een klasse is die de interface IDbConnection implementeert, kan de verbinding als volgt tot stand worden gebracht:
De interface IDbCommand
Wordt gebruikt om een opdracht SQL of een opgeslagen procedure uit te voeren. Tot de methoden M en eigenschappen P van deze interface behoren onder meer de volgende:
Naam | Type | Rol |
P | geeft aan wat er moet worden uitgevoerd – haalt zijn waarden uit een opsomming: - CommandType.Text: voert de opdracht SQL uit die is gedefinieerd in de eigenschap CommandText. Dit is de standaardwaarde. - CommandType.StoredProcedure: voert een opgeslagen procedure uit in de database | |
P | - de tekst van de uit te voeren opdracht SQL als CommandType = CommandType.Text - de naam van de opgeslagen procedure die moet worden uitgevoerd als CommandType = CommandType.StoredProcedure | |
P | de verbinding IDbConnection die moet worden gebruikt om de opdracht SQL uit te voeren | |
P | de transactie IDbTransaction waarin de opdracht SQL moet worden uitgevoerd | |
P | de lijst met parameters van een geconfigureerde opdracht SQL. De opdracht update articles set price=price*1.1 where id=@id heeft de parameter @id. | |
M | om een opdracht SQL Select uit te voeren. We krijgen een object IDataReader dat het resultaat van Select weergeeft. | |
M | om een opdracht SQL (Update, Insert, Delete) uit te voeren. Dit levert het aantal rijen op dat door de bewerking is beïnvloed (bijgewerkt, ingevoegd, verwijderd). | |
M | om een opdracht SQL Select uit te voeren die slechts één resultaat oplevert, zoals in: select count(*) from articles. | |
M | om de parameters IDbParameter aan te maken voor een geconfigureerde opdracht SQL. | |
M | maakt het mogelijk de uitvoering van een geparametriseerde query te optimaliseren wanneer deze meerdere keren met verschillende parameters wordt uitgevoerd. |
Als Command een klasse is die de interface IDbCommand implementeert, ziet de uitvoering van een opdracht SQL zonder transactie er als volgt uit:
De interface IDataReader
wordt gebruikt om de resultaten van een opdracht SQL Select in te kapselen. Een object IDataReader vertegenwoordigt een tabel met rijen en kolommen, die achtereenvolgens worden verwerkt: eerst de eerste rij, dan de tweede, ... Onder de methoden M en eigenschappen P van deze interface bevinden zich de volgende:
Naam | Type | Rol |
P | het aantal kolommen in de tabel IDataReader | |
M | GetName(i) geeft de naam weer van kolom nr. i van de tabel IDataReader. | |
P | Item[i] vertegenwoordigt kolom nr. i van de huidige rij in de tabel IDataReader. | |
M | gaat naar de volgende regel van de tabel IDataReader. Geeft de booleaanse waarde True terug als het lezen is gelukt, False anders. | |
M | sluit de tabel IDataReader. | |
M | GetBoolean(i): geeft de booleaanse waarde weer van kolom nr. i van de huidige rij in de tabel IDataReader. De andere, vergelijkbare methoden zijn: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString. | |
M | Getvalue(i): geeft de waarde van kolom nr. i van de huidige rij van de tabel IDataReader weer als type object. | |
M | IsDBNull(i) levert True op als kolom nr. i van de huidige rij in de tabel IDataReader geen waarde heeft, wat wordt aangeduid met de waarde SQL NULL. |
De verwerking van een object IDataReader ziet er vaak als volgt uit:









