O ADO.NET Spojení s DB Příkazy Jednoduché čtení DataSet
2/28
ADO.NET • ADO - ActiveX Data Object • Orientováno na webové aplikace – neexistence stavu v HTTP
• Obecný přístup k databázi – přístup na data - data provider • možnost napsat vlastní
– standardně • Microsoft SQL server • OLE DB (Object Linking and Embedding) • ODBC (Open DataBase Connectivity)
3/28
Jmenné prostory • System.Data – obecné trídy pro manipulaci s daty – hlavní trídou je DataSet
• System.Data.Common – obecné trídy pro prístup k datum (jak naplnit DataSet) – možnost napsat vlastního poskytovatele
• System.Data.SqlClient/OleDb/Odbc – konkrétní poskytovatelé dat – prefix tríd dle poskytovatele • Sql/OleDb/OdbcDataAdapter
4/28
Spojení • Spojení s DB je první krok k úspěchu – otevření spojení (na konkrétní stroj a databázi) – ovládání spojení – uzavření spojení
• Obecné rozhraní IDBConnection – Iplementace: *Connection
• Parametry spojení – parametry konstruktoru – neuvedené parametry - standardní hodnoty – parametry nelze v průběhu měnit • pouze pokud je spojení zavřeno
5/28
Operace • Open – blokující (ceká dokud se nespojí) – možnost nastavit ConnectionTimeout • standardně 15 s • 0 - neomezeně dlouho, používat zřídka, nejlépe vůbec!!!
• Close – nevolá se automaticky, nutno volat explicitně
6/28
Connection Pooling • Umožňuje opětovné využití spojení – pokud jsou parametry spojení shodné, použije se
• Transparentní – řízeno poskytovatelem dat • Uzavření spojení – po vypršení časového limitu
• Otevření spojení – využití předešle uzavřených spojení
• Kde se to využije – když se často uzavírají spojení • webové aplikace
7/28
SQL server a pooling • Pro SQL Server - pooling automaticky zajištěn • Využívat instanci Connection vícekrát – nevytvářet nové instance – lze použít i při změně DB
8/28
Příkazy • Rozhraní IDbCommand – implementace - *Command
• Není vázáno na spojení – vlastnost Connection • změna asociovaného spojení
• Vytvoření – konstruktor + asociace spojení SqlCommand prikaz = new SqlCommand(dotaz); prikay.Connection = new SqlConnection(parametry);
– Metoda CreateCommand nad spojením SqlCommand prikaz = spojeni.CreateCommand();
9/28
Parametry • Třída *Parameters – konstruktor • název parametru • datový typ
– nastavení hodnoty • vlastnost Value
• Přidání do příkazu – kolekce Parameters
• Příklad prikaz.CommandText = "SELECT Jmeno,Prijmeni FROM Studenti WHERE Jmeno=@Jmeno"); prikaz.Parameters.Add("@Jmeno", SqlDbType.VarChar,20).Value = "Alžbeta"; 10/28
Spouštění příkazu • Text příkazu možno měnit – vlastnost CommandText
• Spuštění příkazu – podle navrácené hodnoty – ExecuteNonQuery • počet navrácených řádků
– ExecuteScalar • první sloupec prvního řádku • např. pro agregační funkce (COUNT, MAX,. . .)
– ExecuteReader • vrací všechny vybrané záznamy (nutno uzavřít)
11/28
Jednoduché čtení dat • Rozhraní IDataReader • Nutné otevrené spojení • Jednosmerné ctení – nelze se vracet – jednorázové zobrazení dat
• Vytvorení – *Command.ExecuteReader – Nutno uzavrít DataReader
12/28
Jak číst • Zahájení čtení – metoda Read • nutno volat už pro první položku
• Čtení hodnoty sloupce – indexer • číslo sloupce • název sloupce
– metody Get(cislo sloupce) – když je hodnota null, výjimka
13/28
Příklad SqlConnection spojeni = new SqlConnection (" integrated security = SSPI ; data source = server ; initial catalog = stag "); spojeni.Open(); SqlCommand prikaz = new SqlCommand ("SELECT * FROM Studenti", spojeni); SqlDataReader sqlCtenar = prikaz.ExecuteReader(); while (sqlCtenar.Read()) { Console.Write (sqlCtenar [2]); Console.Write (sqlCtenar ["Jmeno"]); } sqlCtenar.Close(); spojeni.Close(); 14/28
Třída DataSet • Paměťový obraz databáze – bez spojitosti s reálnou DB • databáze použita pro naplnění • dále bez nutnosti připojení
– cachované hodnoty – vhodné pro webový přístup
• Zapouzdření tříd – DataTable • tabulka
– DataRow • záznam
– ...
15/28
Vytvoření z DB • Třída *DataAdapter – zajišťuje propojení DataSetu a databáze
• Vytvoření na základě – *Command • asociovaného se spojením
– textu příkazu a *Connection • možnost sdružování více tabulek v jednom DataSetu • ideálně: 1 adaptér / 1 tabulka
• *DataAdapter.Fill – naplnění DataSetu – možnost naplnění více tabulek • vícenásobné volání Fill
– možnost pojmenovat tabulky, sloupce • TableMappings, ColumnMappings 16/28
Vytvoření z XML • Bez nutnosti spojení s DB – naplnění DataSet.ReadXml • XML soubor • XML řetězec
• Možno kombinovat s načtením z DB
17/28
XSD schema • Definice tabulky, vztahů a omezení • Nastavit před/po naplnění – možnost zrušit naplnění, není-li schéma splněno
• Získání schémata ze zdroje – DataAdapter.FillSchema
• Získání schémata z XSD – DataSet.ReadXmlSchema
• Získání schémata programově – Vytvoření primárních klíčů • DataTable.PrimaryKey
– Vytvoření relací • DataSet.Relations.Add
– Omezení • DataTable.Constraints.Add
– ... 18/28
Vytvoření programově • Bez nutnosti spojení s DB • Vytvoření tabulky – DataSet.Tables.Add
• Vytvoření sloupce – DataTable.Columns.Add
• Vložení záznamu – DataTable.Rows.Add • pole hodnot v poradí sloupců
19/28
Čtení dat • Obecný přístup – DataSet.Table["tabulka"].Rows[0]["sloupec"] – nutnost převodu na string a zpět
• Specializovaný potomek DataSet – kontrola typu – překladač – vytvoření XSD popisu – ”přeložení” XSD šablony • v MSVS
20/28
Změna dat • DataSet.Merge – spojení tabulek – tabulky nemusí mít stejný počet sloupců
• DataSet.AcceptChanges – přijetí změn provedených od nahrání či posledního přijetí změn
• DataSet.RejectChanges – zamítnutí změn
• DataSet.GetChanges – získání změn – např. synchronizace dvou strojů
21/28
Záznam v tabulce • Třída DataRow • Hodnoty záznamu – asociace hodnota - sloupec
• Vytvoření záznamu – není veřejný konstruktor – DataTable.NewRow • nepřidává do tabulky (podobně jako XmlNode)
Editace záznamu • Lze měnit konkrétní záznam • Pro hromadnou změnu vhodné pozdržet kontrolu – podobně jako u přidání uzavřít do bloku BeginEdit/EndEdit – možnost zamítnout změnu • CancelEdit() foreach(DataRow radek in tabulka.Rows) { radek.BeginEdit(); radek[0]=(int) radek[0]+10; } tabulka.AcceptChanges();
24/28
Smazání záznamu • Mazání podle indexu – DataTable.Rows.RemoveAt
• Mazání konkrétního záznamu – DataRow.Delete
25/28
Zápis do DB • Nutnost vytvořit SQL příkazy • DataAdapter.*Command – parametry příkazu - dosazení hodnot sloupců
• Možnost automatického vygenerování – *CommandBuilder • musí existovat během zápisu • musí existovat primární klíč
26/28
Příklad SqlConnection spojeni = new SqlConnection ( "integrated security = SSPI; data source = server; initial catalog = stag"); SqlDataAdapter adapterPredmety = new SqlDataAdapter ("SELECT * FROM Predmety WHERE Zkratka =’PJC2 ’", spojeni); DataSet databaze = new DataSet ("Databaze"); adapterPredmety.Fill (databaze,"Predmety"); databaze.Tables["Predmety"].Rows[0]["Nazev"] = "Programování v .NET 2"; SqlCommandBuilder sb = new SqlCommandBuilder (adapterPredmety); adapterPredmety.Update (databaze,"Predmety"); 27/28