Software Development fundamentals ADO.NET
voorkennis ADO.NET = Verzameling classes in het .NET framework die we kunnen gebruiken voor databasetoegang We hebben er de vorige keer 3 besproken, welke waren dat? Wat was hun functie?
inhoudsopgave Voorkennis ADO.NET SqlConnection (20 min) Connectionstring Verbindingsgegevens uit configuratiebestand lezen Using statement SqlCommand (5 min) Parameterized queries SqlDataReader (5 min) Eenvoudige architectuur (10 min) Oefenen met de klas
SqlConnection Met SqlConnection maken we een verbinding met de database SqlConnection con = new SqlConnection(@"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\mydb.mdf;Initial Catalog=mydb;Integrated Security=True;MultipleActiveResultSets=True"); Ok, ok, even opnieuw…
SqlConnection Met SqlConnection maken we een verbinding met de database SqlConnection con = new SqlConnection(); Zo, dat is beter. Om een verbinding te maken heb je ook een ConnectionString nodig. Dat is één string die alle toegangsgegevens bevat. Voorbeeld connectionstring voor Sql Server Express 2014 LocalDB: Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\mydb.mdf;Integrated Security=True;
SqlConnection Je kunt meteen de connectionstring meegeven aan de constructor: SqlConnection con = new SqlConnection(@"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\mydb.mdf;Integrated Security=True;"); De @ gebruiken we om aan te geven dat we escape characters willen negeren (de \) Maar, waar kan je de juiste connectionstring vinden?
connectionstring Optie 1: Opzoeken op internet en aanpassen Optie 2: Dubbeklikken op het .mdf bestand om de database te openen. Dan bij de properties kijken naar de connectionstring, daar staat: Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename="c:\users\eindbaas\documents\visual studio 2015\Projects\MyApplication\MyApplication\MyDatabase.mdf";Integrated Security=True Optie 3: In Visual Studio onder Data Sources > Add New Data Source > Next > Next > Connectionstring uitklappen. Daar staat: Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Integr ated Security=True Dit kan je overnemen, en de wizard annuleren.
App.config Je kunt ook je connectionstring bewaren in het App.config bestand, in het <configuration> element: <connectionStrings> <add name="MyConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> En dan ophalen in C# code: string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; Je moet dan alleen wel een reference naar System.Configuration toevoegen aan je project.
Het is toch gewoon een .mdf bestand?
SqlCommand SqlCommand cmd = new SqlCommand("SELECT * FROM product", con); Om vervolgens de query uit te voeren, kunnen we kiezen tussen: int result = cmd.ExecuteNonQuery(); Voert de query uit en returned het aantal ‘affected rows’; Handig voor Update, Delete, Insert SqlDataReader reader = cmd.ExecuteReader(); Voert de query uit en returned een DataReader om mee door de resultaten te lopen. Voor Select.
close Klaar met je SqlConnection? Dan sluit je ‘m con.Open(); SqlCommand cmd = new SqlCommand(“DELETE FROM product WHERE id = 1", con); int result = cmd.ExecuteNonQuery(); con.Close();
Using gebruiken using (SqlConnection connection = new SqlConnection(connectionString)) { try connection.Open(); // doe iets met de connection, voer queries uit etc. } catch (Exception) // doe iets met de foutmelding } Het using statement zorgt ervoor dat de connection wordt gesloten en opgeruimd zodra je ermee klaar bent
SqlCommand while (reader.Read()) { Console.WriteLine(reader["eenkolom"]); } Nu worden in de console onder elkaar alle waarden uit de kolom ‘eenkolom’ getoond. Je kunt deze while loop ook gebruiken om een lijst met objecten te vullen. Die lijst met objecten kan je dan in je console/form/webpagina tonen.
SqlCommand while (reader.Read()) { Console.WriteLine(reader["eenkolom"]); } Nu worden in de console onder elkaar alle waarden uit de kolom ‘eenkolom’ getoond. Je kunt deze while loop ook gebruiken om een lijst met objecten te vullen. Die lijst met objecten kan je dan in je console/form/webpagina tonen.
Lijst met objecten vullen // Ga er even vanuit dat er een Product class bestaat List<Product> lijst = new List<Product>(); while (reader.Read()) { Product p = new Product(); p.Id = int.Parse(reader[“id”]); p.Description = reader[“description”].ToString(); p.Price = double.Parse(reader[“price”]); lijst.Add(p); } // Nu is de lijst gevuld met alle producten uit de database
Entity classes Een entity object of POCO (Plain Old CLR Object) Een object dat (min of meer) overeenkomt met een rij uit je database. Je krijgt dan bijvoorbeeld de volgende architectuur voor een todo-applicatie: 1 Form class (de UI) 1 POCO class (TodoItem) 1 DB Access class (TodoDb) De UI DB Methodes Bevat data
Opdracht Hoe zou de code van de volgende classes er precies uitzien? We verdelen de 5 methods door de klas. Elk groepje werkt 10 minuten aan een method. Aan het eind delen we het resultaat met elkaar. Ga uit van een tabel TodoItem, en laat de ConnectionString leeg.
Wist je dat… Feit 1: ADO.NET gebruik maakt van inheritance Voorbeeld: SqlConnection erft over van DbConnection Net als OleDbConnection, OdbcConnection en OracleConnection https://msdn.microsoft.com/en-us/library/dw70f090(v=vs.110).aspx Feit 2: Een verzameling classes om te werken met een database noemen we een Data Provider. https://msdn.microsoft.com/en-us/library/dd363565.aspx
Vragen Zijn er vragen?