23-05-04 1
Práce s databázemi (1)• .NET Framework poskytuje prostředky pro pří-
stup k různým typům databází• Pro zpřístupnění konkrétní databáze je nutné se
k ní nejprve připojit: – připojení lze realizovat pomocí některého z potom-
ků abstraktní třídy DbConnection• Mezi potomky třídy DbConnection patří:
– SqlConnection:• slouží pro připojení k databázi SQL serveru
23-05-04 2
Práce s databázemi (2)– OleDbConnection:
• pro připojení k databází podporující OLE DB, např. MS Access
– OdbcConnection:• umožňuje připojení k databázi podporující ODBC (Open
Database Connectivity)– OracleConnection:
• slouží pro připojení k databázi Oracle– EntityConnection:
• určena pro připojení ke konceptuálnímu modelu a zdroji dat
23-05-04 3
Práce s databázemi (3)• Pro reprezentaci příkazů SQL nebo uložených
procedur, které mají být spuštěny jsou k dispo-zici potomci abstraktní třídy DbCommand
• Tyto třídy jsou specifické pro konkrétní data-báze a patří mezi ně:– SqlCommand– OleDbCommand– OdbcCommand– OracleCommand– EntityCommand
23-05-04 4
Práce s databázemi (4)• Pro načítání řádků ze zdroje dat lze využít po-
tomky abstraktní třídy DbDataReader, např:– SqlDataReader– OleDbDataReader– OdbcDataReader– OracleDataReader– EntityDataReader
• Poznámka:– třídy založené na DbConnection, DbCommand
a DbDataReader se označují jako Data Providers (poskytovatelé dat)
23-05-04 5
Třída SqlConnection (1)• Definována ve jmenném prostoru System.Data.SqlClient
• Reprezentuje spojení s databázovým serverem SQL
• Je definována s modifikátorem sealed nel-ze na základě ní definovat třídu jako jejího po-tomka
• Připojení k SQL serveru je realizováno zadáním tzv. připojovacího řetězce (connection string)
23-05-04 6
Třída SqlConnection (2)• Připojovací řetězec může být zadán:
– v době volání konstruktoru (jako parametr)– pomocí vlastnosti ConnectionString– příklad: ”server=localhost;user=root;database=test”
• Poskytuje metody:– Open:
• otevře spojení s databázovým serverem– Close:
• uzavře dříve otevřené spojení s databázovým serverem
23-05-04 7
Třída SqlConnection (3)• Otevření a uzavření databáze je časově poměrně
náročná operace je využíván fond připojení• Poznámka:
– parametry fondu připojení lze nastavit v připojova-cím řetězci
23-05-04 8
Třída SqlCommand (1)• Definována ve jmenném prostoru System.Data.SqlClient
• Reprezentuje příkaz SQL (nebo uloženou proce-duru), který se má spustit na SQL serveru
• Definována s modifikátorem sealed• SQL příkaz, který se má provést může být spe-
cifikován:– v době volání konstruktoru– prostřednictvím vlastnosti CommandText
23-05-04 9
Třída SqlCommand (2)• Hodnota vlastnosti CommandText je interpre-
tována dle hodnoty vlastnosti CommandType:– Text: příkaz SQL (implicitní hodnota)– TableDirect: jméno tabulky– StoredProcedure: jméno uložené procedury
• Pro provedení příkazu SQL je rovněž nutné uvést databázové spojení (získané při vytváření instance třídy SqlConnection)
• Spojení lze zadat:– v době volání konstruktoru– pomocí vlastnosti Connection
23-05-04 10
Třída SqlCommand (3)• Spuštění příkazu se provádí voláním metody:
– ExecuteNonQuery:• určena pro příkazy, které nevrací žádnou hodnotu
(např. INSERT, DELETE apod.)• vrací počet ovlivněných řádků
– ExecuteReader:• používáno v případě, že SQL příkaz vrací množinu dat
(např. příkaz SELECT)• vytváří (vrací) instanci třídy SqlDataReader, pomocí
níž je možné získat vrácená data
23-05-04 11
Třída SqlCommand (4)– ExecuteScalar:
• používána pro příkazy, které vrací jednu hodnotu (např. SELECT s agregační funkcí)
• vrací první sloupec prvního řádku ve výsledné množině nebo null (pokud výsledná množina je prázdná)
• vrácená hodnota je typu object
23-05-04 12
Třída SqlCommand (5)• Třída SqlCommand obsahuje mimo jiné vlast-
nost Parameters:– specifikuje kolekci parametrů spojených s příkazem
SQL– přidání parametru do kolekce společně s jeho hod-
notou se provádí pomocí metody AddWithValue• Poznámka:
• parametry jsou (v příkazu SQL) zapisovány pomocí zástupných značek uvozených symbolem @
23-05-04 13
Třída SqlDataReader (1)• Definována ve jmenném prostoru System.Data.SqlClient
• Umožňuje načítání (zpřístupňování) řádků z da-tabáze SQL
• Prochází množinu dat po jednotlivých (řádcích) záznamech
• Její instance je vrácena jako výsledek volání metody ExecuteReader
• Pro přesun na následující záznam (řádek) slouží metoda Read
23-05-04 14
Třída SqlDataReader (2)• Metoda Read vrací hodnotu:
– true: jestliže existují další řádky– false: v opačném případě
• Jednotlivé atributy záznamů jsou přístupné po-mocí indexu (indexování začíná vždy od nuly) nebo názvu sloupce zapsaného v hranatých závorkách, případně pomocí metod Get…
• Po ukončení práce s objektem třídy SqlData-Reader je zapotřebí provést jeho uzavření po-mocí metody Close
23-05-04 15
Regulární výrazy• Regulární výraz (regular expression, regex)
je řetězec popisující množinu řetězců• Představuje vzor (šablonu), který je porovná-
ván se vstupním textem• Nejčastěji používány při vyhledávání textu
nebo manipulaci s textem• Regulární výraz se skládá z:
– literálů textu, které se mají shodovat– speciálních znaků (metaznaků), které nejsou sou-
částí hledaného textu, ale slouží pro popis alter-nativ, množin, počtů výskytů
– přepínačů
23-05-04 16
Syntaxe regulárních výrazů (1)
. odpovídá libovolnému znaku k.s – kus, kos, k2s atd.\ vrací metaznaku původní význam a\+b – a+b
Tečka, zpětné lomítko
? minimálně 0x, maximálně 1x ku?s – ks, kus* minimálně 0x, maximálně bez omezení halo* – hal, halo, halooo
Kvantifikátory – předcházející znak se musí vyskytovat …
+ minimálně 1x, maximálně bez omezení halo+ – halo, halooo{n} právě n-krát 10{6} – 1000000{m,n} minimálně m-krát, maximálně n-krát 10{2,3} – 100, 1000{n,} minimálně n-krát 10{2,} – 100, 1000, 10000
23-05-04 17
Syntaxe regulárních výrazů (2)Skupiny znaků – odpovídá[] jednomu znaku v závorkách [abc] – a, b, c
[^] jednomu znaku, neuvedenémuv závorkách
[^abc] – libovolný znak kromě a, b, c
[-] jednomu znaku z rozsahu znaků [a-z] – malá písmena abecedy
\s bílému znaku (\n, \r, \t, mezera aj.) a\sb – a b, ale ne ab\S jinému než bílému znaku a\Sb – a+b, ale ne a b\d desítkové číslici a\db – a2b, ale ne axb\D libovolnému znaku kromě desít. číslice a\Db – axb, ale ne a2b\w alfanumerickému znaku a podtržítku \w – 1, a, A, _, ale ne $, +\W nealfanum. znaku nebo podtržítku \W – $, !, ?, %, ale ne 2, b
23-05-04 18
Syntaxe regulárních výrazů (3)Hranice (ukotvení) – odpovídá pozici …
^ na začátku řetězce čí řádku ^Petr – najde Petr na začátku řetězce nebo řádku
$ na konci řetězce či řádku Pavel$ – najde Pavel na konci řetězce nebo řádku
\b na začátku či konci slova
\Bkos – najde kos ve slově kokos, ale ne v kost\B kdekoliv kromě začátku a konce slova
\bkos\b – nenajde kos ve slově kost či kokos
23-05-04 19
Syntaxe regulárních výrazů (4)Alternativy, seskupování, zpětné odkazy (reference)
|odděluje několik dílčích výrazů ahoj|nazdar – odpovídá
právě jednomu z pozdravů
()
subřetězec, na nějž lze aplikovat kvantifikátor
ko(ko)?s – odpovídá právě kos a kokos
odděluje několik dílčích subvýrazů a{b|c} – odpovídá právě ab a ac
subřetězec, na nějž se lze odkazovat (\d)\1, resp. (\d)$1 – odpovídá 11, 22, 33
23-05-04 20
Příklady regulárních výrazůRegulární výraza+ sekvence písmen a (1 a více znaků)
Odpovídá
a* sekvence písmen a (0 a více znaků)o?kov okov nebo kovtel(efon)? tel nebo telefontelef(on|ax)? telefon nebo telefax[0-9]|[1-9][0-9] čísla 0 – 99\d{2} sekvence dvou číslic desítkové soustavy (00, 01 – 98, 99)(19|20)\d{2} letopočty 1900 – 2099\d{2,6} sekvence dvou až šesti číslic
[^ ,.]+ neprázdná sekvence znaků, mezi nimiž nesmí být mezera, čárka nebo tečka
\d+0$ řetězec, který končí znakem 0, kterému předchází minimálně jedna číslice
23-05-04 21
Třída Regex (1)• Definována ve jmenném prostoruSystem.Text.RegularExpressions
• Reprezentuje neměnný (immutable) regulární výraz
• Lze ji využít např. k:– rozboru textu (parsing)– vyhledávání specifických vzorů textu– editování, nahrazování nebo mazání textových
podřetězců
23-05-04 22
Třída Regex (2)• Regulární výraz, s nímž chceme pracovat je
specifikován v době volání konstruktoru• Metody provádějící testování, zda text odpo-
vídá regulárnímu výrazu jsou definovány jako instanční i jako statické
• Mezi nejčastěji používané metody patří:– IsMatch:
• testuje, zda specifikovaný regulární výraz odpovídá zadanému řetězci
• vrací hodnotu typu bool
23-05-04 23
Třída Regex (3)– Match:
• hledá v zadaném řetězci první výskyt textu, který odpovídá specifikovanému regulárnímu výrazu
• vrací hodnotu typu Match, pomocí jejíž:– vlastnosti Success lze ověřit, zda odpovídající text byl,
resp. nebyl nalezen– vlastnosti Value je možné získat nalezený text– metody NextMatch lze hledat další výskyt textu (jež odpo-
vídá specifikovanému regulárnímu výrazu)
– Matches:• hledá v zadaném řetězci všechny výskyty textu, které
odpovídají specifikovanému regulárnímu výrazu• vrací hodnotu typu MatchCollection
23-05-04 24
Třída Regex (4)– Replace:
• provede náhradu všech výskytů textu (specifikova-ných regulárním výrazem) zadaným řetězcem
• vrací hodnotu typu string– Split:
• rozdělí vstupní řetězec na pozicích definovaných regulárním výrazem
• vrací pole řetězců
23-05-04 25
Reflexe (1)• Reflexe (Reflection) představuje proces ve-
doucí k získání informací o sestavách (assemblies) a datových typech, které jsou v nich definovány
• Umožňuje procházení a manipulaci s objek-tovým modelem reprezentujícím konkrétní aplikaci
• Každá aplikace pro .NET Framework je tvořena alespoň jednou sestavou (assembly)
23-05-04 26
Reflexe (2)• Sestava (assembly):
– tvoří základní (primární) stavební blok aplikace určené pro .NET Framework
– skládá se ze čtyřech prvků:• manifest, který obsahuje metadata o sestavě• metadata o typech uložených v assembly• kód v jazyce CIL (MSIL)• zdroje (resources)
• Metadata o obsažených typech a kód v jazyce CIL tvoří tzv. modul (module), který může obsahovat definice datových typů a jejich implementace
23-05-04 27
Reflexe (3)• Poznámka:
– sestava může obecně obsahovat více modulů– jednotlivé moduly jsou reprezentovány soubory
s příponou .netmodule• Manifest obsahuje např.:
– jednoduchý název sestavy– číslo verze sestavy– seznam souborů, které tvoří danou sestavu– seznam datových typů, které tvoří danou sestavu
a informaci, ke kterému modulu v sestavě je kon-krétní typ připojen
23-05-04 28
Reflexe (4)• Každá aplikace pro .NET Framework běží
v tzv. aplikační doméně (application domain):– představuje izolované běhové prostředí– obdoba procesu známého z Windows API– není popsána metadaty– je reprezentována třídou AppDomain (definová-
na ve jmenném prostoru System)• Třída AppDomain definuje mimo jiné:
– statickou vlastnost CurrentDomain:• poskytuje přístup k aktuální aplikační doméně
– metodu GetAssemblies:• vrací (v podobě pole) seznam zavedených sestav
23-05-04 29
Reflexe (5)• Pro využití možností reflexe jsou k dispozici
následující třídy:Object
Module
MemberInfo
Assembly
FieldInfo
PropertyInfo
MethodBase
EventInfo
Type
ConstructorInfoMethodInfo
AssemblyName
ParameterInfo
Abstraktní třída
23-05-04 30
Reflexe (6)• Třída Assembly:
– zapouzdřuje sestavu, tj. samopopisující se blok aplikace CLR
– umožňuje: • zavést sestavu• zjistit metadata a součásti sestavy• identifikovat datové typy, jež jsou v sestavě obsaženy• vytvářet instance obsažených datových typů
• Třída AssemblyName:– umožňuje zjistit informace o identitě sestavy– např.: verze, informace o kultuře apod.
23-05-04 31
Reflexe (7)• Třída MemberInfo:
– představuje předka pro třídy, které poskytují informace o členech třídy, tj. o:
• datových položkách – FieldInfo• vlastnostech – PropertyInfo• událostech – EventInfo
– mezi potomky MemberInfo patří i třídy:•MethodBase: předek pro třídy:
– ConstructorInfo: poskytuje informace o konstruktorech– MethodInfo: poskytuje informace o metodách
•Type:– reprezentuje deklarace datových typů (tříd, rozhraní, polí,
hodnotových typů, výčtových typů, generik apod.)– představuje metadata typů
23-05-04 32
Reflexe (8)• Třída Module:
– provádí reflexi modulu– zpřístupňuje modul v rámci sestavy
• Třída ParameterInfo:– poskytuje informace o atributech parametrů– např.: datové typy, implicitní hodnoty
• Poznámka:– všechny výše uvedené třídy (vyjma třídy Type)
jsou definovány ve jmenném prostoru System.Reflection
23-05-04 33
Třída Type (1)• Definována ve jmenném prostoru System• Poskytuje členy pro zpřístupnění metadat
daného datového typu• Abstraktní třída její instanci nelze vytvořit
voláním konstruktoru• Pro získání instance lze použít:
– volání metody GetType zděděné od třídy Object na konkrétní instanci třídynapř.:Person p = new Person();Type t = p.GetType();
23-05-04 34
Třída Type (2)– volání statické metody GetType třídy Type
např.:Person p = new Person();Type t = Type.GetType (”Namespace.Person”);
– operátor typeof:např.:Person p = new Person();Type t = typeof(Person);
23-05-04 35
Třída Type (3)• Mezi členy poskytované třídou Type patří
např.:– vlastnosti pro zjištění základních charakteristik
(rysů) daného datového typu, např.:•IsAbstract, IsArray, IsClass, IsEnum, IsGenericTypeDefinition, IsGenericParameter, IsInterface, IsPrimitive, IsSealed, IsValueType
– metody vracející pole obsahující požadované položky, např.:•GetConstructors, GetEvents, GetFields, GetInterfaces, GetMembers, GetMethods, GetNestedTypes, GetProperties
23-05-04 36
Dynamické vytvoření instance (1)• Na základě informací získaných pomocí re-
flexe je možné dynamicky vytvořit instanci třídy, která je definována v jiné sestavě
• Pro dynamické vytvoření instance lze využít statickou metodu CreateInstance třídy Activator
• Metoda CreateInstance:– umožňuje zadat parametry předávané konstrukto-
ru (v podobě pole s prvky typu object)– vrací odkaz na nově vytvořený objekt (vrácená
hodnota je typu object)
23-05-04 37
Dynamické vytvoření instance (2)• U dynamicky vytvořené instance lze např.:
– zpřístupnit vlastnosti, k čemuž je možné použít:• metodu GetProperty třídy Type:
– vrací hodnotu typu PropertyInfo• metodu GetValue, resp. SetValue třídy PropertyInfo:
– umožňuje přečíst, resp. zapsat hodnotu zadané vlastnosti
– vyvolat metodu pomocí:• metody GetMethod třídy Type:
– vrací hodnotu typu MethodInfo• metody Invoke třídy MethodInfo:
– provede vyvolání zadané metody– parametry jsou předávány jako pole s prvky typu object– vrácená hodnota je typu object
23-05-04 38
Expression trees (1)• Expression tree (strom výrazu) reprezentuje
kód ve stromové datové struktuře, kde každý uzel je výraz, např.:– volání metody– binární operace (např. x < y)
• Kód reprezentovaný stromem výrazu může být přeložen a spuštěn, což umožňuje:– dynamickou modifikaci spustitelného kódu– spouštění dotazů LINQ v různých databázích– vytváření dynamických dotazů
23-05-04 39
Expression trees (2)• Pro strom výrazu platí:
– vychází z jednoho uzlu na nejvyšší úrovni– vlastnosti tohoto uzlu se vážou na další uzly– každý další uzel může mít jeden nebo více podří-
zených uzlů, které tvoří parametry operace, kterou daný uzel reprezentuje
• Příklad:– uzel stromu výrazu může být operátor, který sčítá
dva operandy– každý z těchto operandů může být dalším uzlem ve
stromu výrazu, který zapouzdřuje další operace
23-05-04 40
Expression trees (3)• Uzly stromů výrazů jsou reprezentovány po-
mocí tříd, které jsou definovány jako násled-níci abstraktní třídy Expression
• Stromy výrazů mohou být vytvořeny:– na základě lambda výrazů:
• pomocí třídy Expression<TDelegate>– použitím API:
• využitím abstraktní třídy Expression• Poznámky (neměnnost):
– uzly ve stromu výrazu jsou neměnné (immutable)– strom výrazu lze změnit pouze sestavením nové-
ho stromu, který lze vytvořit z uzlů resp. podstro-mů existujícího stromu
23-05-04 41
Třída Expression<TD> (1)• Definována ve jmenném prostoru System.Linq.Expressions
• Slouží pro reprezentaci lambda výrazů v po-době stromů výrazů
• Vytvoření stromu výrazu se provede přiřa-zením lambda výrazu do proměnné typu Expression<TDelegate>
• Lze použít pouze pro jednořádkové lambda výrazy (expression lambdas), které na pravé straně neobsahují blok příkazů uzavřený mezi složenými závorkami (statement lambdas)
23-05-04 42
Třída Expression<TD> (2)• Definována jako následník třídy LambdaExpression
• Od svého předchůdce mimo jiné dědí násle-dující vlastnosti (dostupné pouze pro čtení):– Body:
• vrací tělo lambda výrazu– NodeType:
• vrací typ uzlu jako hodnotu enumeračního typu ExpressionType (např.: Add, Divide, Loop)
• určuje, který operátor tento uzel ve stromu výrazu reprezentuje
– Parameters:• obsahuje (v podobě kolekce) seznam parametrů lambda
výrazu
23-05-04 43
Třída Expression<TD> (3)– ReturnType:
• obsahuje typ hodnoty, kterou lambda výraz vrací
• Definuje metodu Compile, která přeloží kód reprezentovaný stromem výrazu do spu-stitelného delegáta
• Poznámky:– třída Expression<TDelegate> je definová-
na s modifikátorem sealed nelze na základě ní definovat potomky
– v roli parametrizovaného delegáta obvykle vystu-puje generický delegát Action nebo Func
23-05-04 44
Třída Expression<TD> (4)• Příklad:Expression<Func<double, double, double>> TriangleAreaExp = (a, b) => a * b / 2;
TriangleAreaExp
/
b
2*
a
Body
BinaryExpression
BinaryExpression
ParameterExpression ParameterExpression
Left Right
Left Right
ConstantExpression
Parameters
ba
[0] [1]
23-05-04 45
Třída Expression (1)• Definována ve jmenném prostoru System.Linq.Expressions
• Abstraktní třída, která obsahuje statické me-tody pro vytvoření uzlů specifického typu, např.:– Parameter:
• pro uzel, reprezentující proměnnou nebo parametr– Call:
• pro uzel reprezentující volání metody
• Podporuje rovněž práci s řídícími struktura-mi – cykly, větvení, bloky try – catch
23-05-04 46
Třída Expression (2)• Slouží jako bázová třída, od níž jsou odvoze-
ny třídy reprezentující ve stromech výrazů jednotlivé uzly
• Mezi potomky třídy Expression patří např.:– BinaryExpression:
• reprezentuje výraz, který má binární operátor– BlockExpression:
• reprezentuje výraz, který obsahuje sekvenci výrazů a ve kterém mohou být definovány proměnné
– ConditionalExpression:• reprezentuje výraz, který má podmíněný operátor
23-05-04 47
Třída Expression (3)– ConstantExpression:
• reprezentuje výraz, který má konstantní hodnotu– LambdaExpression:
• popisuje lambda výraz• předchůdce třídy Expression<TDelegate>
– LoopExpression:• reprezentuje nekonečný cyklus, který může být
ukončen pomocí break– MethodCallExpression:
• reprezentuje volání statické nebo instanční metody– ParameterExpression:
• reprezentuje pojmenovaný parametr