Programování v jazyku C# II. 5.kapitola
Obsah 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<Typ>(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) 22/28
Přidání záznamu Jednorázové přidání DataTable.Rows.Add Hromadné přidání DataTable.LoadDataRow uzavřeno do bloku BeginLoadData/EndLoadData dočasné vypnutí pravidel kontroly Příklad tabulka.beginloaddata(); tabulka.loaddatarow(radek1,true); tabulka.loaddatarow(radek2,true); tabulka.endloaddata(); 23/28
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
Konec 28/28