680 likes | 829 Views
ADO.NET, Dáta, XML,Triedy,. ADO.NET a ADO. ADO.NET je evoluc í technologie ADO (ActiveX Data Objects), což je knihovna COMovských komponent, která má spoustu nevýhod ADO funguje v podstatě jenom online základní datovou strukturou je RecordSet, který representuje jednu tabulku
E N D
ADO.NET a ADO • ADO.NET je evolucí technologie ADO (ActiveX Data Objects), což je knihovna COMovských komponent, která má spoustu nevýhod • ADO • funguje v podstatě jenom online • základní datovou strukturou je RecordSet, který representuje jednu tabulku • ztrácejí se vztahy mezi daty, přístup je sekvenční • malá abstrakce od fyzického datového modelu • data jsou reprezentována a předávána pomocí COMovských datových typů
ADO.NET a ADO • naproti tomu ADO.NET • je primárně designován pro práci offline • data je možné logicky modelovat • hlavní datovou struktirou je DataSet, který reprezentuje jednu nebo více tabulek a jejich vztahy • datové typy jsou svázány s XML schématy • není nutné data konvertovat,
ADO.NET a .NET Framework Microsoft .NET Framework Web Services User Interface Data and XML ADO.NET XML ... ... Base Classes Common Language Runtime
Základní pojmy a architektura • Základní jmenné prostory • System.Data – třídy reprezentující obecný přístup k datům, bez ohledu na konktrétní databázi (DataSet, DataTable, Constraint) • System.Data.(OleDb|Oracle|SqlClient|Odbc) – třídy poskytovatelů dat (data providers) • System.Data.Common • System.Data.SqlTypes, System.Data.Sql – specifické třídy pro Microsft SQL Server
.NET Data Providers Hierarchie System.Data .OleDb .SqlClient SqlCommandSqlConnectionSqlDataReaderSqlDataAdapter OleDbCommandOleDbConnectionOleDbDataReaderOleDbDataAdapter
Třídy poskytovatelů dat jsou vždy odvozeny od jedné základní třídy a implementují společné rozhraní podle toho, co mají dělat každá třída má čtyři verze, jejichž jména začínají jménem příslušného poskytovatele dat např. (Sql|OleDB|Oracle|ODBC)Connection implementují rozhraní IDbConnection a dědí od třídy DbConnection, umožňují se připojit k databázi
DataSet DataSet je třída, která představuje offline kontejner pro data není nijak závislá na databázi, může představovat data z jakéhokoliv zdroje (CVS soubor, XML ap.) obsahuje v sobě objekty představující tabulky, jejich sloupce a řádky a vztahy mezi nimi každý z těchto prvků je reprezentován příslušnou třídou (DataTable, DataRow,...)
DataTable objekt, který představuje tabulku dat obsahuje množinu sloupců (columns) s určitými vlastnostmi může obsahovat jeden nebo více řádků (rows) s vlastními daty může také obsahovat omezení na sloupce (constraints) a také informaci o primárním klíči dále může mít tabulka také další vlastnosti (extended properties) tyto informace se nazývají schéma tabulky
DataColumn • třída pro sloupec v tabulce • každý sloupec je identifikován jménem a má sadu vlastností • ColumnName – jméno (pokud není nastaveno konstruktorem, je automaticky ColumnN) • AutoIncrement(Seed|Step) – automatické generování číselné hodnoty • DataType – typ sloupce (jeden z vyjmenovaných .NETovských typů) • DefautValue – implicitní hodnota
DataColumn mohou být vytvořeny ručně nebo v kódu nebo generovány runtimem datový typ nelze změnit poté, co byla do tabulky načtena data jsou to hodnotové typy jako je bool, int, DateTime, TimeSpan, Double, Decimal a podobně
DataRow • třída reprezentující vlastní data načtená v tabulce • protože představují offline přístup k datům uloženým v databázi nebo jinde jsou verzované (enum DataRowVersion) • Current – poslední platně uložená hodnota • Default – implicitní hodnota • Original – hodnota původně načtená z externího zdroje • Proposed – hodnota v době mezi voláními BeginEdit a EndEdit nebo CancelEdit
DataRow • k jednotlivým položkám v řádku je možno přistupovat pomocí indexerů, které mají 1 nebo 2 parametry • první je objekt typu DataColumn nebo Int32 nebo String • druhý může být požadovaná verze řádku např. row[“Jmeno”, DataRowVersion.Current] • pomocí indexerů je možno hodnoty číst nebo měnit
DataRow • každý řádek má také vlastnost RowState, která určuje, jakou operaci je třeba provést, aby se řádek uložil zpátky do databáze (enum DataRowState) • Added – řádek byl přidán (INSERT) • Deleted – řádek byl vymazán metodou Delete(), je stále v DataTable, ale při uložení do databáze bude smazán • Detached – po vytvoření nebo volání Remove() • Modified – došlo ke změně v některém sloupci • Unchanged – od posledního volání AcceptChanges nedošlo ke změně
DataRow • pokud se mění data, jsou na příslušné tabulce vyvolávány události jako RowChanged, RowChanging, ColumnChanged a ColumnChanging • poslední lze použít k validaci dat, má parametr typu DataColumnChangeEventArgs, který má vlastnost ProposedValue • pokud nejsou hodnoty v pořádku, je možno nastavit vlastnosti RowError a ColumnError a vlastnost HasErrors příslušné tabulky
Constraints • umožňují zadávat omezení na jednotlivé sloupce • jsou reprezentovány objekty • UniqueConstraint • ForeignKeyConstraint • UniqueConstraint – pojmenované omezení určující, že musí být každá hodnota ve sloupci jedinečná • DataTable má vlastnost PrimaryKey • ForeignKeyConstraint – omezení při updatu a mazání na dvojici nebo dvou kolekcích
XML Schema speciální XML soubor, který popisuje schéma – sloupce odpovídají elementům, dají se nastavit jejich typy, omezení, relace a podobně má příponu xsd, lze jej napsat ručně nebo nechat vygenerovat z již nastaveného DataSetu
XML Schema • vygenerovaný kód obsahuje • pro každý komplexní element tabulku odvozenou od DataTable • pro každý jednodychý element třídu odvozenou od DataColumn s nastavenými vlastnostmi podle atributů • celou řadu dalších složek jako přístupové vlastnosti položek v řádku, přetížené metody pro přidání řádku • vše je silně typované (tj. místo row[“jmeno”] je row.jmeno)
Uložení a načtení z/do XML Uložení DataSetu do XML pomocí metod GetXML a WriteXML Schéma lze z DataSetu uložit metodami GetXMLSchema a WriteXMLSchema metoda Get vždycky vrací řetězec,metoda Write píše do souboru Data se do DataSetu načtou metodou ReadXML
DataSet a komunikace ve vícevrstvé aplikaci je možno používat metody pro komunikaci pomocí DataSetů metoda Copy vrátí přesnou kopii DataSetu metoda Clone vrátí prázdný DataSet s přesně stejným schématem metoda GetChanges vrátí DataSet, který obsahuje pouze řádky v jistém stavu (implicitně Deleted|Modified|Added) metoda Merge umožňuje spojit DataSety nebo vnořit tabulky či řádky do DataSetu
Merge • umožňuje spojit dva DataSety do jednoho • pokud se liší schémata, je buď vyhozena výjimka, nebo jsou spojena i schémata (parametrMissingSchemaAction .(Error|Add|Ignore|AddWithKey)) • řádky ve stavu Modified, Unchanged a Deleted se spojí podle stejné Current hodnoty primárního klíče • podle hodnoty parametru PreserveChanges se pozná, jestli mají být odlišné hodnoty v cílovém datasetu přepsány (false) nebo změněny a označeny jako modifikované
Merge při spojování se dočasně nekontrolují omezení pokud se po spojení některá omezení nedají dodržet, je EnforceConstraints celého DataSetu nastaveno na false a příslušné řádky jsou označeny jako chybné
Filtrování a řazení • je možno vytvářet pohledy na jednotlivé tabulky v DataSetu pomocí tříd DataView a DataViewManager • tyto pohledy se nejčastěji používají k navazování na prvky uživatelského rozhraní • DataView je v podstatě definován souhrnem následujích vlastností • Table – připojená tabulka (jenom jedna) • RowFilter – řetězec určující filtr na řádcích • RowStateFilter – stavy řádků • Sort – podle čeho řadit a jak
Filtrování a řazení - RowFilter jedna nebo více podmínek spojených logickými operátory (AND, OR, NOT) podmínky jsou tvaru VyrazL OP VyrazP, OP je např. <, BETWEEN, <>, IS NULL, IN(a,b,c), LIKE VyrazL je obvykle jméno sloupce VyrazP je výraz s hodnotou vhodného typu
Filtrování a řazení - RowFilter lze použít také některé funkce jako agregační (Sum, Avg, Min, Max, Count), logické (IsNull, IIF) nebo řetězcové (SubString, Len), příp. operátory +, * apod.
RowStateFilter • umožňuje vybrat jenom řádky, které jsou v nějakém stavu • enum DataViewRowState, hodnoty Added, Deleted, Modified(Current|Original), None, Unchanged, (Current|Original)Rows
Sort výraz pro řazení se skládá ze jména sloupce a specifikace ASC pro vzestupné řazení a DESC pro sestupné výrazy je možno kombinovat (hnízdit) tak, že se jich více napíše do jednoho výrazu oddělených čárkou pokud se kdekoliv ve jménu sloupce vyskytuje mezera, je toto jméno nutno uzavřít do hranatých závorek ([])
Filtrování a řazení - DataView • řádky v DataView jsou typu DataRowView, DataView je kolekce řádků • řádky je možno přidávat metodou AddNew • vlastnosti AllowEdit, AllowDelete a AllowNewurčují, jestli se dají provádět uvedené operace • řádky je možno hledat dle hodnot v řazených sloupcích metodami Find a FindRows • metoda CreateChildView řádku vytvoří pohled z jeho dětských řádků, parametr je objekt relace • k řádkům je možno přistupovat, jako by to byly řádky v tabulce (měnit je, mazat ap.)
Filtrování a řazení • například DataView dw = newDataView( ds.Tables[“Jmeno”], “cislo < 3 AND jmeno LIKE ‘Karel’”, “[datum narozeni], jmeno ASC”, DataViewRowState.CurrentRow)
Filtrování a řazení • metoda Select třídy DataTable vrátí pole řádků podle RowFilter řetězce, seřazené podle Sort řetězce, v příslušné verzi rows = table.Select(“Pocet > 5”, “Poradi ASC”); • metoda Compute umožňuje spočítat výsledek agregovaného dotazu total = table.Count(“SUM(penize)”, “poradi < 10”);
XML a .NET - standardy • .NET podporuje celou řadu XML standardů • XML 1.0 včetně DTD • XML Schemas • XPath výrazy • XSLT transformace • DOM Level 1 a 2 Core • SOAP 1.1 • jejich popis lze nalézt na www.w3.org
System.XML základní jmenný prostor pro zpracování XML souborů je System.XML obsahuje třídy pro různý přístup ke XML souborům a jejich složkám proudové třídy: XMLReader, XMLWriter třídy pro logickou strukturu dokumentu: XMLNode, XMLDocument, XMLDataDocument v dalších jmenných prostorech speciální třídy (XPath, XSLT)
XMLReader • abstraktní třída, od níž dědí konkrétní třídy, které se liší zdrojem dat nebo další funkcionalitou (validace) • XmlNodeReader – načítá z XMLNode • XmlTextReader – načítá z proudu (souboru) • XmlValidatingReader – poskytuje validaci • XmlReader má metodu Create s 9 verzemi, která umožňuje vytvořit proud nad souborem nebo jiným proudem
XMLReader • metoda Create může mít parametr typu XmlReaderSettings: třída s vlastnotmi pro nastavení čtení • IgnoreComments, IgnoreWhiteSpace • Schemas • ValidationType, ValidationFlags
XmlReader – Read metody • základní metoda Read přesune kurzor na další element, pokud to nejde, vrátí false • proměnná readeru slouží pak k přístupu k uzlu pomocí různých metod • metoda HasValue a vlastnost Value • metoda HasAttributes a metoda GetAttribute nebo indexery • IsStartElement a ReadStartElement
XMLReader • další čtecí metody slouží ke specializovanému čtení • ReadElementString - načte obsah elementu obsahujícího jednoduchou textovou hodnotu, jinak vyhodí výjimku • silně typované metody podle vzoru ReadElementContentsAsJmenoTypu (např. ReadElementContentsAsDouble), nebo vyhodí výjimku • metoda MoveToContent: posune kurzor na nejbližší obsahový element (přeskočí např. poznámky) a vrátí jeho typ • další jako ReadString, ReadNextToSibling, ReadStartElement a podobně
Čtení atributů metoda HasAttributes určí, má-li element atributy vlastnost AttributeCount obsahuje počet atributů metoda GetAttribute vrátí hodnotu atributu na základě indexu nebo jména atributu stejnou funkci a parametry mají indexery třídy XmlReader metody MoveToFirstAttribute a MoveToNextAttribute umožňují iterovat atributy
Validace XmlReader umí provést validaci vzhledem ke XML schématu schéma se uloží do vlastnosti XmlSchemaSet třídy XmlReaderSettings, její vlastnost XsdValidate se nastaví na true XmlReaderSettings má událost ValidationEventHandler, která se vyvolá při chybě nebo varování při validaci (argument této události má vlastnost Severity)
XMLWriter • umožňuje zapisovat XML data do proudu • provádí se dopředně bez cachování • paramnetry zápisu se nastaví pomocí třídy XmlWriterSettings, která má vlastnosti jako • Indent • NewLineOnAttributes • Encoding • NewLine • konstruktor této třídy má parametr jméno souboru či třídu proudu a nepovinně nastavení
XmlWriter • má řadu metod typu Write<neco> jako • WriteStartDocument • WriteStartElement • Write(Element|Attribute)String • WriteEndElement • WriteEndDocument • WriteCData, WriteComment, WriteChars • a celou řadu dalších • je třeba dávat pozor na zanoření elementů a jiné podobné věci
DOM v .NETu • DOM (Document Object Model) je standard popisující přístup k XML dokumentu • přístup pomocí reprezentace dokumentu v paměti • dokument je reprezentovám jako strom uzlů, uzel je objekt třídy XmlNode • standard definuje • jak je dokument reprezetován • jak je možno přistupovat k jeho částem
<?xml version="1.0"?> <books> <book> <author>Carson</author> <price format="dollar">31.95</price> <pubdate>05/01/2001</pubdate> </book> <pubinfo> <publisher>MSPress</publisher> <state>WA</state> </pubinfo> </books>
Třídy dědící od XmlNode • jednotlivé třídy představují složky dokumentu • přímo od XmlNode dědí • XmlDocument: celý dokument • XmlDocumentFragment: část stromu dokumentu • XmlAttribute: atribut • XmlNotation a XmlEntity • a XmlLinkedNode: pro přístup k následujícímu a předchozímu uzlu, od něj dědí zejm. • XmlElement: element v dokumentu • pomocná třída XmlNodeList představuje seznam uzlů