Základy programování 4 - C# - 9. cvičení Radek Janoštík Univerzita Palackého v Olomouci 10.4.2017 Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 1 / 13
Reakce na úkoly (1/3) Špatná zarážka v MergeSortu L[n1] = new Student() { OsCislo = "", Jmeno = "", Prijmeni = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", //zde by měl byt maxstring, řetězec s hodně Z by ale měl stačit UserName = "", Rocnik = 0, OborKomb = "", ; Zbytečně složité LINQ dotazy (Nepoužití Any(), First(),... ) Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 2 / 13
Reakce na úkoly (2/3) Rychle napsaný a funkční kód var studenti = ReadonlyDB.Students; var prijmenistudentu = new string[studenti.length]; var i = 0; foreach (var student in studenti) prijmenistudentu[i++] = student.prijmeni; Array.Sort(prijmeniStudentu); // Tady se deje magie - nechce se mi pro to delat funkce var sortedstudenti = new Student[studenti.Length]; var pozice = 0; foreach (var prijmeni in prijmenistudentu) { var alreadyassined = false; foreach (var student in studenti) { if (alreadyassined) continue; if (prijmeni!= student.prijmeni) continue; sortedstudenti[pozice++] = student; alreadyassined = true; // Tady se deje magie - nechce se mi pro to delat funkce Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 3 / 13
Reakce na úkoly (3/3) i = 0; var pocet = 0; var finalstudenti = new Student[10]; for (var k = 0; k < 10; k++) finalstudenti[k] = new Student(); foreach (var prijmeni in prijmenistudentu) { if (i < 5) { i++; continue; foreach (var student in studenti) { if (student.prijmeni!= prijmeni) continue; if (pocet < 10 && finalstudenti[pocet].jmeno!= student.jmeno) { finalstudenti[pocet++] = student; Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 4 / 13
Databáze úvod = (ve stručnosti) persistentní úložiště dat Neřešíme konkrétní implementaci databáze, zajímá nás rozhraní SQL(Structured Query Language) dotazovací jazyk, různé mutace Zde v kurzu MSSQL Data v tabulkách, každý sloupec pevný datový typ Řádky objekty, Sloupce vlastnosti objektů Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 5 / 13
Databáze vytvoření MSSQL Express zdarma (určitý limit paměti, jader) Správa MS SQL Server Management Studio Možnost testovat na database.inf.upol.cz Integrace ve Visual Studiu Server Explorer Database Connection Alternativa MS SQL Server Database File Databáze v souboru.mdf Snadno přenositelné Pro nás postačující Pro připojení k DB slouží tzv. Connection string (k nahlédnutí v Properties) Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 6 / 13
SQL (1/3) Základní dotazy Výběr dat SELECT sloupec1, sloupec2 FROM tabulka WHERE podminka; Např.: SELECT name, surname FROM students WHERE year=3; SELECT * FROM subjects WHERE name = Jan ; Řazení SELECT name, surname FROM students ORDER BY surname DESC; SELECT * FROM subjects WHERE obor = KMI ORDER BY year ASC; Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 7 / 13
SQL (2/3) Základní dotazy Editace záznamu UPDATE tabulka SET sloupec1=hodnota1, sloupec2=hodnota2 WHERE podminka; Např.: UPDATE students SET year=3, obor = MI WHERE year=3; UPDATE subjects SET name= XXXXXX ; Vložení záznamu INSERT INTO tabulka (sloupec1, sloupec2,...) VALUES (hodnota1, hodnota2,...); Např.: INSERT INTO students (name, surname) VALUES ( Petr, Novák ); Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 8 / 13
SQL (3/3) Základní dotazy Smazání záznamu DELETE FROM tabulka WHERE podminka; Např.: DELETE FROM students WHERE id=35; DELETE FROM students; Další dotazy (GROUP BY, CREATE TABLE, JOIN,... ) viz. dokumentace https://technet.microsoft.com/en-us/library/ms189826(v=sql.90).aspx Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 9 / 13
Připojení DB v C# Třída System.Data.SqlClient Připojení a čtení výsledků dotazu try { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.open(); SqlCommand command = new SqlCommand("SELECT * FROM students;", conn); using (SqlDataReader dr = command.executereader()) { while (dr.read()) { Console.WriteLine($"{dr[0], {dr[1], {dr[2]"); catch (Exception e) {... Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 10 / 13
Dotaz s parametry Proč je špatně: SqlCommand command = new SqlCommand($"SELECT * FROM students WHERE name= {somename OR surname= {somesurname ;", conn); A správně SqlCommand command = new SqlCommand("SELECT * FROM students WHERE name = @someparam OR surname=@surname", conn); command.parameters.add(new SqlParameter("someParam", "Karel")); command.parameters.add(new SqlParameter("surname", "Novák")); Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 11 / 13
Vyhodnocení dotazu bez výsledků Metoda ExecuteNonQuery() vrací počet ovlivněných prvků Vložení prvku SqlCommand command = new SqlCommand("INSERT INTO students (id, name, surname) VALUES (@id, @name, @surname);", conn); command.parameters.add(new SqlParameter("id", 3)); command.parameters.add(new SqlParameter("name", "Alois")); command.parameters.add(new SqlParameter("surname", "Fridrich")); int affected = command.executenonquery(); Vymazání prvku(ů) SqlCommand command = new SqlCommand("DELETE FROM students WHERE surname=@srn", conn); command.parameters.add(new SqlParameter("srn", "Odstrčil")); int affected = command.executenonquery(); Console.WriteLine("Affected: " + affected); Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 12 / 13
Úkol Stáhnout soubor students.mdf z mých stránek, připojit ve VS a zjistit connection string Z databáze vytáhnout abecedně vzestupně setřízené osoby dle příjmení a vypsat 10 unikátních dvojic jmen a příjmení, které jsou 5. - 15. v pořadí Vložit dva nové studenty (smysluplná data) Vymazat studenty, kteří studují aplikovanou informatiku Změnit userid studenta s OsČíslem R15369 na kaufal01 Pro zbylé studenty zjistit jejich známky ze všech zkoušek Při řešení co nejvíce použít SQL Vše vypsat do konzole v pořadí úkolů a ošetřit sql chyby odchycením výjimek Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 13 / 13