Eenvoudig voorbeeld . Er wordt verondersteld dat er met VS 2008 EXPRESS gewerkt wordt.
Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:
(Sommige schermafdrukken zijn afkomstig van Access 2007, en zien er in oudere Access versies anders uit)
VB_01 Wanneer je een nieuw project begint, en de database Voorbeeld.mdb toevoegt (hier als referentie toegevoegd – zie het pijltje in het icoontje), wordt de volgende project structuur aangemaakt door de wizard.
De wizard heeft tijdens het toevoegen van de database “voorbeeld.mdb”, de dataset VoorbeeldDataSet toegevoegd.
In app.config staat de connectie string met de database.
Compileer deze toepassing. In de output directory (release) zie je volgende bestanden:
De database werd naar de output directory gekopieerd (zie eigenschappen van de database in het project) Het bestand VB_01.exe.config heeft de inhoud van app.config
In een eerste stap werd een splitpanel op het formulier geplaatst. Open vanuit het menu: Data – Show Data Sources
Naast de table Postcode zie je een selectie mogelijkheid. In het afgebeelde voorbeeld, kan je de tabel gewoon op het rechter paneel slepen, en worden alle velden aan de dataset gebonden en op het formulier geplaatst Wanneer je de keuze op de DataGridView plaatst, kan je de tabel als grid naar het linker paneel slepen. (Maak in de keuze dock in Parent container)
Voeg een BindingNavigator toe aan het rechter paneel, en stel het propertie BindingSource van bindingNavigator1 in op postcodeBindingSource.
Na compilatie, kan je onmiddellijk de aanwezige gegevens bekijken.
Van deze manier van werken zijn vele voorbeelden beschikbaar op het internet. Zie ook het eBook “C# School” van Programmers heaven vanaf pagina 230. http://www.programmersheaven.com/2/Les_CSharp_0
Omdat deze manier van werken vele nadelen heeft, ga ik er daarom niet verder op in.
VB_02 Dit voorbeeld project wordt onderverdeeld in 3 losse libraries. We beginnen met deze basis structuur. • • •
VB_02 is de toepassing (Windows Forms Application) Tests is een console toepassing met als enige doel het uittesten van de database functies. Algemeen, en Access zijn ieder een class library, en worden in een afzonderlijke DLL gecompileerd.
Voeg in de Access library een referentie naar het project Algemeen toe. In de toepassing VB_02 en Tests, voeg je ook een referentie toe naar Algemeen. Door het toevoegen van deze referenties, kennen zowel de library Access, als de toepassing, de opbouw van een Postcode object, en de opbouw van de database interface.
Opmerking: Bij het toevoegen van de database aan het project, werd de voorbeelddataset niet toegevoegd.
Nu moeten we er enkel nog voor zorgen dat de juiste database interface (in dit geval is er maar 1 voorzien) in de project map gekopieerd wordt na het compileren. Voeg het project Access toe aan de project dependencies van VB_02 In de properties van VB_02, in de tab BUILD EVENTS, voegen we een post-build event toe waarbij de Access library naar de VB_02 project directory gekopieerd wordt.
Na compilatie zie je in de output directory het programma VB_02.exe en de 2 libraries.
Opgelet: als je een wijziging aanbrengt in de database module (Access), dan moet je deze module afzonderlijk compileren. Daarom stel je uw project best in als afhankelijk van de database module. (dan gebeurt de compilatie automatisch). (zie project dependencies) Nota: Om het debuggen van de Access library eenvoudig te houden, werd de Access module aan de referenties van Tests toegevoegd. Zo ben je zeker dat je steeds met de laatst gecompileerde module werkt.
Om ons programma echt onafhankelijk van een database te maken, beginnen we met de definitie van de IDatabase interface. Dankzij een interface is het mogelijk om de uitwerking van een class uit te stellen, en in een afzonderlijke library onder te brengen.
De echte definitie van deze functies is terug te vinden in Access.Database.cs Dit is dan ook de enige plek waar SQL instructies terug te vinden zijn. De code van deze class kan je in de bijgevoegde sources terugvinden. Belangrijk is deze class definitie:
Door hier de Interface IDatabase te vermelden, moet uw class voldoen aan de eisen die deze interface heeft vastgelegd. Als je op deze manier classes maakt voor andere databases, dan is uw programma database onafhankelijk. Wanneer je dan een andere database wil gebruiken, moet je enkel een database class maken die IDatabase implementeert, deze in uw project directory kopiëren, en enkele instellingen in uw setup bestand wijzigen.
De class-definitie van de data waarmee we gaan werken is terug te vinden in Algemeen.BO.Gemeente.cs
Merk hierbij op dat de namen van de properties niet overeen moeten komen met de veldnamen in de database. In uw programma moet je nu: 1. De gewenste database module laden. 2. De juiste connectiestring opgeven. Op volgende manier wordt dit in ons voorbeeld gedaan:
Wanneer de strings db en connect allebei uit een configuratie bestand gelezen worden, is uw toepassing database onafhankelijk. Het laden van de database module:
En het maken van de connectie met de database:
Voor het uittesten van de Database class, wordt het project Tests gebruikt. De source spreekt voor zich. Hier worden alle functies van de database module uitgetest.
Windows Forms voorbeeld Wanneer je in een formulier een datagridview wil gebruiken, is het handig om de colommen in te kunnen stellen met de Visual Studio IDE. Klik in het menu op Data – Show Data Sources
Klik op Add New Data Source
Selecteer Object, en klik op Next
Blader nu naar de class Gemeente
Klik op Finish De gemeente class is nu aan de data sources toegevoegd
Selecteer DataGridView en sleep het grid naar uw formulier. Nu kan je de colommen wijzigen (verwijderen, verplaatsen, breedte bepalen)
Hier werd de colom Id verwijderd. De autosizemode van Postcode ingesteld op AllCells, en de autosizemode van Plaats ingesteld op Fill. Wanneer je op deze manier een grid aan een formulier toevoegt, wordt er automatisch een BindingNavigator aangemaakt. In dit voorbeeld werd deze verwijderd.
De source van VB_02 verduidelijkt de rest.
In het zoekvak kan je een deel van de naam van een gemeente invullen. Druk op de knop ernaast om de zoekfunctie uit te voeren. In dit voorbeeld werd het vakje leeg gelaten, en worden alle gemeentes getoond. Ook zoeken op postcode is hier mogelijk. In onderstaand voorbeeld werd gezocht op alle postcodes die met 2 beginnen.
Wanneer je dubbelklikt op een record, wordt het detail ingevuld in het schermpje naast het grid en kan je de gegevens wijzigen.
Opgelet: In dit voorbeeld kan de database library niet weten of een object al dan niet gewijzigd werd. Wanneer een niet gewijzigd object opnieuw aan de SetGemeente routine doorgegeven wordt, wordt dit toch naar de database geschreven (wat overbodig is) Dit kan opgelost worden op verschillende manieren: o Checksum van het originele object bijhouden, en vergelijken op het ogenblik dat de beslissing gemaakt moet worden om het object weg te schrijven. o Property “Updated” bijmaken. o Vergelijken met wat in de database aanwezig is.