HOGENT - graduaat programmeren - programmeren 3

Page 1

Programmeren 3

Hoofdstuk 1 – Data structuren Hoofdstuk 2 – Delegates, lambda functies, extension methods en events Hoofdstuk 3 – Git Hoofdstuk 4 – File IO Hoofdstuk 5 – Linq Hoofdstuk 6 – Exceptions Hoofdstuk 7 – ADO.NET


Delegates (https://www.tutorialsteacher.com/csharp/csharp-delegates) → wat ? Functie als parameter doorgeven Call back function of event handler

➔ Delegate (pointer naar een functie)

→ Alternatieve initialisatie :

→ Invoke delegate (functie oproepen)

→ delegate als parameter


→ multicast delegate Een delegate kan naar meerdere methodes/functies wijzen (=multicast delegate). Om functies toe te voegen kan “+” gebruikt worden om methodes te verwijderen “-“.



Func /Action (https://www.tutorialsteacher.com/csharp/csharp-func-delegate) (https://www.tutorialsteacher.com/csharp/csharp-action-delegate) Func is een generieke delegate in de System namespace en heeft nul of meerdere input parameters en 1 output parameter. De laatste parameter wordt beschouwd als de output.

Voorbeeld :


Func in combinatie met een anonieme methode :

Func in combinatie met lambda expressie :

Action is eveneens een delegate type gedefinieerd in de System namespace, maar geeft in tegenstelling tot Func geen waarde terug. (vergelijk met methode dat void als return type heeft) Voorbeeld :

Initialisatie kan door direct een functie toe te kennen of door middel van new.


Ook hier kan gebruik gemaakt worden van anonieme functies of lambda expressies :


Lambda functies (https://www.tutorialsteacher.com/linq/linq-lambda-expression) Is een kortere manier om anonieme methodes te schrijven. Voorbeeld overgang van anonieme methode naar lambda expressie :

Hebben we te maken met een functie die uit slechts 1 statement bestaat en een waarde terug geeft dan kunnen we verder vereenvoudigen tot :

Syntax :

Lambda expressie zonder parameters :

Lambda expressie met meerdere parameters :


Of

Lambda expressies kunnen ook meerder statements bevatten :


Extension method (https://www.tutorialsteacher.com/csharp/csharp-extension-method) Extension methods laten toe om extra methodes toe te voegen aan classen zonder de originele classen aan te passen of overerving te gebruiken. Voorbeeld :



Events (https://www.tutorialsteacher.com/csharp/csharp-event) (https://docs.microsoft.com/en-us/dotnet/standard/events/) (https://nl.wikipedia.org/wiki/Observer_(ontwerppatroon)) Een event is een boodschap die door een object wordt gestuurd om te laten weten dat een bepaalde actie heeft plaats gevonden. Het object dat het event stuurt noemen we de ‘event sender’, dit object weet niet naar wie de boodschap wordt verstuurd. Het design pattern dat hierbij aansluit is het ‘observer design pattern’. We hebben hierbij een ‘publisher’, het object dat de boodschap stuurt en 1 of meerdere ontvangers of ‘subscribers’. Deze ontvangers kunnen zich registreren bij de ‘publisher’ om de desgewenste boodschappen (notifications) te ontvangen. Dit patroon wordt vooral gebruikt om een zwakke koppeling tussen objecten te realiseren, zodat objecten vrij onafhankelijk van elkaar kunnen bestaan.

Voorbeeld




Opgave oefening Events Context Er wordt gevraag om een applicatie te bouwen waarbij de verkoop in een winkel (het plaatsen van een bestelling) wordt opgevolgd zowel door de sales afdeling als het stockbeheer. Daarbij komt ook nog dat het stockbeheer zelf zal worden opgevolgd door het plaatsen van orders bij een groothandelaar.

Overzicht ontwerp

Detail info De producten die worden verkocht zijn beschreven door middel van een enumeratie :

Wanneer een product wordt verkocht, noemen we dat een bestelling en deze bevat de volgende informatie :

De klasse Winkel moet vanuit businessperspectief enkel een methode hebben om producten te verkopen, deze functie kan er als volgt uitzien :


De Sales klasse beschikt over een inventaris van alle geplaatste bestellingen en beschikt over een methode om deze ook te rapporteren. Bestellingen worden bijgehouden per klant (waarbij we de klant identificeren op basis van het adres. Het rapport ziet er bijvoorbeeld als volgt uit :

De klasse stockbeheer houdt voor elk product bij hoeveel er in stock is (we initialiseren de stock voor elk product met 100). Telkens er een verkoop heeft plaats gevonden in de winkel moet de stock worden aangepast. Wanneer de stock voor een bepaald product onder een minimumgrens valt (bijvoorbeeld 25 stuks) moet de groothandelaar worden geĂŻnformeerd om een bestelling te plaatsen om de stock aan te vullen. Deze bestelling moet ervoor zorgen dat de voor elk product het maximum aantal weer in stock is. De klasse stockbeheer moet ook beschikken over een methode om de stock te tonen en een methode om de stock aan te vullen. De klasse groothandelaar houdt een lijst bij van alle bestellingen die er zijn geplaatst en moet een functie hebben om de laatste bestelling op te vragen. Daarnaast moet deze klasse ook alle bestellingen kunnen tonen.

Voorbeeld Na de verkoop van volgende producten :

Moet de stock er als volgt uitzien :

Het Sales-rapport toont dan :


De voorraadbestellingen zijn :

En na het aanvullen van de stock ziet deze er weer als volgt uit :

Veel success !


Sql Server Express, SQL Server Management Studio, example databases

1. Install SqlExpress Download

https://www.microsoft.com/en-us/sql-server/sql-server-downloads

Install

Chose: “Download 2019 Express edition now”

Install everything but “SQL Server Reporting Services”. We start by clicking on “New SQL Server stand-alone installation or add features to an existing installation”

Chose “Custom”

1


Sql Server Express, SQL Server Management Studio, example databases

2


Sql Server Express, SQL Server Management Studio, example databases Accept license terms:

Select “Use Microsoft Update”:

3


Sql Server Express, SQL Server Management Studio, example databases

4


Sql Server Express, SQL Server Management Studio, example databases

We will open up the required network ports later on, using a script:

5


Sql Server Express, SQL Server Management Studio, example databases

Keep current selection:

Keep proposed name (named instance was “SqlExpress� on another computer):

6


Sql Server Express, SQL Server Management Studio, example databases

Keep default configuration:

7


Sql Server Express, SQL Server Management Studio, example databases

You can chose to use only “Windows authentication mode� or mixed mode (Windows authentication mode and user/password):

8


Sql Server Express, SQL Server Management Studio, example databases

9


Sql Server Express, SQL Server Management Studio, example databases

2. Install SQL Server Management Studio

10


Sql Server Express, SQL Server Management Studio, example databases

11


Sql Server Express, SQL Server Management Studio, example databases

Not installed yet:

12


Sql Server Express, SQL Server Management Studio, example databases

3. Configure SQL Server

• •

Enable Named Pipes Enable TCP/IP

Restart SqlServer

4. Open ports firewall https://docs.microsoft.com/en-us/sql/sql-server/install/configure-the-windows-firewallto-allow-sql-server-access?view=sql-server-ver15

netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT 13


Sql Server Express, SQL Server Management Studio, example databases As Administrator: netsh advfirewall firewall add rule name = SQLPort dir = in protocol = tcp action = allow localport = 1433 remoteip = localsubnet profile = DOMAIN

14


Sql Server Express, SQL Server Management Studio, example databases

5. NorthWind, Pubs and AdventureWorks example databases https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/downloadingsample-databases https://github.com/Microsoft/sql-serversamples/tree/master/samples/databases/northwind-pubs Run the scripts in SSMS 1. 2. 3. 4.

Open SSMS. Connect to the target SQL Server. Open the script in a new query window. Run the script.

Run the scripts in SSDT or Visual Studio 6. Open SSDT or Visual Studio. 7. Open the SQL Server Object Explorer. 8. Connect to the target SQL Server. 9. Open the script in a new query window. 10. Run the script.

15


Sql Server Express, SQL Server Management Studio, example databases Copy to C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\Backup:

Restore using SQLServer Management Studio:

Refresh:

AdventureWorks: https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks

16


Sql Server Express, SQL Server Management Studio, example databases

17


Sql Server Express, SQL Server Management Studio, example databases

6. Northwind database

18


Sql Server Express, SQL Server Management Studio, example databases

7. Upgrading https://medium.com/cloudnimble/upgrade-visual-studio-2019s-localdb-to-sql-2019da9da71c8ed6

19


Contents ADO.NET ................................................................................................................................................... 2 1.1

Data model ............................................................................................................................... 2

1.2

SqlServer data provider ............................................................................................................ 8

1.2.1

Aanmaken project ............................................................................................................ 8

1.2.2

Connection ....................................................................................................................... 9

1.2.3

Command en Parameters .............................................................................................. 10

1.2.4

Adapter en CommandBuilder ........................................................................................ 12

1.2.5

Transaction ..................................................................................................................... 14

1.3

Generic ................................................................................................................................... 15

1.3.1

Aanmaken project .......................................................................................................... 15

1.3.2

DbProviderFactory ......................................................................................................... 15

1.3.3

Connection ..................................................................................................................... 15

1.3.4

Command en Parameters .............................................................................................. 16

1.3.5

Adapter en CommandBuilder ........................................................................................ 17

1.3.6

Transaction ..................................................................................................................... 18

1.4

DataSet ................................................................................................................................... 19


ADO.NET 1.1 Data model

Stap 1 – aanmaken databank (Microsoft SQL Server Management Studio)


Stap 2 – Voeg connectie toe naar databank


Stap 3 – design tabellen

Opmerking identity column !


SQL statements

Opmerking : composite Key


Opslaan SQL statements


Stap 4 – aanmaken tabellen in SQL Server


1.2 SqlServer data provider 1.2.1 Aanmaken project -

Add .Net Core project Dependencies

-

Klassen


1.2.2 Connection

ConnectionString – selecteer properties in server beheer


1.2.3 Command en Parameters 1.2.3.1

Insert

1.2.3.2

Datareader


1.2.3.3

Query over meerdere tabellen


1.2.4 Adapter en CommandBuilder 1.2.4.1

Update


1.2.4.2

Delete


1.2.5 Transaction

Opmerking : insert over meerdere tabellen met identity column !


1.3 Generic 1.3.1 Aanmaken project -

Add .Net Core project Dependencies

1.3.2 DbProviderFactory -

Registreren van SqlClientFactory

-

Factory als parameter in constructor

1.3.3 Connection


1.3.4 Command en Parameters


1.3.5 Adapter en CommandBuilder


1.3.6 Transaction


1.4 DataSet (https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-architecture)


ADO .NET

1. Databanken

1.1. Databank connecties 1.1.1. System.Data of ADO.NET In dit hoofdstuk bespreken we het benaderen van datasources als databanken. De System.Data namespace in de klassenbibliotheek van het .NET Framework biedt enkel mogelijkheden (datatypes met ingebouwde functionaliteiten) die ons dit toestaan.

Men verwijst ook wel met de term ADO.NET naar deze datatypes en bijhorende functionaliteiten. ADO.NET is de opvolger van ADO uit het pre .NET tijdperk. ADO stond voor ActiveX Data Objects, de huidige voorzieningen hebben echter nog weinig te maken met de verouderde ActiveX technologie. •

Microsoft Docs: ADO.NET Overview (Development Guide, Data and Modeling): http://msdn.microsoft.com/en-us/library/h43ks021(v=vs.110).aspx Externe links 1

1.1.2. Connecties creëren en gebruiken In volgende voorbeelden wordt gewerkt met een MicroSoft SQL Server database bestand (.mdf). Afhankelijk van de geïnstalleerde versie van Visual Studio of geïnstalleerde updates op jouw systeem zal ook een bepaalde versie van SQL Server (Express (LocalDB)) geïnstalleerd zijn. Het is bovendien mogelijk om zelf een volledige instantie van SQL Server “Express” gratis te installeren.

Om informatie uit een database te kunnen benaderen heb je nood aan een verbinding (connectie) met de database. Deze verbinding kan tot stand worden gebracht aan de hand van een connection object. Afhankelijk van het type database management server (Microsoft SQL Server, Oracle, MySQL, Microsoft Access, ...) of het type van driver bruikbaar om dergelijke dbms te benaderen, zal je gebruik moeten maken van een connection object van een bepaald datatype: •

System.Data.SqlClient.SqlConnection voor Microsoft SQL Server databases. 1


ADO .NET

• • •

System.Data.OracleClient.OracleConnection voor Oracle databases. MySql.Data.MySqlClient.MySqlConnection voor MySQL databases. System.Data.Odbc.OdbcConnection of System.Data.OleDb.OleDbConnection v oor Microsoft Access databases.

Zoals je ziet zijn vele van deze types vervat in de System.Data namespace van de klassenbibliotheek van het .NET FrameWork. using System.Data.SqlClient; //... SqlConnection conn = new SqlConnection(); C# broncode fragment 1

Microsoft Docs: Establishing the Connection (Development Guide, Data and Modeling, ADO.NET): http://msdn.microsoft.com/enus/library/ms254507(v=vs.110).aspx Externe links 2

1.1.2.1. Connectionstring Bij creatie van een connection object kan je aan de constructor doorgeven welke datasource wordt geconnecteerd.Wat de lokatie is van waarop de datasource wordt geconnecteerd, wat de authenticatie (gebruikersnaam en wachtwoord) is voor het connecteren, ... .

Al deze informatie wordt samen in één string ondergebracht, de connectionstring. string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=TestDb1.mdf;Integrate d Security=True;Connect Timeout=30" SqlConnection conn = new SqlConnection(connectionString); C# broncode fragment 2

Aan de constructor van het connection object kan je de connectionstring doorgeven.

Hoe de connectiestring er zal uitzien is dus afhankelijk van het type dbms waarvan je gebruik maakt, de fysieke locatie van je database bestanden of de naamgeving van je databaseserver of serverinstanties, de authenticatie methode, enzovoort. The Connection String Reference: http://www.connectionstrings.com/ 2


ADO .NET Externe links 3

Visual Studio beschikt over uitstekende mogelijkheden om op basis van enkele configuratiestappen de connectionstring voor ons samen te stellen.

Indien je dat zou wensen, kan je een connectionstring ook at runtime opbouwen. •

Microsoft Docs: Connection String Builders (Development Guide, Data and Modeling, ADO.NET): http://msdn.microsoft.com/enus/library/ms254947(v=vs.110).aspx Externe links 3

Om at configuration time (tussen compile- en runtime) de connectionstring nog aan te kunnen passen kan men overwegen deze informatie in een extern bestand (configuration bestand) op te nemen. Ook uit beveiligingsredenen kan dergelijke aanpak interessant zijn. •

Microsoft Docs: Connection Strings and Configuration Files (Development Guide, Data and Modeling, ADO.NET): http://msdn.microsoft.com/enus/library/ms254494(v=vs.110).aspx Externe links 4

1.1.2.2. Openen van een connectie Dergelijk connection object stelt de verbinding voor maar is pas bruikbaar wanneer de connectie geopend wordt. Om de connectie te openen gebruik je de Open() method SqlConnection conn = new SqlConnection(connectionString); conn.Open(); C# broncode fragment 3

1.1.2.3. Sluiten van een connectie Omdat de datasource een schaarse bron is, gaan we de verbinding naar deze datasource zo snel mogelijk gaan sluiten. Om de connectie af te sluiten gebruik je de Close() method, indien deze connectie later nog opnieuw wordt geopend (via de Open() method), of Dispose() indien deze connectie verderop niet meer wordt gebruikt. SqlConnection conn = new SqlConnection(connectionString); conn.Open();

3


ADO .NET

//... conn.Dispose(); C# broncode fragment 4

Dit is vergelijkbaar met de Close() method voor System.IO stream objecten (bv StreamReader en StreamWriter) die de stream finaliseert. Ook voor deze stream objecten is er eigenlijk een Dispose(), maar het disposen (vrijgeven) van de resources gekoppeld aan deze stream gebeurt hier al bij het closen (Close()). Bijgevolg is er voor stream objecten geen noodzaak tot het aanroepen van deze Dispose() method.

Ter herinnering: het aanroepen van dergelijke finalisatie methods (Close(), Dispose(), ...) in een finally gedeelte van een try statement wordt beschouwd als good practice. Dit zal ervoor zorgen dat altijd, zelfs indien het try statement -zelf- geen afhandeling voorziet van optredende excepties, toch nog finalisatie zal optreden. SqlConnection conn; try { conn = new SqlConnection(connectionString); conn.Open(); //... conn.Close(); } catch(Exception e) { } finally { conn?.Dispose(); conn = null; } C# broncode fragment 5

Hetzelfde resultaat bekomt men met een using statement... using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); 4


ADO .NET

//... } C# broncode fragment 6

Een using statement garandeert het disposen (aanroepen van de Dispose() method) van de resource, hier het database connection object, aan het eind van het using statement. Zelfs al zou er een exceptie optreden in de body van het statement, dan nog zal de resource gedisposed worden nog vooraleer de call stack wordt afgedaald om te zoeken naar afhandeling. Hierbij wordt dus hetzelfde effect bekomen als bovenstaand try statement. Indien de connectie verderop nog wordt gebruikt, en dus opnieuw wordt geopend, moet je in plaats van Dispose() de Close() method te gebruiken. SqlConnection conn; conn = new SqlConnection(connectionString); conn.Open(); //... conn.Close(); //... conn.Open() //... conn.Close(); //... conn.Open() //... conn.Dispose() C# broncode fragment 7

1.2. Basis objecten 1.2.1. Uitlezen van de databank 1.2.1.1. Command en DataReader object Indien je record-informatie van een datasource wil uitlezen kan je gebruik maken van een datareader (System.Data.SqlClient.SqlDataReader) object. Een data reader is een connected (verbonden/life) browser object om door bepaalde record informatie te navigeren. Aan de hand van een command (SqlCommand) object, die zowel op de hoogte is van

5


ADO .NET

de te gebruiken verbinding als de selectie query, reader instantiëren. Dit via de ExecuteReader() method...

kan

je

een data

Voor .NET Core, gebruik nuget: klik rechts op project, selecteer “Manage Nuget packages…” en kies onder “Browse”: “Microsoft.Data.SqlClient”. Bevestig de licentie en zie hoe de noodzakelijke packages onder “Dependencies” toegevoegd worden. Vergiet niet de connection string aan te passen naar deze welke je kan vinden onder: Server Explorer > Data Connections > .mdf: rechterklik naar Properties en dan Connections > Connection string. namespace Databanken { namespace BasisObjecten { // .NET Core: using Microsoft.Data.SqlClient; // .NET Frameworks: // using System.Data.SqlClient; using System; class Program { private static void Main() { // Gebruik connection string van .mdf: var connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\u2389\OneDrive\Documenten\Test Db.mdf;Integrated Security=True;Connect Timeout=30"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); PrintPersonsTable(conn); } Console.ReadLine(); } public static void PrintPersonsTable(SqlConnection c) { SqlCommand command = new SqlCommand("SELECT Id, Naam, Email, Geboortedatum FROM PersonenTabel;", c); SqlDataReader dataReader = command.ExecuteReader(); if (dataReader.HasRows) { while (dataReader.Read()) { int id = (int)dataReader["Id"]; string naam = (string)dataReader["Naam"]; string email = (string)dataReader["Email"]; DateTime geboortedatum = (DateTime)dataReader["Geboortedatum"]; Console.WriteLine($"{id} | {naam} | {email} | {geboortedatum.ToShortDateString()}"); } } else { Console.WriteLine("Geen personen(records) gevonden."); }

6


ADO .NET dataReader.Close(); } } } }

C# broncode voorbeeld 1

1 | Jan | jan @hotmail.com | 27/01/2001 2 | Pol | pol @gmail.com | 28/02/2002 3 | Piet | piet @hotmail.com | 29/03/2003 Console Application uitvoer 1

Elke Read() opdracht zal binnen de reader de cursor laten wijzen naar het volgende record. False wordt opgeleverd indien geen verdere record informatie wordt gevonden. Een opzet als while (dataReader.Read()) wordt bijgevolg vaak gebruikt om alle record informatie te benaderen. De HasRows property wordt gebruikt om na te gaan of er wel records werden gevonden.

Tussen vierkante haakjes kan je verwijzen naar de uit te lezen kolom. De in object vorm opgeleverde waarde wordt in het voorbeeld telkens gecast naar het gewenste datatype.

Ook een data reader wordt expliciet gefinaliseerd, dit is mogelijk aan de hand van de Close() method.

1.2.2. Data aanpassen 1.2.2.1. ExecuteNonQuery Command objecten kunnen ook gebruikt worden om SQL data manipulation language (delete, insert en update instructies) mee uit te voeren. In dat geval gebruik je de ExecuteNonQuery() method... namespace Databanken { namespace BasisObjecten.ManipulerenVanInformatie { using System; using Microsoft.Data.SqlClient; class Program { 7


ADO .NET

static void Main() { var connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Perso using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); PrintPersonsTable(conn); Console.Write("Aanpassen naam in James van persoon met id?: "); string updateSql = $"UPDATE PersonenTabel SET Naam = 'James' WHERE Id = {Console.ReadLine()}; "; SqlCommand updateCommand = new SqlCommand(updateSql, conn); updateCommand.ExecuteNonQuery(); Console.WriteLine("Invoegen nieuwe persoon met naam John, geboortedatum 10 oktober 1979..."); string insertSql = $"INSERT INTO PersonenTabel (Naam, Email, Geboortedatum) VALUES ('John', 'john@mail.be', '197910-31');"; SqlCommand insertCommand = new SqlCommand(insertSql, conn); insertCommand.ExecuteNonQuery(); Console.Write("Verwijderen persoon met id?: "); string deleteSql = $"DELETE FROM PersonenTabel WHERE Id = {Console.ReadLine()};"; SqlCommand deleteCommand = new SqlCommand(deleteSql, conn); deleteCommand.ExecuteNonQuery(); PrintPersonsTable(conn); } Console.ReadLine(); } public static void PrintPersonsTable(SqlConnection c) { SqlCommand command = new SqlCommand("SELECT Id, Naam, Email, Geboortedatum FROM PersonenTabel;", c); SqlDataReader dataReader = command.ExecuteReader(); if (dataReader.HasRows) { while (dataReader.Read()) 8


ADO .NET

{ int id = (int)dataReader["Id"]; string naam = (string)dataReader["Naam"]; string email = (string)dataReader["Email"]; DateTime geboortedatum = (DateTime)dataReader["Geboortedatum"]; Console.WriteLine($"{id} | {naam} | {email} | {geboortedatum.ToShortDateString()}"); } } else { Console.WriteLine("Geen personen(records) gevonden."); } dataReader.Close(); } } } } C# broncode voorbeeld 2

1 | Jan | jan @hotmail.com | 27/01/2001 2 | Pol | pol @gmail.com | 28/02/2002 3 | Piet | piet @hotmail.com | 29/03/2003 Aanpassen naam in James van persoon met id?: 2 Invoegen nieuwe persoon met naam John, geboortedatum 10 oktober 1979 ... Verwijderen persoon met id?: 3 1 | Jan | jan @hotmail.com | 27/01/2001 2 | James | pol @gmail.com | 28/02/2002 4 | John | john @mail.be | 31/10/1979 Console Application uitvoer 2 (invoer van de gebruiker staat cursief)

9


ADO .NET

1.3. Microsoft SQL Server Manager Studio 1. 2. 3. 4. 5.

Installeren en opstarten Databank aanmaken Tabel aanmaken Query uitvoeren (F5 en commentaar) SQL exporteren en bewaren

1.4. Visual Studio Tooling 1.4.1. Databank bestand creĂŤren Open het Server Explorer toolvenster door in Visual Studio in de View menu te kiezen voor Server Explorer. Rechterklik op de Data Connections node en kies voor Add Connection....

Visual Studio schermafbeelding 1

VerifiĂŤer of het Data source veld staat ingesteld op Microsoft SQL Server Database File (SqlClient).

10


ADO .NET

Visual Studio schermafbeelding 2

Indien niet zo, klik je op de Change... knop om deze instelling aan te passen.

11


ADO .NET

Visual Studio schermafbeelding 3

Selecteer in het Change Data Source venster de Microsoft SQL Server Database File optie en klik op OK.

Terug in het Add Connection venster klik je op de Browse... knop om duidelijk te maken waar het nieuwe databank bestand wordt geplaatst. Navigeer naar je huidige projectfolder, en gebruik PersonenDB.mdf als Database file name.

Eventueel klik je op de Advanced... knop om de nodige aanpassingen aan de te creĂŤren connectie te configureren.

12


ADO .NET

Visual Studio schermafbeelding 4

Dit venster biedt je eventueel ook de mogelijkheid de hiermee samengestelde connectionstring op te vragen. Deze waarde zou je kunnen kopiĂŤren en straks inzetten in onze broncode.

Klik je in het Add Connection venster op OK dan wordt een node toegevoegd aan het Server Explorer toolvenster. Tussendoor wordt om bevestiging van creatie gevraagd.

13


ADO .NET Visual Studio schermafbeelding 5

1.4.2. Tabel creëren en opvullen Om vlot de nodige databank tabel te creëren maken we gebruik van SQL creational language. Rechterklik op de PersonenDb.mdf node en kies voor New Query.

Visual Studio schermafbeelding 6

Neem volgende SQL over en kies in de SQL menu van Visual Studio voor Execute. CREATE TABLE [dbo].[PersonenTabel] ( [Id] INT IDENTITY(1, 1) NOT NULL, [Naam] TEXT NOT NULL, [Email] TEXT NULL, [Geboortedatum] DATETIME NULL, PRIMARY KEY CLUSTERED([Id] ASC) ); INSERT INTO PersonenTabel (Naam, Email, Geboortedatum) VALUES ('Jan' , 'jan@hotmail.com', '2001-01-27'); INSERT INTO PersonenTabel (Naam, Email, Geboortedatum) VALUES ('Pol' , 'pol@gmail.com', '2002-02-28'); INSERT INTO PersonenTabel (Naam, Email, Geboortedatum) VALUES ('Piet ', 'piet@hotmail.com', '2003-03-29');

14


ADO .NET

Als alles goed loopt krijg je onderaan het scherm te zien dat de gebruike SQL manipulation language (de insert statements) drie rijen heeft betroffen. (1 row(s) affected) (1 row(s) affected) (1 row(s) affected) -

Wikipedia: Data definiton language: https://en.wikipedia.org/wiki/Data_definition_languageWikipedia: Insert (SQL): https://en.wikipedia.org/wiki/Insert_(SQL) Externe links 5

Aan de hand van deze werkwijze kan je ook andere SQL statements, zowel ter creatie (creational language), manipulatie (manipulational language) of raapleging (selection language) uitvoeren. Het in Visual Studio gecreĂŤerde tablad (SQLQuery1.sql) mag je sleuten en hoef je niet te bewaren.

1.4.2.1. Tabel definitie of informatie verkennen Indien je in de Server Explorer de PersonenDb.mdf en Tables node uitvouwt vindt je een node terug voor de gecreĂŤerde tabel. Rechterklik eventueel op de node en kies voor Open Table Definition of Show Table Data indien je het dataschema of de opgevulde informatie wil verkennen of zelfs aanpassen.

15


ADO .NET

Visual Studio schermafbeelding 7

1.4.3. Databank aan project koppelen Alhoewel volgende stap niet strikt noodzakelijk is, kan het verwijzen naar de databank in het project, zorgen voor een een betere integratie van de nodige componenten. In de Solution Explorer kies je voor Show All Files...

16


ADO .NET Visual Studio schermafbeelding 8

Indien het databank bestand in de projectfolder werd geplaats de PersonenDb.mdf node in de Solution Explorer verschijnen. Rechterklik de PersonenDb.mdf node en kies voor Include In Project.

zal op

Visual Studio schermafbeelding 9

Indien het databank bestand toch elders werd geplaats voeg dan de verwijzing naar dit bestand manueel toe. Kies hiervoor Add Existing Item in de Project menu van Visual Studio. Navigeer naar en selecteer en het betreffende databank bestand. Rechterklik in de Solution Explorer op de PersonenDb.mdf node en kies voor Properties. In het resulterende Properties toolvenster verifiĂŤer je of de Copy to Output Directory eigenschap op Copy always is ingesteld.

17


ADO .NET

Visual Studio schermafbeelding 10

Deze zal ervoor zorgen dat een kopie van ons databank bestand aan de bin folder wordt toegevoegd. Van deze kopie gaan we in ons programma gebruik maken. Zowel onze programma executable (.exe) als het databank bestand (.mdf) bevinden zich zo in dezelfde folder.

Echt noodzakelijk is deze stap zeker niet. Het werken met een kopie bij het uitvoeren en uittesten van onze applicatie, zou echter wel kunnen vermijden dat onze databank corrupteert. Dat er bijvoorbeeld vervuiling optreedt met test data.

Anderzijds biedt het ons de mogelijkheid in onze connectionstring op eenvoudige wijze (AttachDbFilename=|DataDirectory|\PersonenDb.mdf) naar ons databank bestand te verwijzen. |DataDirectory| kan in een connectionstring gebruikt worden als je wil refereren aan de huidige folder, wat bij uitvoering de bin folder zal zijn.

1.4.4. ExecuteScalar en parameters Om ĂŠĂŠn gegeven uit de database op te vragen en weer te geven, wordt de methode ExecuteScalar gebruikt. Deze methode geeft de eerste kolom van de eerste rij van de resultaatset van het SELECT-SQL-statement. Omdat het resultaat van het gegevenstype Object is moet er meestal een conversie van het type plaats vinden. Voordeel: minder code dan met ExecuteReader. Interessant om een identity waarde terug te krijgen na een insert, zie verder.

18


ADO .NET

In een SQL-statement kunnen ook parameters gebruikt worden. Via code wordt een waarde toegekend aan deze parameters. In SQL Server worden parameters aangeduid met een @. static public int AddPerson(string newName, string email, string connString) { Int32 newProdID = 0; string sql = "INSERT INTO PersonenTabel (Naam, Email, Geboortedatum) VALUES (@Name, @Email, @BirthDate); " + "SELECT CAST(scope_identity() AS int)"; using (SqlConnection conn = new SqlConnection(connString)) { SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.Add("@Name", SqlDbType.VarChar); cmd.Parameters["@Name"].Value = newName; cmd.Parameters.Add("@Email", SqlDbType.VarChar); cmd.Parameters["@Email"].Value = email cmd.Parameters.Add("@BirthDate", SqlDbType.DateTime); cmd.Parameters["@BirthDate"].Value = DateTime.Now; try { conn.Open(); newProdID = (Int32)cmd.ExecuteScalar(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } return (int)newProdID; }

using (SqlConnection conn = new SqlConnection(connString)) { SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.Add("@Name", SqlDbType.VarChar); cmd.Parameters.Add("@Email", SqlDbType.VarChar); cmd.Parameters.Add("@BirthDate", SqlDbType.DateTime); try { conn.Open(); foreach(…) { cmd.Parameters["@Name"].Value = newName; cmd.Parameters["@Email"].Value = email cmd.Parameters["@BirthDate"].Value = DateTime.Now; newProdID = (Int32)cmd.ExecuteScalar(); } }

19


ADO .NET catch (Exception ex) { Console.WriteLine(ex.Message); } }

1.4.5. Stored procedures Naast SQL-statements kunnen ook stored procedures gebruikt worden om gegevens uit een database te halen. Een procedure is in het algemeen een reeks instructies die na elkaar moeten worden uitgevoerd. Stored procedures zijn - zoals de naam het zegt - in de database opgeslagen procedures. Deze procedures bestaan uit SQL statements. Bijvoorbeeld een taak waarin wordt geselecteerd uit een tabel met orders die verwerkt moeten worden tot een tabel met verzendingen. Een voordeel van stored procedures is de snelle verwerking van de data doordat het programma in de database zelf draait en daarmee bovenop de data zit. De verwerking gaat, vooral door het ontbreken van netwerk overhead, sneller dan verwerking door een programma dat op een andere machine draait. Een tweede voordeel bestaat erin dat je SQL statements kan schrijven en testen in een aparte omgeving. Pas als de stored procedures getest zijn en goed bevonden ga ze aanroepen of gebruiken in .NET, Java, PHP of een andere programmeertaal. Nadeel: distributie van coding. Voor het definieren en testen van stored procedures kan je gebruik maken van SQL Server Management Studio. Voor meer compleet overzicht van stored procedures, te gebruiken op de NorthWind Microsoft database, zie: https://www.w3schools.com/sql/sql_stored_procedures.asp. We bekijken hier heel kort ondersteuning voor stored procedures in Visual Studio. Met de property CommandType wordt bepaalt hoe de property CommandText geïnterpreteerd moet worden. De mogelijkheden zijn: • • •

Text: SQL-statement StoredProcedure: naam van een stored procedure in een SQL database TableDirect: alle gegevens van de tabel worden opgehaald.

20


ADO .NET

Open de Database Explorer en rechtsklik op Stored Procedures om via Add New Stored Procedure een nieuwe stored procedure toe te voegen. Geef de procedure de naam Teenager en voeg de onderstaande SQL-instructies toe. CREATE PROCEDURE dbo.Teenager as select Naam, Email, geboortedatum from PersonenTabel where geboortedatum > DATEADD(year,-18,GETDATE());

Als bij CommandType de optie Stored Procedure geselecteerd wordt dan kan gekozen worden tussen de opgeslagen Stored Procedures. De Stored procedure kan getest worden door in het snelmenu van de Stored Procedure te kiezen voor Execute.

21


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.