In deze query is 'alfki' een constante. Met deze query wordt telkens hetzelfde record uit de tabel Customers opgeroepen.

Vergelijkbare documenten
Mijn eerste ADO.NET applicatie

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet.

In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.

return an ; } private I L i s t l i j s t ;

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

7. Het selecteren van gegevens

Een website maken met databasetoegang.

Een expressie zoals leeftijd>=65 wordt een boolean expressie genoemd. Een boolean expressie kan dus de waarde true of de waarde false geven

Relaties tussen twee tabellen definiëren

Dit kan gebruikt worden in zowel een ASP.NET web applicatie als een desktop applicatie.

Sparse columns in SQL server 2008

In deze leeropdracht leer je properties (of eigenschappen) van een component te veranderen met behulp van het properties panel.

Handleiding Invoeren van een Catia V5R19 document in SmarTeam

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

Je kan vanuit de RV SiteBuilder steeds terugkeren naar het controlepaneel, via de knop rechts bovenaan.

ASP.NET Test Jan Van Ryckeghem

1. Introductie tot SPSS

1. Inleiding van het.net programmeerplatform

Kies File>New>Blank Page>PHP. Je kunt eventueel nog een stylesheet koppelen. Definieer nu eerst een site! Dat betekent: Site>New Site

Technische nota AbiFire5 Rapporten maken via ODBC

Macro s. 4.2 Een macro maken

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at

EXCEL GEGEVENSBEHEER

Na bestudering van dit hoofdstuk, moet je tot het volgende in staat zijn:

Producten toevoegen. Inleiding

Een eerste applicatie

Technische nota AbiFire Rapporten maken via ODBC

6.8 Lijsten: oefeningen

8.8 Records selecteren

Formulieren maken met Dreamweaver CS 4/CS 5

6. Het maken van een database

MA!N Rapportages en Analyses

Van CaseTalk naar een database in SQLite studio

Les 15 : updaten van gegevens in de database (deel2).

Algemene handleiding 3BM applicatie. Inhoudsopgave

Handicom. Symbol for Windows. Image Manager. (Versie 4) Handicom, 2011, Nederland

Handleiding CMS VOORKANT

Formulieren en waarden posten naar een view

Inhoud van de website invoeren met de ContentPublisher

Systeemontwikkeling, Hoofdstuk 6, Query s, macro s en rapporten in MS Access 2010

Handleiding Vedor-editor

Inhoud Basiscursus. Access 2010 NL-NL

Badge it. Inhoudsopgave. 1. Installatie... 3

Databases - Inleiding

Central Station. CS website

Installatie en configuratie documentatie

INSTRUCT Samenvatting Praktijk Access 2010, H2 SAMENVATTING HOOFDSTUK 2

6.2 VBA Syntax. Inleiding Visual Basic

Handleiding. Verlinde Website

Databank - Basis 1. Inhoud. Computervaardigheden en Programmatie. Hoofdstuk 4 Databank - Basis. Terminologie. Navigeren door een Venster

Leren programmeren in C# Deel 2 - Gegevens

9.18 Macro s: oefeningen

Tutorial 1, Delphi: Geldspraak

CMS Instructiegids Copyright Endless webdesign v.o.f

Maak van je tabel een database. Handleiding van Helpmij.nl

SAN v3. Update document uitgebracht door OCEN

DATABASEBEHEER IN EXCEL

HANDLEIDING FLEETCALCULATOR

Hoofdstuk 4: Nieuwe objecten

HTS internet testen: testafnames via het internet en administratie op eigen pc

HANDLEIDING Q1600 Fashion

Info-books. Toegepaste Informatica. Financieel 2. HO33b. E. Goossens T. Janssens J. Gils

Systeemontwikkeling, Hoofdstuk 4, Tabellen maken in MS Access 2010

HANDLEIDING CERVIX MODULE MIRA 2011

Handleiding CMS-systeem website

8. De invoer van gegevens

[TOETS SQL INLEIDING]

Werken op afstand via internet

U ziet de progressie van de download aan de groene blokjes in het balkje helemaal onder aan de pagina.

Informatie Voor algemene vragen/opmerkingen omtrent de inhoud van deze site kunt u bellen of en met: Cargo Data Systems BV

Stappenplan Presentatie maken - 2

Data Warehouse Script Generator Doel

12. Meer dan één tabel gebruiken en sub-queries

Samenvoegen met Word en Excel 2010

Handleiding Afdrukken samenvoegen

NHibernate als ORM oplossing

6.3 VBA Syntax Instructie. Wij gaan de Visual Basic Editor opnieuw openen, om de instructie die wij zojuist getypt hebben, nader te bekijken.

Handleiding Reinder.NET.Tasks.SQL versie 2

HTS applicatie: digitaal testen via uw eigen pc met het Hogrefe TestSystem (HTS)

2.2 Een tabel ontwerpen

Excel Controller. Handleiding Excel Controller Wizard

Handleiding Wlijn Databeheer Internet

Samen op zoek naar proeven

Snel aan de slag met BasisOnline en InstapInternet

Cloudbackup. Whitelabel Handleiding. Versie: [10:25] Medewerkers Previder

Hoofdstuk 1: Een eerste Visual Basic project

Gebruikershandleiding Green Leaf Excel Tool Versie 1.1 (13 februari 2007)

Koppeling met een database

3.4 Een Hoofd/subformulier maken zonder de hulp van de wizard.

Les 11 : Basis SQL (deel2).

Report generator Gegevens zoeken en kolommen selecteren Rapporten opslaan en beheren... 6

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

Ook op internet wordt gebruik gemaakt van databases, zoals bij Marktplaats en Hyves.

Opdracht Informatica Tutorial Visual Basic

Calculatie tool. Handleiding. Datum Versie applicatie 01 Versie document

H AN D L E I DI N G FORM U LI E RM AK E R

Report generator Gegevens zoeken en kolommen selecteren Rapporten opslaan en beheren... 6

Labo 2 Programmeren II

1. Inloggen in systeem Scherm oriëntatie Overzichten genereren Mogelijk zoekmanieren... 5

UITLEG BIJ UW TEMPLATE

Transcriptie:

Hoofdstuk 3 Query's met parameters Een parameter in een query is eigenlijk niets anders dan een soort variabele in een query die nog een waarde moet krijgen. De volgende query heeft bijvoorbeeld geen parameter: SELECT * FROM Customers WHERE CustomerID='alfki' In deze query is 'alfki' een constante. Met deze query wordt telkens hetzelfde record uit de tabel Customers opgeroepen. De volgende query heeft een parameter: SELECT * FROM Customers WHERE CustomerID=@CustomerID In deze query is @CustomerID een parameter. Het is een soort variabele die je een waarde kunt geven (bijvoorbeeld de waarde 'alfki' of de waarde 'bonap'). Zo'n parameter moet, als je hem toepast in een query op een MS SQL-server database, altijd beginnen met @. Verder staat het je vrij welke parameternaam je gebruikt. Je had dus net zo goed @CID, of @klantnr kunnen gebruiken. In de query met de parameter zie je tevens dat je geen quotes (enkele aanhalingstekens) meer hoeft te gebruiken. Wat je daarentegen wel moet doen, is aangeven welk databasetype de parameter heeft (bijvoorbeeld: varchar of int). Dit doe je allemaal in je code. In leeropdracht 3.1 leer je hoe dit in z'n werk gaat. Voor de onderdelen die zijn aangegeven met * is de uitleg te vinden in hoofdstuk 3.2 Bijzondere onderwerpen. Leeropdracht 3.1 In deze opdracht gaan we een applicatie maken waarmee het volgende mogelijk is: Voer een klantnummer in een tekstbox in. Druk op een knop Zoeken. De gegevens van de bijbehorende klant verschijnen in aparte tekstboxen. Je kunt de gegevens in de tekstboxen aanpassen. Daarna druk je op een knop Wijzigen. De wijzigingen worden u opgeslagen in de database. Als de gegevens in de teksboxen staan, dan kun je ook op een knop Verwijderen drukken. Er verschijnt dan een messagebox waarin je kunt kiezen tussen Ja of Nee (een dialoogbox). Kies je Ja, dan wordt het bijbehorende record verwijderd Kies je Nee, dan wordt er verder niets gedaan. Tot slot moet je ook een nieuw record aan de tabel Customers kunnen toevoegen. In figuur 1 zie je hoe de gebruikersinterface van de applicatie eruitziet. 1

Figuur 1 Je in figuur 1 dat in plaats van losse knoppen,gekozen is voor een menubalk. Onder het item Bewerk staan de subitems Wijzig en Verwijder. Onder het item Nieuw staat het subitem Nieuwe rij en onder de optie Zoek staan geen subitems. In figuur 2 zie je de verschillende menuopties in designmode. Figuur 2 2

a. Start Visual Studio.NET en open een nieuwe Windows Forms Applicatie. b. Maak een menu zoals hiervoor is beschreven *. c. Plaats de tekstboxen en de teksten op het formulier. Hint: om veel tikwerk te voorkomen kun je deze tekstboxen kopiëren uit de applicatie van opdracht 2.3 in hoofdstuk 2. Op deze wijze zullen nu deze componenten volledig onderdeel gaan uitmaken van de nieuwe applicatie. Je kunt een componenten nu bereiken met dezelfde naam als die gebruikt werd in opdracht 2.3. We gaan eerst een aantal objecten maken, Een aantal daarvan heb je al in hoofdstuk 2 gebruikt. d. Voeg de namespace System.Data.SqlClient aan de applicatie toe. e. Maak de volgende objecten: Een SqlConnection connorthwind Een SqlCommand comklanten Een DataSet dsklanten Een SqlDataAdapter daklanten Een DataRow dreenklant, als volgt declareren: DataRow dreenklant; We gaan nu een aantal van deze objecten initialiseren in de constructor van Form1. f. Geef de connection connorthtwind een ConnectionString. g. Geef het command comklanten de Connection connorthwind. h. Geef het command comklanten de volgende CommandText: @"SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM Customers WHERE CustomerID=@CustomerID" Je zal ongetwijfeld denken: dat kan toch veel korter, zoiets als: @"SELECT * FROM Customers WHERE CustomerID=@CustomerID" Dat is waar, maar deze query is niet tot stand gekomen door veel zinloos tikwerk. Deze query is tot stand gekomen door gebruik te maken van SQL Server Management Studio. Je kunt hierin zelf eenvoudig query's maken. Dit kan op de volgende manieren: 3

1. Kies New Query. Voer daarna je query in. Moet je een tabelnaam of een veldnaam invoeren, dan kun je deze gewoon verslepen van de Object Explorer (linker venster) naar het tekstvlak. Als je klaar bent kopieer je de commandotekst naar je applicatie. 2. Door middel van de Query Designer (Eerst New Query daarna Ctrl+Shift+Q). Bouw je query op en kopieer de commandotekst naar je applicatie. Deze manier is handig als je query uit veel veldnamen bestaat. We gaan verder met de applicatie. Elk SqlCommand object heeft een collectie Parameters. Het object comklanten dus ook. Deze collectie is nu nog leeg. Om gebruik te maken van de parameter in de query, moeten we aan de collectie Parameters een exemplaar toevoegen. Dit doe je met de methode Add() van de collectie Parameters van het object comklanten. In de constructor van Form 1 komt daarom een regel te staan als: comklanten.parameters.add( ); Op de plaats van de puntjes zet je het volgende: "@CustomerID" dit is de naam van de parameter SqlDbType.NChar dit is het databasetype van de parameter. Zodat we het volgende krijgen: comklanten.parameters.add("@customerid", SqlDbType.NChar); i. Initialiseer het object comklanten door aan de collectie Parameters een exemplaar met de naam @CustomerID van het databasetype NChar toe te voegen. j. Geef het object daklanten als SelectCommand het object comklanten mee. k. Genereer een eventhandler op het event Click van de menuoptie Zoek. In deze eventhandler moet je de code schrijven die de gegevens de klant weergeeft, waarvan je het CustomerID in de daarvoor bestemde tekstbox hebt ingevoerd. Een paar hints: In de code moet de parameter eerst een waarde krijgen. Dit gaat als volgt: comklanten.parameters[0].value = tbxcustomerid.text; Parameters[0] betekent: de eerste (en in dit geval de enige) inde collectie. tbxcustomerid.text is de tekst in de tekstbox waar het CustomerID is ingevuld Vul de DataSet met de methode Fill() van daklanten. Geef het object dreenklant de eerste rij van de collectie Rows uit de eerste tabel van de collectie Tabels van de DataSet dsklanten ( dsklanten.tables[0].rows[0] ). 4

Vul de tekstboxen met de waardes van de velden van dreenklant, bijvoorbeeld: tbxcompanyname.text = dreenklant[1].tostring(); l. Maak de applicatie af zodat de gegevens van een klant zichtbaar worden in de textboxen na het invullen van het CustomerID en het kiezen van de menuoptie Zoek. m. Pas de applicatie verder aan zodat je foutmeldingen krijgt als: Je niets in de tekstbox voor het CustomerID hebt ingevuld Het CustomerID niet bestaat. Dit test je met : if(dsklanten.tables[0].rows.count==0) n. Pas de applicatie verder aan zodat de opties Wijzig en Verwijder uitgeschakeld zijn als Er geen gegevens in de tekstboxen staan, of als er een niet bestaand CustomerID is ingevoerd. Je kun nu een klant zoeken op CustomerID en de gegevens van de gevonden klant aanpassen. Nu gaan we de applicatie zodanig aanpassen dat je ook een gevonden klant kunt verwijderen. o. Maak een nieuw SqlCommand object met de naam comverwijderklant. p. Geef dit een object een CommandText waarmee je een klant uit de tabel Customers kunt verwijderen. Gebruik hierin een parameter. q. Voeg aan de collectie parameters van het object comverwijderklant een exemplaar toe (met de naam en het type van de parameter uit opdracht p). r. Geef dit object de connection connorthwind. s. Maak nu eerst een nieuwe klant aan in de tabel Customers met behulp van SQL Server Management Studio. t. Breid de applicatie nu uit zodat na het zoeken van de nieuwe klant, deze weer verwijderd kan worden met de optie Verwijder uit het menu. Hint: Je kunt een INSERT of een DELETE query eenvoudig uitvoeren zonder gebruik te maken van de data-adapter. Dit zijn namelijk query's zonder returnwaarden uit de database (zoals bij een SELECT query het geval is). We noemen dergelijke query's een NonQuery. In de volgende opdrachtregel zie je hoe zo'n query moet worden uitgevoerd: comverwijderklant.executenonquery(); Voordat je deze query uitvoert, moet je wel even de connectie openen. Nadat de query is uitgevoerd is het verstandig de connectie weer te sluiten. u. Maak een dialoogbox * die er uiteindelijk uitziet als in figuur 3 in het event Click van de menuoptie Verwijder. 5

Figuur 3 v. Maak de applicatie verder af zodat na de keuze Ja het record ook daadwerkelijk verwijderd wordt. w. Zorg ervoor dat na het verwijderen van het record dat tekstboxen leeggemaakt worden*. Nu het laatste nog, het toevoegen van een nieuwe klant aan de tabel Customers door middel van de applicatie. Eigenlijk gaat moet je grotendeels dezelfde procedure volgen, namelijk: Maak een SqlCommand object. Geef dit object een CommandText met parameters. Geef dit object een SqlConnection object. Voeg deze parameters aan de collectie Parameters van het SqlCommand object toe (parameternaam en SqlDbType opgeven). De parameters in de collectie Parameters een waarde geven. De query uitvoeren (met met behulp van een DataAdapter of met de methode ExecuteNonQuery() van het SqlCommand object). Voor het invoeren van een nieuw record aan een database, moet er eerst een nieuwe lege rij aan Table[0] in de DataSet dsklanten worden toegevoegd. Dit doe je met de volgende code: dsklanten.tables[0].newrow(); Verder kan het volgende probleem ontstaan: Als het toevoegen van een nieuwe klant de eerste operatie is na het openen van de applicatie, dan ontstaat er een fout in de bovenstaande code. Dit komt omdat er op dat moment nog helemaal geen Tables[0] in de collectie Tables van de Dataset zit. Je zou dan eerst een klant moeten zoeken en weergeven, en daarna kun je pas een klant toevoegen. Om dit probleem te voorkomen kun je het beste bij het openen van de applicatie een tabel in de DataSet dsklanten toevoegen met: dsklanten.tables.add(); 6

Daarna moet je bij de zoekfunctie de regel daklanten.fill(dsklanten); wijzigen in: daklanten.fill(dsklanten.tables[0]); Tot slot kun je de gegevens met behulp van een query toevoegen. x. Genereer een eventhandler voor het event Load van Form1. y. Pas de applicatie aan zodat bij het starten van de applicatie een tabel aan dsklanten wordt toegevoegd. z. Pas de regel waarbij de DataSet wordt gevuld zodanig aan dat Tables[0] in de DataSet wordt gevuld. aa. Breid de applicatie verder uit, zodat het mogelijk is de gegevens van een nieuwe klant toe te voegen. bb. Vang de fout af die kan optreden als je een record toevoegt waarvan de waarde van de primaire sleutel van de tabel Customers al bestaat *. cc. Maak de applicatie verder af, zodat je gegevens van een klant (die je hebt gevonden met de zoekmogelijkheid) kunt wijzigen. Hierbij mag het CustomerID niet worden gewijzigd. 7

3.2 Bijzondere onderwerpen In dit hoofdstuk vind je aanwijzingen die nuttig zijn voor het maken van de applicatie in leeropdracht 3.1. Onderwerp: Een menu maken. Een menu maken is eigenlijk heel eenvoudig: Versleep de component MenuStrip vanuit de toolbox naar je formulier. Er wordt dan een horizontale menustrook bovenin het formulier zichtbaar (zie figuur 4). Figuur 4 Voer op de daarvoor aangegeven plaatsen de menu-items en eventueel sub menu-items in. De afzonderlijke menu-items kun je als afzonderlijke componenten bewerken in het propertievenster. De pictogrammen bij de menuopties kun je zelf toevoegen bij de propertie Image dat elke afzonderlijke menuoptie heeft (in het propertiescherm). De pictogrammen kun je het beste onderdeel laten uitmaken van je project (voeg een nieuw folder toe aan je project en zet daar de plaatjes in). Een menu-optie kun je uitschakelen (grijs maken) door de propertie Enabled op false te zetten. Elke menuoptie gedraagt zich als een knop (met bijvoorbeeld een event Click). Je kunt voor elke menuoptie dus een eventhandler op het event Click genereren. Hierin kun je de code zetten die moet worden uitgevoerd als je het menu-item selecteert. Onderwerp: Een dialoogbox maken Een dialoogbox is eigenlijk niets anders dan een MessageBox met meer dan 1 knop. Een gewone MessageBox maak je als volgt: MessageBox.Show("Hier komt mijn message"); In bovenstaand geval heeft de methode Show() slechts 1 parameter, namelijk: de message-tekst. In de MessageBox in de applicatie van leeropdracht 3.1 heeft de MessageBox meer dan 1 parameters, namelijk: De massage-tekst De caption (de tekst in de titelbalk van de MessageBox. De MessageBoxButtons (de knoppen in de messagebox). Het MessageBoxIcon (het plaatje in de messagebox). 8

De code voor een dergelijke MessageBox wordt nu: MessageBox.Show("Weet je zeker dat deze klant verwijderd moet worden?", "Klant Verwijderen", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); Om het geheel overzichtelijk te houden staan de parameters van de methode Show() onder elkaar (let op de komma's tussen de parameters). MessageBoxButtons en MessageBoxIcon zijn voorbeelden van enumerations. Dit zijn opsommingen van verschillende constanten waaruit je een keuze kunt maken. In ons geval is de keuze gevallen op de constanten YesNo en Warning. De dialoogbox heeft als returntype een enumeration met als keuzemogelijkheid Yes of No. Deze enummeration is het type DialogResult (een type in.net). Het resultaat van de dialoogbox kunnen we opvangen met een variabele van het type DialogResult. Dit gaat als volgt: DialogResult antwoord= MessageBox.Show("Weet je zeker dat deze klant verwijderd moet worden?", "Klant Verwijderen", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); Ook hier is de code weer verdeeld over verschillende regels. Je kunt het resultaat van de dialoogbox testen met een if-statement, bijvoorbeeld: if(antwoord == DialogResult.Yes) Onderwerp: Textboxen leegmaken door gebruik te maken van een array. Soms moet je alle tekstboxen in je applicatie leeg maken. Je kunt dit op verschillende manieren doen. Een manier is deze tekstboxen in een array van het type TextBox te plaatsen. Dit gaat als volgt: Eerst globaal een array declareren die groot genoeg is om alle texboxen in te zetten: TextBox[] arrtbx = new TextBox[11]; Dan de array vullen met textboxen: arrtbx[0] = tbxcustomerid; arrtbx[1] = tbxcompanyname; Het vullen van de array kun je in het event Load van Form1 doen. 9

Als je ergens in het programma alle teksboxen wilt leegmaken, dan hoef je alleen de volgende code uit te voeren: foreach (TextBox tbx in arrtbx) tbx.text = ""; Onderwerp: Het afvangen van de fout af die kan optreden als je een record toevoegt waarvan de waarde van de primaire sleutel van de tabel Customers al bestaat met behulp van een try-catch statement. Het kan voorkomen dat je een nieuw record invoegt met een reeds bestaand CustomerID (bijvoorbeeld 'alfki'). Er wordt dan een fout gegenereerd door SQL server (zie figuur 5). Figuur 5 Probeer het maar eens uit. Je kunt dit soort fouten ondervangen met het try-catch statement. Het try- statement heeft twee delen. 1. Het try-blok: hierin staat het deel waarin een fout kan optreden. 2. Het catch-block: hierin staat de code die moet worden uitgevoerd als een fout in het catch-blok optreedt. De syntax van het try-catch statement is als volgt: try Code waarin een fout kan optreden. catch (exeption_type e) Afhandeling van de fouten die kunnen optreden. 10

In de applicatie van leeropdracht 3.1 kun je dus de code voor invoeren van het nieuwe record in de tabel Customers in het try-blok plaatsen. Het catch-blok ziet er als volgt uit: Verklaring: catch (SqlException ex) if (ex.number == 2627) MessageBox.Show("Er bestaat al een klant met dit klantnummer"); SqlException is een class met een aantal properties, waaronder de property Number. Deze klasse heeft een internal constructor. ex is een instantie van deze class. De property Number krijgt een waarde afhankelijk van de fout die optreedt. Als je een record probeert toe te voegen waarvan de waarde van de primaire sleutel al bestaat, dan krijgt de property Number de waarde 2627. De rest van de code is voor de hand liggend. De vraag rijst nu: hoe kom ja aan het foutnummer 2627? Heel eenvoudig, voer eerst de volgende code in het catch-blok uit: catch (SqlException ex) MessageBox.Show(ex.Number.ToString); Bij het optreden van de fout krijg je een Messagebox met daarin het foutnummer. Daarna kun je het foutnummer in een if-statement verwerken. Let op dat je het foutnummer niet tussen quotes zet, want het foutnummer is van het type int. Als er meer exceptions in een bepaald try-blok kunnen optreden. Dan kun je deze in het catch-block afhandelen met een apart if-statement of in een switch-case statement. Onderwerp: een combobox vullen met waarden uit een database met behulp van een SqlDataReader. Een SqlDataReader is een object waarin, door middel van een SqlCommand, gegevens kunnen worden ogeslagen. De grote verschillen met een DataSet is, dat de gegevens in een SqlDataReader read only zijn, en dat de SqlDataReader alleen connectie heeft met de database heeft tijdens het vullen ervan. Een SqlDataReader kun je daarom uitstekend gebruiken bij het vullen van een control waarvan de waarden niet bewerkt hoeven te worden. Een combobox waarin je uit een aantal vaste waarden kunt kiezen is zo'n voorbeeld. In het volgende voorbeeld zie je hoe je een combobox vult met behulp van een SqlDataReader. 11

Eerst declareer je een SqlDataReader en maak je een SqlCommand object: SqlDataReader SqlCommand drklantnummers; comklantnummers = new SqlCommand(); De klasse SqlDataReader heeft geen constructor, dus hoeft niet met new te worden geïnstantieerd te worden. Daarna moet je het object comklantnummers initialiseren: comklantnummers.connection = connorthwind; comklantnummers.commandtext = "SELECT CustomerID FROM Customers ORDER BY CustomerID"; Voer nu binnen een event (bijvoorbeeld Load van een Form) de volgende code uit: connorthwind.open(); drklantnummers = comklantnummers.executereader(); while(drklantnummers.read()) combobox1.items.add(drklantnummers.getvalue(0).tostring()); connorthwind.close(); Uitleg van de code: Eerst wordt de connectie geopend. Daarna wordt de SqlDataReader gevuld. Hiervoor heeft het SqlCommand object comklantnummers een speciale methode, namelijk: ExecuteReader( ). Deze methode voert het commando comklantnummers uit en geeft het resultaat aan de SqlDataReader. In het while statement "loopt" door de SqlDataReader van begin tot eind. De methode Read() van de SqlDataReader leest telkens een rij in de SqlDataReader. Eigenlijk verplaatst de methode Read() de row pointer telkens na elke doorgang van het while statement. In de regel combobox1.items.add(drklantnummers.getvalue(0).tostring()); wordt aan de collection Items van de combobox een exemplaar toegevoegd. De waarde van dit item is een waarde van de SqlDataReader waar de row pointer op staat. De methode GetValue(0) haalt de waarde van uit de eerste kolom van de SqlDataReader op (de SqlDataReader heeft in dit geval maar 1 kolom). 12

3.3. Opdrachten Opdracht 3.3.1. Maak een applicatie waarbij je kunt zien welke klant (Naam en telefoonnummer) uit een bepaald land komt. Het land moet te selecteren zijn uit een combobox. Deze combobox moet worden gevuld met behulp van de landen uit de database door middel van een DataReader*. Gebruik in deze applicatie parameters in de queries. Opdracht 3.3.2. Maak een applicatie die aan de volgende eisen voldoet: Je moet een klantnummer kunnen invoeren. Van die klant moeten in een combobox alle ordernummers van de orders van die klant komen te staan. Gebruik hiervoor een DataReader*. Als je een ordernummer hebt geselecteerd, dan moet in een DataGridView het volgende komen te staan: 1. De productomschrijvingen van de producten die bij die order zijn besteld. 2. Het aantal producten op elke regel bij de productomschrijvingen. 3. Het aantal bestelde producten op elke regel. 4. De stuksprijs op elke regel. 5. De totaalprijs per regel. Tevens moet onder de DataGridView de totaalprijs van de gehele order komen te staan. Gebruik in de queries parameters. Deze applicatie gebruik je in een volgend hoofdstuk opnieuw. 13