Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Vizuális programozás Adatbázisok elérése.

Hasonló előadás


Az előadások a következő témára: "Vizuális programozás Adatbázisok elérése."— Előadás másolata:

1 Vizuális programozás Adatbázisok elérése

2 J.Zs.Cs.: Vizuális programozás (c) 2014
Adatbázisok elérése1 Közvetlen elérés - minden adatbázismotorhoz külön függvénygyűjtemény Absztrakciós rétegen keresztül Open DataBase Connectivity (ODBC), közös függvényhalmaz, amivel minden DB elérhető. Az ODBC rétegben levő driverek lefordítják. Object Linking and Embedding DataBase (OLE DB) –kifele táblázatos formában mutatja az adatokat. Az adatforrások OLE DB provider-eken keresztül érhetők el COM objektumok segítségével. ODBC-t is elér. Objektum-Relációs Leképezés (Object Relational Mapping), a programozó objektumokkal dolgozik Közvetlen elérés - minden adatbázismotorhoz külön függvénygyűjtemény – E: Gyors adatelérés – a programok közvetlenül az adatbázissal kommunikálnak H: A programozónak mindent ismernie kellett, DB csere esetén át kellett írni a teljes programot Open DataBase Connectivity (ODBC) – absztrakciós réteg, közös függvényhalmaz, amivel minden DB elérhető. Az ODBC rétegben levő driverek lefordítják. E: csak az ODBC fv-eket kellett ismerni H: csak oszlopokba rendezett adatokat tud olvasni OLE DB – absztrakciós réteg, kifele táblázatos formában mutatja az adatokat. Az adatforrások OLE DB provider-eken keresztül érhetők el. ODBC-t is elér. Az OLEDB fejlesztésének célja az volt, hogy egy magasabb szintű és tágabb funkcionalitású absztrakciós réteget képezzenek az ODBC helyett. Ez magába foglalja az olyan adatbázisok elérését is amelyek nem SQL alapúak. Pl. nem-relációs adatbázisok, OO adatbázisok, számolótáblák, hierarchikus adatbázisok. Az OLEDB a fogyasztó-szolgáltató (provider-consumer) modellt követi. J.Zs.Cs.: Vizuális programozás (c) 2014

3 J.Zs.Cs.: Vizuális programozás (c) 2014
ODBC ODBC réteg Oracle Driver Oracle MS SQL Driver MS SQL Metódushívás Alkalmazás mySQL Driver MySQL … Driver J.Zs.Cs.: Vizuális programozás (c) 2014

4 OLE-DB Alkalmazás OLE-DB Consumer OLE-DB Provider
Adatforrás specifikus API Adatforrás J.Zs.Cs.: Vizuális programozás (c) 2014

5 Microsoft/Windows Data Access Components (MDAC/WDAC)
J.Zs.Cs.: Vizuális programozás (c) 2014 Kép forrása:

6 J.Zs.Cs.: Vizuális programozás (c) 2014
Adatbázisok elérése2 ActiveX Data Objects (ADO) – egy vékony réteg az OLE DB felett, a magas szintű nyelvek számára elérhetővé teszi azt. ADO.NET – ADO továbbfejlesztett, felügyelt változata LINQ – beágyazott SQL C# 3.0-tól a Cω-ból átvéve Entity Framework – ORM réteg, .NET 3.5-től J.Zs.Cs.: Vizuális programozás (c) 2014

7 J.Zs.Cs.: Vizuális programozás (c) 2014
ADO.NET A .NET adatbáziskezelési osztálygyűjteménye Fő névtér: System.Data Jellemzők Relációs adatok egyszerű elérése: osztályok oszlopok, sorok, táblák, adatbázis leírására Bővíthető: vannak beépített adatszolgáltatók (data provider): MS SQL, Oracle, ODBC, OLE DB és továbbiak beszerezhetők: pl. mySQL Többrétegű alkalmazások támogatása Az XML és relációs adatelérés egységesítése Kapcsolatkészlet fenntartása, adatbáziskapcsolatok újrafelhasználása J.Zs.Cs.: Vizuális programozás (c) 2014

8 J.Zs.Cs.: Vizuális programozás (c) 2014
ADO.NET J.Zs.Cs.: Vizuális programozás (c) 2014 Ábra forrása:

9 Többrétegű alkalmazás
Presentation tier Megjelenítési réteg windows forms Wpf/XAML web böngésző (web forms) konzol Business tier (logic) Üzleti logikai réteg adatokat feldolgozó szerver adat objektumok webszolgáltatások .net remoting Data tier Adattároló réteg DBMS egyéb erőforrások J.Zs.Cs.: Vizuális programozás (c) 2014

10 J.Zs.Cs.: Vizuális programozás (c) 2014
Adatelérési modellek Kapcsolat alapú (Connected Access) – pl. DataCommand, DataReader – ha az adatokat azonnal feldolgozzuk Kapcsolat nélküli (Disconnected Access) – pl. DataSet – lokális másolat az adatokról J.Zs.Cs.: Vizuális programozás (c) 2014

11 Kapcsolat alapú adatelérés
Select Tárolt eljárás Kliens alkalmazás Olvasás Command DataReader Windows Forms, WPF, Konzol, XAML Connection Írás Command Insert Update Delete Stored procedure Web Forms Adatbázis J.Zs.Cs.: Vizuális programozás (c) 2014

12 Kapcsolat nélküli adatelérés
DataSet DataTable DataTable Fill() Update() TableAdapter DataAdapter SelectCommand UpdateCommand SelectCommand UpdateCommand InsertCommand InsertCommand DeleteCommand DeleteCommand Connection SQL Server J.Zs.Cs.: Vizuális programozás (c) 2014 J.Zs.Cs.: Vizuális programozás (c) 2010 Forrás: Albert István Okos kliens fejlesztése a .NET platformra

13 Adat objektumok Provider-Consumer modell
Provider: adatforrás specifikus – ezek olvassák és írják az adatforrást Consumer: közös – ezekkel manipulálható a memóriában levő adat J.Zs.Cs.: Vizuális programozás (c) 2014

14 J.Zs.Cs.: Vizuális programozás (c) 2014
Data Provider Híd az alkalmazás és az adatforrás között, ezen keresztül mozognak az adatok az alkalmazás és az adatbázis között Microsoft DP-k SqlClient (MS SQL Server) OracleClient (Oracle) OleDb Odbc Más cégektől J.Zs.Cs.: Vizuális programozás (c) 2014

15 Telepített DP-k kiíratása
DataTable dtDataProviderek = DbProviderFactories.GetFactoryClasses(); string ProviderLista = ""; foreach (DataRow drProviderek in dtDataProviderek.Rows) { ProviderLista+= (String)(drProviderek.ItemArray[0])+ "\t" + (String)(drProviderek.ItemArray[1]) + "\r\n\r\n"; } Console.WriteLine(ProviderLista); J.Zs.Cs.: Vizuális programozás (c) 2014

16 J.Zs.Cs.: Vizuális programozás (c) 2014
Provider osztályok Connection Command DataReader DataAdapter/TableAdapter J.Zs.Cs.: Vizuális programozás (c) 2014

17 J.Zs.Cs.: Vizuális programozás (c) 2014
Connection objektum A DP egyik komponense Kapcsolat az adattárhoz, ezen keresztül kommunikál az alkalmazás az adatbázissal ConnectionString – a kapcsolat beállításai this.odbcConnection1.ConnectionString = "STMT=;OPTION=3;DSN=Hallgatok;UID=;PASSWORD=;DESC=MySQL ODBC 3.51 Driver DSN;DATAB" + "ASE=Hallgatok;SERVER=localhost;PORT=3306"; OleDbConnection - ODBCConnection SQLConnection – Microsoft SQL Server J.Zs.Cs.: Vizuális programozás (c) 2014

18 J.Zs.Cs.: Vizuális programozás (c) 2014
Command objektum Közvetlen hozzáférés a kapcsolt adatbázis adataihoz SQL parancsok vagy tárolt eljárások Az eredmény adatfolyam, amit DataReader olvashat vagy DataSet-be lehet betölteni Parameters tulajdonság: gyűjtemény, az SQL parancsok vagy tárolt eljárások bemenő és kimenő paraméterei Command típusok (osztályok) System.Data.SqlClient.SqlCommand System.Data.OleDb.OleDbCommand J.Zs.Cs.: Vizuális programozás (c) 2014

19 J.Zs.Cs.: Vizuális programozás (c) 2014
DataReader objektum Gyors, csak előrehaladást engedélyező szerver oldali kurzorhoz hozzáférés Rekordokat tartalmazó adatfolyamon halad végig A Command objektum ExecuteReader metódusa egy DataReader-t ad vissza Az aktuális rekord egyes oszlopaiban tárolt adatokat típusuk szerinti metódusokkal lehet lekérdezni (pl. GetDouble) J.Zs.Cs.: Vizuális programozás (c) 2014

20 J.Zs.Cs.: Vizuális programozás (c) 2014
DataAdapter objektum Híd a tábla és az adatforrás között Adatbázis parancsok Adatbázis kapcsolatok Alap típusok OleDbDataAdapter SqlDataAdapter – SQL Serverhez J.Zs.Cs.: Vizuális programozás (c) 2014

21 J.Zs.Cs.: Vizuális programozás (c) 2014
TableAdapter Egy generált osztály típusos DataSet kezeléséhez Magába foglalja az alábbi objektumokat: DataAdapter Connection Commands Query Parameters Minden táblához külön TableAdapter J.Zs.Cs.: Vizuális programozás (c) 2014

22 J.Zs.Cs.: Vizuális programozás (c) 2014
TableAdapterManager Többtáblás DataSet-eknél kulcs-idegen kulcs kapcsolatok figyelembe vételével oldja meg az adatok mentését Típusos DataSet-nél automatikusan keletkezik Hierarchical update J.Zs.Cs.: Vizuális programozás (c) 2014

23 J.Zs.Cs.: Vizuális programozás (c) 2014
Consumer objektumok DataSet/típusos DataSet DataTable/típusos DataTable DataRow DataColumn Relation J.Zs.Cs.: Vizuális programozás (c) 2014

24 DataSet objektum Kapcsolat nélküli cache-ben tárol adatokat
Az adatforrás adatainak lokális másolata Struktúrája egy relációs adatbázishoz hasonló Táblák, kapcsolatok A megkötések elsődleges és idegen kulcsokat igényelnek J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

25 J.Zs.Cs.: Vizuális programozás (c) 2014
DataSet felépítése DataSet Tables Table Columns Column Constraints Rows Row Relations Relation J.Zs.Cs.: Vizuális programozás (c) 2014

26 Típusos DataSet További absztrakciós szint
Az alap DataSet osztály leszármazottja Típusellenőrzést tesz lehetővé fordítási időben Gyorsabb hozzáférést biztosít az adathalmazban levő táblákhoz és rekordokhoz XML Schema (.xsd) leírás állományokból van generálva az XSD.exe segítségével Grafikusan (.xss, .xcs) Hozzáférés táblákhoz és oszlopokhoz Típus nélküli esetben: dsNév.Tables["TáblaNév"] Típusos esetben: dsNév.TáblaNév , dsAdatok.dtDolgozatok.HallgatóColumn J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

27 Típusos DataSet létrehozása létező adatbázisból
Pl.: Access adatbázis állomány (1) Felvesszük a projektbe az adabázis állományt - elindul a varázsló (2) Data/Add New Data Source … J.Zs.Cs.: Vizuális programozás (c) 2014

28 J.Zs.Cs.: Vizuális programozás (c) 2014

29 Automatikusan generált osztályok
A táblákat és a táblaadaptereket átneveztem az órán alkalmazott elnevezési konvenciónak megfelelően. J.Zs.Cs.: Vizuális programozás (c) 2014

30 J.Zs.Cs.: Vizuális programozás (c) 2014

31 Kapcsolat alapú adatbázis elérés Lekérdezés
Az eredmény egy szerver oldali kurzorba kerül, abból olvashatunk soronként DataReader segítségével Lépések Kapcsolati sztring összeállítása Kapcsolat létesítése az adatbázishoz Connection objektum segítségével SQL lekérdezés sztring összeállítása Kapcsolat megnyitása Command objektum létrehozása DataReader objektum létrehozása Rekordok kiolvasása DataReader objektum lezárása Kapcsolat lezárása J.Zs.Cs.: Vizuális programozás (c) 2014

32 Kapcsolat alapú lekérdezés példa
J.Zs.Cs.: Vizuális programozás (c) 2014

33 Kapcsolatalapú adatbáziselérés Beszúrás, Módosítás, Törlés
Lépések Kapcsolat objektum létrehozása Kapcsolati sztring összeállítása Kapcsolat létesítése az adatbázishoz Connection objektum segítségével SQL utasítás sztring összeállítása Command objektum létrehozása Kapcsolat megnyitása SQL parancs végrehajtása ExecuteNonQuery Kapcsolat lezárása J.Zs.Cs.: Vizuális programozás (c) 2014

34 Kapcsolat alapú beszúrás példa
J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

35 Kapcsolat nélküli adatbázis elérés – adatok beolvasása
Kapcsolat létesítése az adatbázissal egy Connection objektum segítségével Command objektum létrehozása és a Connection objektumhoz kapcsolása SQL parancsok összeállítása DataAdapter/TableAdapter/ TableAdapterManager objektum(ok) létrehozása DataSet objektum(ok) létrehozása Adatok bemásolása a DataSet-be (DataTable) a Fill() metódus meghívásával J.Zs.Cs.: Vizuális programozás (c) 2014

36 Kapcsolat nélküli adatbázis elérés – adatok beolvasása
Egy DS-ben több tábla Egy DS több különböző forrásból szerezhet adatokat A DataAdapter vagy TableAdapter objektum Fill() metódusa gondoskodik a kapcsolat megnyitásáról és az adatok letöltéséről J.Zs.Cs.: Vizuális programozás (c) 2014

37 Kapcsolat nélküli adatbeolvasás példa - típus nélküli DataSet
J.Zs.Cs.: Vizuális programozás (c) 2014

38 Kapcsolat nélküli – adatbeolvasás típusos DataSet-be
J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

39 Több táblából álló DS – Kapcsolat létrehozása
Az ADO.NET nem állítja elő automatikusan az adatbázis táblái közötti kapcsolatokat a DataSet táblái között A kapcsolat vizuális eszközökkel Visual Studio 2010-ben is beállítható Megoldás programból típusos DataSet esetén DataColumn dcElsődlegesKulcs = dsAdatok.dtÉrtékelés.JegyColumn; DataColumn dcIdegenKulcs = dsAdatok.dtDolgozatok.JegyColumn; DataRelation drKapcsolat = new DataRelation("Kapcsolat", dcElsődlegesKulcs, dcIdegenKulcs); dsAdatok.Relations.Add(drKapcsolat); J.Zs.Cs.: Vizuális programozás (c) 2014

40 Kapcsolat létrehozása vizuális eszközökkel
J.Zs.Cs.: Vizuális programozás (c) 2014

41 Adatlista a kapcsolat felhasználásával
J.Zs.Cs.: Vizuális programozás (c) 2014

42 DS-ben tárolt adatok módosítása1
Minden cella közvetlenül írható Sor törlése: meghívjuk DataRow objektum Delete() vagy Remove() metódusát A Remove() meghívja az AcceptChanges()-t is Beszúrás: Új sorobjektum előállítása Sorobjektum hozzáadása a tábla Rows gyűjteményéhez A DS tárolja az eredeti és a módosított adatokat Elfogadás: AcceptChanges() Visszavonás: RejectChanges() J.Zs.Cs.: Vizuális programozás (c) 2014

43 DataSet-ben tárolt adatok módosítása2
Rekord hozzáadása Rekord módosítása J.Zs.Cs.: Vizuális programozás (c) 2014

44 DataSet-ben tárolt adatok módosítása3
Törlés J.Zs.Cs.: Vizuális programozás (c) 2014

45 Változások érvényesítése az adatbázisban
A DataAdapter/TableAdapter objektum Update() metódusának meghívása A DataAdapter/TableAdapter elküldi a megfelelő INSERT, UPDATE, DELETE SQL utasításokat Az SQL utasításokat a vizuális fejlesztés során automatikusan generálja a fejlesztőrendszer (nem minden adatbázis esetén támogatott, de pl. MS SQL-nél igen) CommandBuilder objektummal állítjuk elő, de csak egytáblás adatbázisnál működik, és csak akkor, ha van elsődleges kulcs a programozó írja meg J.Zs.Cs.: Vizuális programozás (c) 2014

46 Language INtegrated Query
LINQ Language INtegrated Query J.Zs.Cs.: Vizuális programozás (c) 2014

47 J.Zs.Cs.: Vizuális programozás (c) 2014
LINQ Cél: egy egységes eszközkészlet objektumokban tárolt adatok (~ to Objects) , XML adatok (~ to XML), relációs adatok (~ to DataSet, ~ to SQL), Entity Framework (L2E) lekérdezésére Új nyelvi elemek Lekérdező kifejezések (query expressions) Lekérdező operátorok (query operators) Erősen típusos kifejezések .Net keretrendszer ≥ 3.5 J.Zs.Cs.: Vizuális programozás (c) 2014

48 J.Zs.Cs.: Vizuális programozás (c) 2014
LINQ to Objects J.Zs.Cs.: Vizuális programozás (c) 2014

49 J.Zs.Cs.: Vizuális programozás (c) 2014
Lekérdezések SQL kifejezésekhez hasonló A visszatérési érték típusa egyes esetekben fordításkor dől el Implicit típusok alkalmazása Előfeltétel: Az adatokat tároló objektum meg kell valósítsa a generikus IEnumerable<T> interfészt A System.Collections névtér gyűjteményei nem implementálják J.Zs.Cs.: Vizuális programozás (c) 2014

50 J.Zs.Cs.: Vizuális programozás (c) 2014
Megoldás Átalakítás J.Zs.Cs.: Vizuális programozás (c) 2014

51 J.Zs.Cs.: Vizuális programozás (c) 2014
Szűrés típus alapján Különböző típusú objektumok egy ArrayList-ben Csak a string-ekre van szükség J.Zs.Cs.: Vizuális programozás (c) 2014

52 J.Zs.Cs.: Vizuális programozás (c) 2014
Operátorok from x in y where orderby x ascending|descending group x by y into z select join, on, equals, into J.Zs.Cs.: Vizuális programozás (c) 2014

53 J.Zs.Cs.: Vizuális programozás (c) 2014
Metódusok Distinct<>() Count<>() Union<>() Sum<>() Min<>(), Max<>() Intersect<>() Reverse<>() J.Zs.Cs.: Vizuális programozás (c) 2014

54 Névtelen típus előállítása projekcióval
J.Zs.Cs.: Vizuális programozás (c) 2014

55 J.Zs.Cs.: Vizuális programozás (c) 2014
Feladat Három érdekes évszám: 2010, 2011, 2012. Ezek olyan egymást követő négyjegyű pozitív egész számok, amelyekben ugyanaz a három számjegy található és pontosan az egyikből van mindegyikben pontosan kettő. Keress további ilyen tulajdonságú négyjegyű pozitív egész szám hármasokat úgy, hogy a számjegyek összege legtöbb 21 lehet! Az alkalmazás célja az, hogy demonstráljon különböző LINQ lekérdezési lehetőségeket. J.Zs.Cs.: Vizuális programozás (c) 2014

56 J.Zs.Cs.: Vizuális programozás (c) 2014
Demo Szótár Számok J.Zs.Cs.: Vizuális programozás (c) 2014

57 Szökőévek keresése – hagyományos megoldás
J.Zs.Cs.: Vizuális programozás (c) 2014

58 Szökőévek keresése – névtelen metódus
Eredeti Fordítás után (.Net Reflector) J.Zs.Cs.: Vizuális programozás (c) 2014

59 Szökőévek keresése – LINQ lekérdezéssel
Eredeti Fordítás után (.Net Reflector) J.Zs.Cs.: Vizuális programozás (c) 2014

60 Szökőévek keresése – Lambda kifejezéssel
Eredeti Fordítás után (.Net Reflector) J.Zs.Cs.: Vizuális programozás (c) 2014

61 Csökkenő sorba rendezés – névtelen metódussal
Eredeti Fordítás után (.Net Reflector) Mi a névtelen metódus? Írjon egy sorbarendezés|szűrés (a konkrét feladat a feladatlapon kerül meghatározásra) jellegű mintapéldát. J.Zs.Cs.: Vizuális programozás (c) 2014

62 Csökkenő sorba rendezés – lambda kifejezéssel
Eredeti Fordítás után (.Net Reflector) J.Zs.Cs.: Vizuális programozás (c) 2014

63 J.Zs.Cs.: Vizuális programozás (c) 2014
LINQ to ADO.NET LINQ to DataSets LINQ to XML LINQ to SQL J.Zs.Cs.: Vizuális programozás (c) 2014

64 LINQ to DataSets

65 J.Zs.Cs.: Vizuális programozás (c) 2014
Átalakítás Típus nélküli DataSet.AsEnumerable() DataSet  IEnumerable<T> DataRow lista Field, SetField (table.Rows[i].SetField(columnIndex, value);) CopyToDataTable (var table = qres.CopyToDataTable<DataRow>();) Mikor kell meghívni és milyen adattípus esetén az AsEnumerable metódust (LINQ)? qres-egy LINQ lekérdezés eredménye J.Zs.Cs.: Vizuális programozás (c) 2014

66 J.Zs.Cs.: Vizuális programozás (c) 2014
Lekérdezés Átalakítás ToArray, ToDictionary, ToList Elem ElementAt, First Aggregáció Aggregate, Average, Count, LongCount, Max, Min, Sum J.Zs.Cs.: Vizuális programozás (c) 2014

67 Aggregate és lambda kifejezés
J.Zs.Cs.: Vizuális programozás (c) 2014

68 Any és lambda kifejezés
J.Zs.Cs.: Vizuális programozás (c) 2014

69 J.Zs.Cs.: Vizuális programozás (c) 2014

70 J.Zs.Cs.: Vizuális programozás (c) 2014

71 J.Zs.Cs.: Vizuális programozás (c) 2014

72 J.Zs.Cs.: Vizuális programozás (c) 2014
3 A feladatlapon megkap egy kéttáblás DataSet-et, amire végre kell hajtani lekérdezéseket LINQ segítségével. J.Zs.Cs.: Vizuális programozás (c) 2014

73 Adat-megjelenítési lehetőségek
Adatkötés: egy objektumot szeretnénk megjeleníteni a felhasználói felületen; ehhez össze kell kapcsolnunk egy vezérlővel az adatforrást Ha az adatoknak egy gyűjteménye áll rendelkezésünkre, akkor olyan vezérlőt kell választani, ami az ItemsControl osztályból származik Listás megjelenítés esetében meg kell adni egy sablont (ItemTemplate), ami definiálja egy elem kinézetét Táblázatos megjelenítésnél nincs szükség ItemTemplate-re J.Zs.Cs.: Vizuális programozás (c) 2014

74 J.Zs.Cs.: Vizuális programozás (c) 2014
Adatkötés WPF-ben Egyirányú (Forrás->Cél, Cél -> Forrás ) Kétirányú A Cél tulajdonság DependencyProperty típusú kell legyen J.Zs.Cs.: Vizuális programozás (c) 2014

75 Dependency Property Hasonló a hgyományos tulajdonsághoz, de annál komplexebb Főbb eltérések a tulajdonságokhoz képest A tulajdonság közvetlenül olvassa ki a védett mezőből az adatokat A Depencency Property dinamikusan gyűjti be az információt a GetValue() metódus meghívásával Ezt a függvényt a DependencyObject-től örökli WPF Dependency Property: WPF Control Hierachia:

76 J.Zs.Cs.: Vizuális programozás (c) 2012
Dependency Property J.Zs.Cs.: Vizuális programozás (c) 2012

77 Dependency Property További eltérések:
Adatmódosításnál (érték beállítása) a DependencyObject-től kapott dictionary-nek (kulcs-érték párok halmaza) adunk egy értékpárt A kulcs lesz az a tulajdonság, amit változtatni akarunk, az érték pedig amire be akarjuk állítani

78 Dependency Property Előnyei: Kevesebb memóriát fogyasztunk
Rengeteg adatot tárolunk a UI vezérlők adattagjaiban Értékek öröklődése Ha lokálisan nincs érték beállítva, akkor a logikai fában felfelé haladva addig megyünk, amíg nem találunk értéket Pl.: FontSize-ot beállítjuk egy gyökér elemben, akkor az mindenre ki fog hatni (ha lokálisan nem változtatjuk meg)

79 Dependency Property Előnyei 2: Értesítés a változásokról
Beépített változás-értesítés Callback metódus segítségével kapunk értesítést a változásokról Adatkötésre is Dependency property-t használjuk (Binding)

80 Dependency property Létrehozása Visual Studioban
propdp <TAB> <TAB> - code snippet Kell egy statikus DepdencyProperty típusú mező, ami meghívja a DependencyProperty.Register() metódusát A neve mindig Propety-vel kell, hogy végződjön! Register metódusban meg kell adni a Tulajdonság nevét Tulajdonság típusát Tartalmazó típusát Metadata típusát (ha nem akarjuk használni, null-t adhatunk neki)

81 Dependency property public string Tükör { get { return(string)GetValue(TukorProperty); } set { SetValue(TukorProperty, value); } public static readonly DependencyProperty TukorProperty = DependencyProperty.Register("Tukor", typeof(string), typeof(Tukorkep), null);

82 Attached property Speciális Dependency Property
Pl.: Panel-től származó konténer elemek <Canvas> <Button Canvas.Top="20" Canvas.Left="20" Content="Gomb"/> </Canvas>

83 Value Resolution Strategy
When you access a dependency property over its .NET property wrapper, it internally calls GetValue(DependencyProperty) to access the value. This method resolves the value by using a value resolution strategy that is explained in detail below. If a local value is available, it reads it directly from the dictionary. If no value is set if goes up the logical tree and searches for an inherited value. If no value is found it takes the default value defined in the property metadata. This sequence is a bit simplified, but it shows the main concept. J.Zs.Cs.: Vizuális programozás (c) 2012

84 Value Changed Callback
private static void OnCurrentTimePropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) { MyClockControl control = source as MyClockControl; DateTime time =(DateTime)e.NewValue; // Put some update logic here... } The change notification callback is a static method, that is called everytime when the value of the TimeProperty changes. The new value is passed in the EventArgs, the object on which the value changed is passed as the source. J.Zs.Cs.: Vizuális programozás (c) 2012

85 J.Zs.Cs.: Vizuális programozás (c) 2012
Coerce Value Callback private static object OnCoerceTimeProperty( DependencyObject sender, object data ) { if ((DateTime)data > DateTime.Now ) data = DateTime.Now; } return data; Kényszerít, korlátoz The coerce callback allows you to adjust the value if its outside the boundaries without throwing an exception. A good example is a progress bar with a Value set below the Minimum or above the Maximum. In this case we can coerce the value within the allowed boundaries. In the following example we limit the time to be in the past. J.Zs.Cs.: Vizuális programozás (c) 2012

86 J.Zs.Cs.: Vizuális programozás (c) 2012
Validation Callback private static bool OnValidateTimeProperty(object data) { return data is DateTime; } In the validate callback you check if the set value is valid. If you return false, an ArgumentException will be thrown. In our example demand, that the data is an instance of a DateTime. J.Zs.Cs.: Vizuális programozás (c) 2012

87 J.Zs.Cs.: Vizuális programozás (c) 2014
Adatkötési módok Adatkötésnek van változáskövetési képessége Három lehetőségünk van: OneTime, OneWay, TwoWay OneTime: legegyszerűbb, nincs változáskövetés, egyszer történik adatszinkronizáció OneWay: felület felé irányú változáskövetés megoldott, ha módosul az adatforrás, nem kell semmit kódolni OneWayToSource TwoWay: másik irányú változáskövetés is megoldott J.Zs.Cs.: Vizuális programozás (c) 2014

88 J.Zs.Cs.: Vizuális programozás (c) 2014
Egyszerű adatkötés DataContext – forrás objektum Értéke öröklődik a logikai fa hierarchiában J.Zs.Cs.: Vizuális programozás (c) 2014

89 Element to Element Binding
J.Zs.Cs.: Vizuális programozás (c) 2014

90 Kötés statikus erőforráshoz
J.Zs.Cs.: Vizuális programozás (c) 2014

91 J.Zs.Cs.: Vizuális programozás (c) 2014
Az adatszerkezet J.Zs.Cs.: Vizuális programozás (c) 2014

92 Statikus erőforrás definiálása
J.Zs.Cs.: Vizuális programozás (c) 2014

93 J.Zs.Cs.: Vizuális programozás (c) 2014
Adatkötés J.Zs.Cs.: Vizuális programozás (c) 2014

94 Kötés futási időben létrehozott objektumhoz
J.Zs.Cs.: Vizuális programozás (c) 2014

95 J.Zs.Cs.: Vizuális programozás (c) 2014
Felület J.Zs.Cs.: Vizuális programozás (c) 2014

96 Lista létrehozása és adatforrás megadása
J.Zs.Cs.: Vizuális programozás (c) 2014

97 J.Zs.Cs.: Vizuális programozás (c) 2014
Lépegetés megoldása J.Zs.Cs.: Vizuális programozás (c) 2014

98 J.Zs.Cs.: Vizuális programozás (c) 2014
Binding Mode OneWay : Forrás->Cél OneWayToSource: Forrás<-Cél TwoWay: Forrás<->Cél OneTime: Forrás->Cél, egyszeri Default: változó A felhasználó által állítható tulajdonságoknál (pl. TextBox.Text, ComboBox.Text, MenuItem.IsChecked, stb.) TwoWay J.Zs.Cs.: Vizuális programozás (c) 2014

99 J.Zs.Cs.: Vizuális programozás (c) 2014
Mode=OneWay <TextBlock Width="248" Height="24" Text="{Binding ElementName=lbColor, Path=SelectedItem.Content, Mode=OneWay}" x:Name="tbSelectedColor" Background="{Binding ElementName=lbColor, Path=SelectedItem.Content, Mode=OneWay}"/> J.Zs.Cs.: Vizuális programozás (c) 2014

100 Adatkötés Windows Forms alkalmazásokban

101 Adatok megjelenítése - adatkötés
Egyszerűen és kényelmesen teremt kapcsolatot egy form vezérlői és egy adathalmaz között Kötés létesíthető DataSet-hez, tömbhöz, gyűjteményhez, stb. (támogatnia kell az indexelt hozzáférést) Osztályozás Egyszerű kötés (egy rekord egy adata) Komplex kötés (több rekord) Közvetlen kötés Közvetett kötés (BindingSource) Az adathalmaz lehet objektum, nem feltétlenük kell egy adatbázist megszemélyesítsen. Azaz nemcsak DataSet-hez létesíthetünk kötést. A továbbiakaban azonban szinte kizárólagosan a DataSet-hez vagy annak valamely eleméhez létesített kötésekkel fogunk foglalkozni. Közvetlen kötés esetén az adatforrás (DataSet) és a vezérlő egy tulajdonsága között létesítünk kapcsolatot, míg a közvetett esetben a kettő között egy újabb réteg jelenik meg a BindingSource objektum. Ez megkönnyíti az adatok közötti navigálást, szűrést, rendezést és az adatforrás esetleges lecserélését. J.Zs.Cs.: Vizuális programozás (c) 2014

102 J.Zs.Cs.: Vizuális programozás (c) 2014
Egyszerű kötés Egyszerre egy adatot köt egy vezérlő egy tulajdonságához A vezérlő egy tulajdonságába egy DataSet egy táblája egy oszlopának az aktuális mezője kerül Programból: A kötést egy Binding típusú objektum tárolja Beállítjuk a vezérlő DataBindings tulajdonságát az adatforrást megadva J.Zs.Cs.: Vizuális programozás (c) 2014

103 Példa egyszerű adatkötésre
J.Zs.Cs.: Vizuális programozás (c) 2014

104 J.Zs.Cs.: Vizuális programozás (c) 2014
Komplex adatkötés Egy listát kötnek egy vezérlőhöz Egyszerre egynél több rekord adatai jeleníthetők meg DataSource DisplayMember – az adatforrás mely oszlopát kell megjeleníteni J.Zs.Cs.: Vizuális programozás (c) 2014

105 Példa komplex adatkötésre1
J.Zs.Cs.: Vizuális programozás (c) 2014

106 Példa komplex adatkötésre2
J.Zs.Cs.: Vizuális programozás (c) 2014

107 J.Zs.Cs.: Vizuális programozás (c) 2014
BindingContext Gondoskodik az adatforrás és a vezérlő közötti szinkronizálásról Ha több vezérlő kötődik ugyanahhoz az adatforráshoz, gondoskodik az ezek közötti szinkronizálásról A vezérlőket tároló elem (pl. form) BindingContext adattagjában van eltárolva a BindingContext-re vonatkozó referencia A BC automatikusan jön létre A BC Egy gyűjtemény: Listaszerű adatoknál a háttérben egy CurrencyManager dolgozik Egyedi adatoknál a háttérben egy PropertyManager dolgozik A CM-et és a PM-et a vezérlőt tároló elem hozza létre, és a BC tulajdonságban tárolja. A CM-el lekérdezhetjük/beállíthatjuk, hogy melyik az aktuális sor. A CM értesíti a vezérlőt, ha változás áll be az adatforrásban. Figyelem: itt az adatforrás a DataSet objektumot jelenti és nem az adatbázist! J.Zs.Cs.: Vizuális programozás (c) 2014

108 Lépegetés megvalósítása CurrencyManager segítségével
Fontosabb tulajdonságok: Bindings: a menedzselt kötések gyűjteménye Current: az adatlista aktuális eleme Count: az adatlista elemeinek száma Position: az aktuális elem sorszáma J.Zs.Cs.: Vizuális programozás (c) 2014

109 Format és Parse események és az adatmegjelenítés
10,00 Ft 10 Format TextBox1 10 Parse 10,00 Ft Adatforrás Kötést megvalósító objektum J.Zs.Cs.: Vizuális programozás (c) 2014

110 J.Zs.Cs.: Vizuális programozás (c) 2014
Format és Parse Az adatforrásból származó adatok típusa gyakran nem egyezik meg a vezérlő által elfogadott típussal Format esemény: adat kerül az adatforrásból a vezérlőhöz (adatkötés létrehozásakor, Position értékének változásakor, rendezés, szűrés) Parse esemény: adat mozog a vezérlőtől az adatforrás felé (a vezérlő Validated eseménye után, az EndCurrentEdit metódus meghívásakor, ha változik a Position) J.Zs.Cs.: Vizuális programozás (c) 2014

111 Példa J.Zs.Cs.: Vizuális programozás (c) 2010

112 Közvetett adatkötés - BindingSource
Az adatforrás és a vezérlő között egy újabb réteg jelenik meg Megkönnyíti az adatok közötti navigálást és az adatforrás esetleges lecserélését DataSource DataMember A vezérlőket a BS-hez kötjük, a BS-t az adatforráshoz. Különösen akkor érdekes, ha több vezérlő is kapcsolódik ugyanahhoz az adaforráshoz. Ha lecseréljük az adaforrást, csak a BS DataSource és DataMember tulajdonságát kell lecserélni. A BS-ből is megtudhatjuk az aktuális elemet. J.Zs.Cs.: Vizuális programozás (c) 2014

113 J.Zs.Cs.: Vizuális programozás (c) 2014
BindingSource Metódusok és tulajdonságok az adatmódosításhoz Sort, Filter, MoveNext, MoveLast, Remove Események az adatforrásban történő változásokhoz J.Zs.Cs.: Vizuális programozás (c) 2014

114 J.Zs.Cs.: Vizuális programozás (c) 2014

115 Adatbázis kezelés programozása vizuális eszközökkel
Visual Studio .NET Professional 2008

116 Egyszerű kötés a DataBindings tulajdonsággal
J.Zs.Cs.: Vizuális programozás (c) 2014

117 DataSource és DisplayMember
J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

118 Access adatbázis elérése OLEDB-n keresztül
Minta adatbázis egy táblával Visual Studioban Data menü/Show Data Sources a Data Sources ablakban: Add … Data Source Configuration Wizard: Database,Next,New Connection J.Zs.Cs.: Vizuális programozás (c) 2014

119 Adatforrás típusának kiválasztása
J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

120 Új kapcsolat J.Zs.Cs.: Vizuális programozás (c) 2010

121 J.Zs.Cs.: Vizuális programozás (c) 2014
Add Connection J.Zs.Cs.: Vizuális programozás (c) 2014

122 J.Zs.Cs.: Vizuális programozás (c) 2014
Kapcsolat J.Zs.Cs.: Vizuális programozás (c) 2014

123 Adatbázisállomány másolása
Bemásolja az adatbázis-állományt a projekt könyvtárába Minden alkalommal, amikor a fejlesztőrendszerből indítjuk az alkalmazást az IDE bemásolja ezt az állományt az exe mellé, így ha futás közben adatot módosítunk, akkor az exe melletti példány módosul! J.Zs.Cs.: Vizuális programozás (c) 2014

124 Kapcsolatsztring konfigurációs fájlba mentése
J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

125 Mi kerüljön be a Dataset-be? Mi legyen a DataSet neve?
J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

126 J.Zs.Cs.: Vizuális programozás (c) 2014
Űrlap Project menü, Add Windows Form, frmBongeszo.cs Name: frmBöngésző Text=Adatok böngészése és módosítása Adatrácsot akarunk használni a megjelenítéshez A Data Sources ablakban kiválasztjuk a Munka táblát, majd a legördülő menüben DataGridView J.Zs.Cs.: Vizuális programozás (c) 2014

127 J.Zs.Cs.: Vizuális programozás (c) 2014
Űrlap Megfogjuk az egérrel a Munka táblát és áthúzzuk a formra (frmBöngésző) Az adatráccsal kitöltjük az ablak rendelkezésre álló területét (Dock in parent container) Új objektumok keletkeztek: ld. a kép alján dsMinta – DataSet letöltött adatok tárolására és kezelésére bsMunka – adatforrás a form számára taMunka – kommunikációt biztosít az alkalmazás és az adatbázis között bnMunka – navigálás az adatsorok között TAM – TableAdapterManager – kezeli az adatfrissítést/mentést, többtáblás esetben a sorrendet az idegenkulcs-elsődleges kulcs kapcsolatok figyelembe vételével (hierarchikus Update) J.Zs.Cs.: Vizuális programozás (c) 2014

128 Komponensek beállítása
J.Zs.Cs.: Vizuális programozás (c) 2014

129 J.Zs.Cs.: Vizuális programozás (c) 2014
Teendők Menü a főablakra Böngésző-módosító ablak megjelenítése Adatbázis helyének módosítása J.Zs.Cs.: Vizuális programozás (c) 2014

130 Program használata J.Zs.Cs.: Vizuális programozás (c) 2010

131 A mintaprogram: AccessOLEDB

132 Entity Framework

133 J.Zs.Cs.: Vizuális programozás (c) 2014
Entity Framework A relációs adatbázist objektum orientáltan tudjuk kezelni– ORM (Object Relation Mapping) MS fejleszti, alapból MS SQL adatbázisokkal működik csak (pl. Access-el se!). EF-t támogató providerek: Lekérdező nyelv a LINQ Ha lassú lenne a lekérdezés készíthetünk magunk beágyazott SQL-t Három lehetőségünk van: Database first A relációs adatbázis már létezik, ebből hozunk létre entitás osztályokat Model first Előbb létrehozzuk az entitás modellt, majd ebből generálunk adatbázist Code first C# osztályokat hozunk létre, ebből generáljuk a modellt Az EF egy ORM réteg, amit azzal a céllal fejlesztettek ki, hogy lecsökkentse az alkalmazáson belüli objektum alapú adatábrázolás /tárolás és az adatbázison belüli relációs adattárolás közötti különbséget. Lehetővé teszi, hogy objektumokkal és tulajdonságokkal dolgozzunk táblák helyett. J.Zs.Cs.: Vizuális programozás (c) 2014

134 J.Zs.Cs.: Vizuális programozás (c) 2014
Model First Az adatbázist az entitás modellből generáljuk Adatelérési réteg Külön projekt, melynek típusa osztálykönyvtár Az automatikusan keletkező Class1.cs-t töröljük belőle J.Zs.Cs.: Vizuális programozás (c) 2014

135 Entitás modell létrehozása
J.Zs.Cs.: Vizuális programozás (c) 2014

136 Entitás modell létrehozása
J.Zs.Cs.: Vizuális programozás (c) 2014

137 J.Zs.Cs.: Vizuális programozás (c) 2014
A modell elemei J.Zs.Cs.: Vizuális programozás (c) 2014

138 Kapcsolódás az adatbázishoz és SQL szkript generálása
Ha régebbi SQL Expressünk van vagy nem a minimumváltozatot telepítettük, akkor .\SQLEXPRESS néven érjük el. A célunk egy tantargyak nevű adatbázis létrehozása. J.Zs.Cs.: Vizuális programozás (c) 2014

139 Adatbázis létrehozása az SQL szkript segítségével
Feltételezzük, hogy a gépen az SQL Express 2012 legegyszerűbb változata a LocalDB van telepítve. Ez települ automatikusan a Visual Studio 2012-vel. J.Zs.Cs.: Vizuális programozás (c) 2014

140 Adatfelvitel entitásokkal
Konzol alkalmazás App.Config átmásolása az osztálykönyvtár projektjéből Szerelvények hivatkozása (References) System.Data.Entity Entity Framework Az előzőekben létrehozott osztálykönyvtár projektje Az alapból telepített Entity Framework 4.0-s, de az 5.0 szükséges, egyébként fordításkor hibaüzenet. J.Zs.Cs.: Vizuális programozás (c) 2014

141 J.Zs.Cs.: Vizuális programozás (c) 2014
Hibaüzenet J.Zs.Cs.: Vizuális programozás (c) 2014

142 J.Zs.Cs.: Vizuális programozás (c) 2014
Adatfelvitel contTantárgyak ct = new contTantárgyak(); var tf0=ct.Tantárgyfelelősök.Add( new Tantárgyfelelős { Vezetéknév = "Gipsz", Utónév = "Jakab", = EHAKód = "GJKM.FGRH", }); var tf1=ct.Tantárgyfelelősök.Add( { Vezetéknév = "Vendég", Utónév = "Oktató", = EHAKód = "VEOK.FGRH", ct.Tantárgyak.Add( new Tantárgy { Kód = "MIN1X2N", Kredit = 4, Tantárgynév = "Programozás", Tantárgyfelelős=tf1, }); new Tantárgy { Kód = "MIN5X1N", Kredit = 5, Tantárgynév = "Algoritmusok", Tantárgyfelelős = tf1, ct.SaveChanges(); J.Zs.Cs.: Vizuális programozás (c) 2014

143 J.Zs.Cs.: Vizuális programozás (c) 2014
Adathordozás SET IDENTITY_INSERT [dbo].[Tantárgyfelelősök] ON INSERT INTO [dbo].[Tantárgyfelelősök] ([Id], [Vezetéknév], [Utónév], [EHAKód], [ ]) VALUES (1, N'Vendég', N'Oktató', N'VEOK.FGRH', INSERT INTO [dbo].[Tantárgyfelelősök] ([Id], [Vezetéknév], [Utónév], [EHAKód], [ ]) VALUES (2, N'Gipsz', N'Jakab', N'GJKM.FGRH', SET IDENTITY_INSERT [dbo].[Tantárgyfelelősök] OFF Visual Studio segítségével. Az adatbázisban tárolt adatok átvitele másik gépre. J.Zs.Cs.: Vizuális programozás (c) 2014

144 J.Zs.Cs.: Vizuális programozás (c) 2014
Database first Az entitás modellt az adatbázis alapján generáljuk Northwind példaadatbázis letöltése J.Zs.Cs.: Vizuális programozás (c) 2014

145 Példaadatbázisok MS SQL-hez
Northwind, Pubs Northwind egy képzeletbeli vállalat, ami élelmiszerek forgalmazásával foglalkozik Innen letölthető: AdventureWorks AdventureWorksDB.msi J.Zs.Cs.: Vizuális programozás (c) 2014

146 J.Zs.Cs.: Vizuális programozás (c) 2014
Megnyitjuk az instnwnd.sql-t Futatjuk J.Zs.Cs.: Vizuális programozás (c) 2014

147 J.Zs.Cs.: Vizuális programozás (c) 2014
1. Create a empty database named Northwind 2. Open the instnwnd.sql in Management Studio 3. Delete the code up to the first instance of "set quoted_identifier on" (line 28) Insert at the end: ALTER DATABASE Northwind SET RECOVERY SIMPLE 4. Run the rest of the script J.Zs.Cs.: Vizuális programozás (c) 2014

148 J.Zs.Cs.: Vizuális programozás (c) 2014

149 Hogyan képződik le a relációs adatbázis OO-ra?
A teljes relációs adatbázist egy ObjectContext fogja reprezentálni Táblákból Entitás osztályok keletkeznek Oszlopokból pedig mezők és tulajdonságok SQL C# kód Adatbázis [Database] ObjectContext Tábla [Table] Entitás osztály Oszlopok [Column] Mezők, tulajdonságok J.Zs.Cs.: Vizuális programozás (c) 2014

150 J.Zs.Cs.: Vizuális programozás (c) 2014
Hogyan képzeljük el? Sorokból (rekordokból) lesznek az entitás objektumok Az ObjectContext entitás objektum halmazokat tartalmaz Az egyes műveleteket (új hozzáadása, törlés, módosítás) ezeken a halmazon hajtjuk vége J.Zs.Cs.: Vizuális programozás (c) 2014

151 Entity Framework létrehozása
Válasszuk ki az adatbázis kapcsolatot → Next Válasszuk ki azokat a táblákat, amiket használni szeretnénk Pluralize or singularize generated object names Egyes szám többes szám átalakítás J.Zs.Cs.: Vizuális programozás (c) 2014

152 J.Zs.Cs.: Vizuális programozás (c) 2014
Mi jött létre? #1 Legenerálta az ObjectContext-et és az entitásokat Itt a context osztályunk az ObjectContext-től örököl! Használat előtt Build-eljünk! J.Zs.Cs.: Vizuális programozás (c) 2014

153 Lekérdezés az adatbázisból
Northwind adatbázisból lekérdezzük a termékek nevét //példány az ObjectContext-ből NorthwindEntities ctx = new NorthwindEntities(); //csak a termékek nevei kellenek var ProductNames = from p in ctx.Products select p.ProductName; foreach (string product in ProductNames) { Console.WriteLine(product); } J.Zs.Cs.: Vizuális programozás (c) 2014

154 J.Zs.Cs.: Vizuális programozás (c) 2014
Új sor hozzáadása Egy termék hozzáadása Product p1 = new Product { ProductName = "Új termék", CategoryID = 1, SupplierID = 4 }; // Hozzáadjuk a DataContext-hez ctx.Products.AddObject(p1); // Ténylegesen ekkor kerül bele az adatbázisba ctx.SaveChanges(); Lehet használni a context AddToProducts() függvényét is J.Zs.Cs.: Vizuális programozás (c) 2014

155 J.Zs.Cs.: Vizuális programozás (c) 2014
Rekord módosítása Egy termék módosítása // Kikeressük az adatbázisból Product ModProduct = (from p in ctx.Products where p.ProductName == "Új termék" select p).Single(); // Megváltoztatjuk a nevét ModProduct.ProductName = "Módosított termék"; //változások mentése ctx.SaveChanges(); J.Zs.Cs.: Vizuális programozás (c) 2014

156 J.Zs.Cs.: Vizuális programozás (c) 2014
Sor törlése Egy termék törlése Product DelProduct = (from p in ctx.Products where p.ProductName == "Módosított termék" select p).Single(); // Törlés ctx.Products.DeleteObject(DelProduct); // Változások mentése ctx.SaveChanges(); J.Zs.Cs.: Vizuális programozás (c) 2014

157 J.Zs.Cs.: Vizuális programozás (c) 2014
A részletek … J.Zs.Cs.: Vizuális programozás (c) 2014

158 Az EF architekturális elemei
Entity Data Model (EDM) LINQ to Entities Entity Client Object Services J.Zs.Cs.: Vizuális programozás (c) 2014

159 J.Zs.Cs.: Vizuális programozás (c) 2014
Az EF architektúrája Object Services Entity Client EDM J.Zs.Cs.: Vizuális programozás (c) 2014

160 J.Zs.Cs.: Vizuális programozás (c) 2014
EDM Az entitások és a köztük levő kapcsolatok modellje Egy osztályhalmaz az alkalmazásban, ami egy adatbázis sémára lesz leképezve Három rétegű Conceptual Space Layer Conceptual-Storage Mapping Layer Logical (Storage) Layer (Space) J.Zs.Cs.: Vizuális programozás (c) 2014

161 Conceptual Space Layer
CSDL – Conceptual Space Definition Language XML, ami leírja az entitásokat és a köztük levő kapcsolatokat *.CSDL – az exe mellett a edmxResourcesToEmbed könyvtárban Lekérdezés Entity SQL-lel J.Zs.Cs.: Vizuális programozás (c) 2014

162 J.Zs.Cs.: Vizuális programozás (c) 2014
CSDL J.Zs.Cs.: Vizuális programozás (c) 2014

163 Conceptual-Storage Mapping Layer
Leírja a koncepcionális és a logikai réteg közötti leképezést MSL – Mapping Specification Language XML állomány *.MSL – az exe mellett a edmxResourcesToEmbed könyvtárban J.Zs.Cs.: Vizuális programozás (c) 2014

164 J.Zs.Cs.: Vizuális programozás (c) 2014
MSL J.Zs.Cs.: Vizuális programozás (c) 2014

165 Logical (Storage) Layer (Space)
Leírja az adatbázis által használt tárolási sémát Storage Schema Definition Language XML állomány *.SSDL – az exe mellett a edmxResourcesToEmbed könyvtárban J.Zs.Cs.: Vizuális programozás (c) 2014

166 J.Zs.Cs.: Vizuális programozás (c) 2014
SSDL J.Zs.Cs.: Vizuális programozás (c) 2014

167 J.Zs.Cs.: Vizuális programozás (c) 2014
EDM Nem kell feltétlenül olyan entitás modellt készíteni, amiben egy táblának egy osztály felel meg és fordítva Még a név se kell azonos legyen (loose coupling) Az osztályba felvehetünk további, pl. számított tulajdonságokat Az entitás modellt tartalmazó objektumot „object context”-nek nevezzük Az OC kommunikál a fizikai adatbázissal J.Zs.Cs.: Vizuális programozás (c) 2014

168 J.Zs.Cs.: Vizuális programozás (c) 2014
EDM Érdemes az adatelérési kódot (DAL) egy külön projektbe helyezni – osztálykönyvtár J.Zs.Cs.: Vizuális programozás (c) 2014

169 J.Zs.Cs.: Vizuális programozás (c) 2014
LINQ to Entites Szokásos LINQ lekérdezések, amiket az EF runtime engine lefordít SQL parancsokká J.Zs.Cs.: Vizuális programozás (c) 2014

170 J.Zs.Cs.: Vizuális programozás (c) 2014
Entity Client Átjáró az entitás szintű lekérdezésekhez Segítségével Entity SQL műveletek hajthatók végre az EDM által közzétett adatokon J.Zs.Cs.: Vizuális programozás (c) 2014

171 Entity Client DataReader példa
J.Zs.Cs.: Vizuális programozás (c) 2014

172 J.Zs.Cs.: Vizuális programozás (c) 2014
Entity SQL Adattárolás független lekérdező nyelv Nem erősen típusos Támogatja a CRUD műveletek végrehajtását Create Read Update Delete J.Zs.Cs.: Vizuális programozás (c) 2014

173 Entity SQL lekérdezés példa
J.Zs.Cs.: Vizuális programozás (c) 2014

174 Lazy Loading (késleltetett betöltés)
A LINQ alapból a “deferred execution”-t használja A legtöbbször a lekérdezés definiálásakor az nem fut le ténylegesen // define query var query = from c in ctx.Customers where c.Region == "OR" orderby c.CompanyName select c; // execute query dgvQuery.DataSource = query; A lekérdezés csak akkor kerül futtatásra, amikor az eredményre szükség van: Adatkötéskor Foreach ciklusban az adatokon történő végigiteráláshoz Gyűjteménnyé alakításkor, pl. ToList(), ToArray() Egy objektum lekérdezésekor (aggregáláskor, vagy pl. First(), Last()) J.Zs.Cs.: Vizuális programozás (c) 2014

175 J.Zs.Cs.: Vizuális programozás (c) 2014
Változás követés Az ObjectContext automatikusan követi a változásokat az ObjectStateManager objektuma segítségével Lekérdezéskor becache-eli az eredeti értékeket Mentéskor (SaveChanges()) automatikusan létrehozza az update/insert/delete SQL parancsokat Változás követés kikapcsolása (csak olvasás esetén): context.Products.MergeOption = MergeOption.NoTracking; J.Zs.Cs.: Vizuális programozás (c) 2014

176 Objektumorientált sajátosságok leképezése
ProductBase TestProduct Product DiscontinuedProduct Öröklődés példák Table per Hierarchy Egyetlen tábla Table per Type Öröklődésenként egy tábla Splitting Több tábla egy entitásba Egy tábla több entitásba Sok-sok kapcsolat Két oszlopos kapcsolótábla Employee Territory * J.Zs.Cs.: Vizuális programozás (c) 2014

177 Table-Per-Hierarchy összerendelés
Entitások közti sima öröklődés - egy adatbázis tábla Az összerendelés a discriminator column alapján történik valamilyen feltétel mentén A származtatott típusok lekérdezhetőek where feltétel nélkül az OfType() metódussal: from c in db.Products.OfType<DiscontinuedProduct>() Limitáció: nehéz a diszkriminátor oszlopot módosítani EF-el – adatbázis megoldás segít (trigger / sp) Base Type Discriminator Column Database Table Entities Product DiscontinuedFlag Product DiscontinuedProduct J.Zs.Cs.: Vizuális programozás (c) 2014 Derived Type

178 Table-Per-Type összerendelés
A modellben lényegében az asszociációt cseréljük öröklődésre Kiküszöböli a navigációs tulajdonságok használatának szükségességét a bejárásra A származtatott típusok szintén hozzáférhetőek az OfType() metódus használatával Limitáció: gyermeket nem lehet törölni anélkül, hogy a szülőt is törölnénk J.Zs.Cs.: Vizuális programozás (c) 2014

179 Feldarabolás (Splitting)
Entity Splitting Table Splitting J.Zs.Cs.: Vizuális programozás (c) 2014

180 Többrétegű alkalmazás létrehozása
Entity Framework használata többrétegű alkalmazásban Többrétegű alkalmazás létrehozása J.Zs.Cs.: Vizuális programozás (c) 2014

181 Többrétegű alkalmazás
Megjelenítési réteg WF, ASP.NET, WPF, Silverlight,… Üzleti logikai réteg Feladat specifikus megoldások Adatelérési réteg Kommunikáció az adatbázissal Közvetlen kapcsolat, DataSet, Linq to SQL, Entity Framework, J.Zs.Cs.: Vizuális programozás (c) 2014

182 EF használata többrétegű alkalmazásban
Kell a connectionString abba a project-be, ahol használjuk a DAL-t Ezen felül kell a System.Data.Entity dll is Van más megoldás is POCO osztályokat kell létrehozni kézzel és egy saját osztályt, ami azObjectContext-től örököl Így már nem kell a System.Data.Entity dll sem a connectionString J.Zs.Cs.: Vizuális programozás (c) 2014

183 J.Zs.Cs.: Vizuális programozás (c) 2014
További ORM eszközök Hibernate (Java) NHibernate (.NET) Enterprise Objects Framework (Mac OS) J.Zs.Cs.: Vizuális programozás (c) 2014

184 J.Zs.Cs.: Vizuális programozás (c) 2014
XML eXtensible Markup Language World Wide Web Consortium (W3C) Első: XML február 10. Legfrissebb: XML szeptember 29. Célok egységes, platform-független adatkezelés hatékony használhatóság az Interneten mindenhol olvasható legyen  szöveges rugalmas, tetszőleges szerkezet leírható vele SGML kompatibilis (Standard Generalized Markup Language [ISO 8879]) könnyen lehessen programozni XML feldolgozót J.Zs.Cs.: Vizuális programozás (c) 2014

185 Célok2 Gyorsan tervezhető a struktúrája
A tömörségnél fontosabb az olvashatóság Együtt ábrázol- ják az adatokat és a szerkeze- tüket (önleíró struktúra) J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

186 J.Zs.Cs.: Vizuális programozás (c) 2014
Formátum1 Szemi strukturált szerkezet – viszonylag laza A jelölő elemek neve szabadon választható – elsődleges cél a tartalom kijelölése Különálló vagy egybeolvadt lezáró elem mindig kell legyen. pl. <br/> A tagok nem keresztezhetik egymást Kell legyen egy szülő elem – lezáró elem pár, ami magában foglalja az összes többit  fa reprezentáció Az elemek rendelkezhetnek név="érték" típusú attribútumokkal J.Zs.Cs.: Vizuális programozás (c) 2014

187 J.Zs.Cs.: Vizuális programozás (c) 2014
Formátum2 Speciális karakterek szimbólumokkal (&szimbólumnév;) vagy kóddal (&#kód;) adhatók meg pl. a < jelentése: < Kis és nagybetű érzékeny Tetszőleges szöveg elhelyezhető egy elemben pl. <! [CDATA [szöveg] ]> Helyes: ha szintaktikailag jó Érvényes: ha megfelel egy sémaleírásnak J.Zs.Cs.: Vizuális programozás (c) 2014

188 J.Zs.Cs.: Vizuális programozás (c) 2014
Szerkezet Bevezető rész Kötelező: XML változat, nyelvkészlet <?xml version "1.0" encoding="UTF-8"?> <?xml version "1.0" encoding="ISO "?> Feldolgozónak szóló direktíva <?xml-stylesheet type="text/xsl" href="…"?> Struktúraleírás Dokumentum elem struktúrájának, sémájának leírása Dokumentum elem leírás: szerkezet+tartalom Záró rész Feldolgozónak szóló direktíva Megjegyzés <!-- megjegyzés --> J.Zs.Cs.: Vizuális programozás (c) 2014

189 Dokumentumot leíró fa hierarchia
Elem – normál tag Gyökér Attribútum Szöveg J.Zs.Cs.: Vizuális programozás (c) 2014

190 Adatok attribútumként és XML elemek között
<?XML version="1.0" encoding="UTF-8" ?> <adatbazis> <konyv azn="531"> <cim>A programozás örömei</cim> <szerzo>Lélek Búvár</szerzo> </konyv> <konyv azn="532"> <cim>Szoftverprojektek</cim> <szerzo>Fejlesztő Ernő</szerzo> </adatbazis> J.Zs.Cs.: Vizuális programozás (c) 2014

191 J.Zs.Cs.: Vizuális programozás (c) 2014
Névterek1 Mivel az elemek neve szabadon választható, ezért könnyen előfordulhat a névütközés Megoldás: a nevek csak névtereken belül érvényesek A megoldás helye szerint a névtér lehet: Globális: a gyökér elemben adjuk meg Részfa: egy nem-gyökér elemben adjuk meg Az azonosítás szerint a névtér lehet: Default (alapértelmezett): a névtér nem rendelkezik azonosítóval, így a definíciót tartalmazó elemben és az alatta levő részfában érvényesül ott, ahol az elem neve előtt nem adunk meg névtér azonosítót Álnévvel (azonosítóval) rendelkező: <x xmlns:azonosító="…">…</azonosító:x> Ott érvényesül, ahol az elem neve előtt megadjuk <azonosító:y>…</azonosító:y> J.Zs.Cs.: Vizuális programozás (c) 2014

192 J.Zs.Cs.: Vizuális programozás (c) 2014
Névterek2 A névtér "=" jel utáni, idézőjelben levő része konvencionálisan egy URI Ez nem feltétlenül valódi URL Egy elemen belül default és álnevestípusú névteret is megadhatunk Forrás: J.Zs.Cs.: Vizuális programozás (c) 2014

193 Példa alapértelmezett névtérre
<?XML version="1.0" encoding="UTF-8" ?> <adatbazis xmlns=" <konyv azn="530"> <cim>A programozás örömei</cim> <author>Lélek Búvár</author> </konyv > <konyv azn="531"> <cim>Szoftverprojektek</cim> <author>Fejlesztő Ernő</author> </konyv> </adatbazis> J.Zs.Cs.: Vizuális programozás (c) 2014

194 Péda az álnévvel rendelkező névtérre
<?XML version="1.0" encoding="UTF-8" ?> <adatbazis xmlns=" xmlns:pz=" <cim>A programozás örömei</cim> <author>Lélek Búvár</author> <pz:ar>1500</pz:ar> </konyv > <konyv azn="531"> <cim>Szoftverprojektek</cim> <author>Fejlesztő Ernő</author> </konyv> </adatbazis> J.Zs.Cs.: Vizuális programozás (c) 2014

195 Névtérhasználat J.Zs.Cs.: Vizuális programozás (c) 2010

196 J.Zs.Cs.: Vizuális programozás (c) 2014
Sémaleírás Miért? A feldolgozó csak megadott szerkezetű állományt tud feldolgozni Jó lenne, ha már a feldolgozás előtt kiderülne, ha hibás az állomány Megoldás: séma ellenőrzés pl. validátor programokkal, amelyek megmondják, hogy illeszkedik-e a dokumentum szerkezete a megadott sémalíráshoz Sémaleírás Document Type Declaration (DTD) XML Schema J.Zs.Cs.: Vizuális programozás (c) 2014

197 Sémaleírás – hátrányos tulajdonságok
DTD: nem támogatja az adatintegritási szabályok definiálását és az adat validálást XML Schema bonyolult J.Zs.Cs.: Vizuális programozás (c) 2014

198 J.Zs.Cs.: Vizuális programozás (c) 2014
XML Schema Cél: XML dokumentumok tartalmának és szerkezetének definiálása és validálása Több változata van: W3C, MS. A névtérből derül ki, hogy melyikről van szó. xmlns:xs=" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" <URN> ::= "urn:" <NID> ":" <NSS> (Namespace Identifier, Namespace Specific String) A Visual Studio által generált megfelel a W3C ajánlásnak Legtöbbször egy külön XML állomány XML Schema definition language (XSD) Gyökér elem a Schema Definiálni lehet: elem típusokat, attribútum típusokat, elemeket, attribútumokat J.Zs.Cs.: Vizuális programozás (c) 2014

199 XML séma állományok és adatbáziskezelés
Definiálják és validálják az XML stream-ből vagy dokumentumokból a DataSet-be importált adatokat Az XML Designer-ben létrehozhatjuk vagy szerkeszthetjük a táblastruktúrát és táblák közötti kapcsolatokat hozhatunk létre Típusos adathalmazokban az xsd fájlok hozzák létre a relációs struktúrát, kulcsokat, kapcsolatokat, egyéb integritási feltételeket Ezt használják fel a DataSet osztály létrehozásakor Project menü, Add New Item …, Categories: Visual C# Items/Data, Templates: DataSet J.Zs.Cs.: Vizuális programozás (c) 2014

200 Adatbázis séma létrehozása a kliensen
XML Schema (.xsd) állományok biztosítják az adatintegritást a kliensen XML Designer az XML Schema állományok létrehozására és módosítására Séma terv elkészítése Project menü, Add New Item DataSet Séma létrehozása J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

201 Lokális adatbázis megvalósítása XML-lel
Séma létrehozása: DataSet Adatkapcsolt vezérlő a formra Adatkötések beállítása XML adatállomány betöltése Módosított/új adatok lementése J.Zs.Cs.: Vizuális programozás (c) 2014 Demo: XML_Cikkek_Alap

202 Demo: XML_Szerzok_Cikkek
J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014

203 J.Zs.Cs.: Vizuális programozás (c) 2014
LINQ to XML XML dokumentum létrehozása, módosítása, beolvasása System.Xml.Linq névtér XDocument XElement XAttribute XComment XName, XNamespace Sorolja fel a LINQ to XML témakörben tanult XML-hez kapcsolódó hat osztályt. Mindegyik feladatát írja le egy-egy mondatban. J.Zs.Cs.: Vizuális programozás (c) 2014

204 XML dokumentum előállítása a memóriában
J.Zs.Cs.: Vizuális programozás (c) 2014

205 Beolvasás, mentés és kiírás a konzolra
J.Zs.Cs.: Vizuális programozás (c) 2014

206 XML dokumentum előállítása gyűjtemény lekérdezésével
Melyik az a két tanult módszer, aminek a segítségével XML dokumentum állítható elő a memóriában (a lemezről történő betöltés nem tartozik ide)? J.Zs.Cs.: Vizuális programozás (c) 2014

207 XML dokumentum lekérdezése
J.Zs.Cs.: Vizuális programozás (c) 2014

208 Ismétlés Egyéni feldolgozásra

209 J.Zs.Cs.: Vizuális programozás (c) 2014
Sorosítás Cél: a memóriában tárolt adatok egyszerű lemezre mentése és visszatöltése Mentés Létrehozunk egy állományt és egy sorosítást kezelő objektumot Ez gondoskodik arról, hogy az általunk kiválasztott objektumban tárolt adatok az állományba kerüljenek sorban egymás után Láncolt lista és körkörös hivatkozások kezelésére is képes Helyreállítás (Beolvasás) Megnyitjuk a korábban lementett adatokat tartalmazó állományt Létrehozunk egy sorosítást kezelő objektumot Ez gondoskodik a lementett adatok visszatöltéséről Ha a mentés óta megváltoztattuk az adatok típusát megadó osztályt, akkor a visszatöltés nem lehetséges J.Zs.Cs.: Vizuális programozás (c) 2014

210 J.Zs.Cs.: Vizuális programozás (c) 2014
Megoldások Bináris SOAP-XML XML J.Zs.Cs.: Vizuális programozás (c) 2014

211 Bináris sorosítás és helyreállítás
Szükséges névterek using System.IO; using System.Collection; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; Attribútumok Sorosításra kijelölés osztály neve előtt: [Serializable] Sorosítani nem kívánt részek (adattagok, tulajdonságok) előtt: [NonSerialized] J.Zs.Cs.: Vizuális programozás (c) 2014

212 J.Zs.Cs.: Vizuális programozás (c) 2014
Mentés Stream st=File.Create("fájlnév"); BinaryFormatter bf=new BinaryFormatter(); bf.Serialize(st,objektum); //ezt az objektumot akarjuk sorosítani st.Close(); J.Zs.Cs.: Vizuális programozás (c) 2014

213 J.Zs.Cs.: Vizuális programozás (c) 2014
Helyreállítás Stream st=File.OpenRead("fájlnév"); BinaryFormatter bf=new BinaryFormatter(); Osztály_Név objektum=(Osztály_Név)bf.Deserialize(st); st.Close(); J.Zs.Cs.: Vizuális programozás (c) 2014

214 SOAP-XML sorosítás és helyreállítás
Szükséges névterek: using System.IO; using System.Collections; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Soap; A SOAP-ot fel kell venni a hivatkozások közé. J.Zs.Cs.: Vizuális programozás (c) 2014

215 SOAP-XML sorosítás és helyreállítás
Szükséges attribútumok: Sorosításra kijelölés osztály neve előtt: [Serializable] Sorosítani nem kívánt részek (adattagok, tulajdonságok) előtt: [NonSerialized] Mentés Stream st=File.Create("fájlnév"); SoapFormatter sf=new SoapFormatter(); sf.Serialize(st,objektum); //ezt az objektumot akarjuk sorosítani st.Close(); J.Zs.Cs.: Vizuális programozás (c) 2014

216 SOAP-XML sorosítás és helyreállítás
Betöltés Stream st=File.OpenRead("fájlnév"); SoapFormatter sf=new SoapFormatter(); Osztály_Név objektum=(Osztály_Név)sf.Deserialize(st); st.Close(); J.Zs.Cs.: Vizuális programozás (c) 2014

217 XML sorosítás és helyreállítás
Nem tudja lementeni a korlátozott hozzáférésű tagokat és a két- vagy többdimenziós tömböket Pl. string tömböt se vagy ArrayList-et Csak set elérővel is rendelkező tulajdonságot ment le Szükséges névtér using System.Xml.Serialization; Attribútum Ha valamely adattagok vagy tulajdonságot nem akarunk sorosítani, akkor a definíciója elé írjuk: [XmlIgnore] J.Zs.Cs.: Vizuális programozás (c) 2014

218 Mentés és helyreállítás
Stream st=File.Create("fájlnév.xml"); XmlSerializer xs=new XmlSerializer(typeof(Osztály_Név)); xs.Serialize(st,objektum); // Az objektum típusa Osztály_Név st.Close(); Betöltés Stream st=File.OpenRead("fájlnév.xml"); objektum=(Osztály_Név)xs.Deserialize(st); J.Zs.Cs.: Vizuális programozás (c) 2014

219 Paraméterek átadása az SQL parancs számára MS SQL Server1
Egyénileg áttanulmányozandó anyagrész SelectCommand, Parameters Paraméter hozzáadása Lekérdezés átalakítása J.Zs.Cs.: Vizuális programozás (c) 2014

220 Paraméterek átadása az SQL parancs számára MS SQL Server2
Egyénileg áttanulmányozandó anyagrész Szűrési minta bekérése szövegmezőben Szűrés nyomógomb lenyomására private void btFeltölt_Click(object sender, System.EventArgs e) { dataSet11.Clear(); .Value=tbKulcs.Text; sqlDataAdapter1.Fill(dataSet11.lista); } J.Zs.Cs.: Vizuális programozás (c) 2014

221 Az adatforrás adatainak frissítése MS SQL Server esetén1
Egyénileg áttanulmányozandó anyagrész A xxxDataAdapter objektum létrehozásakor automatikusan generálódott egy Update, Insert és Delete SQL parancs UPDATE lista SET EHA Név WHERE (EHA AND (Név OR @Original_Név IS NULL AND Név IS NULL) AND ( = @Original_ IS NULL AND IS NULL); SELECT * FROM lista WHERE(EHA INSERT INTO lista(EHA, Név, ) @ ); SELECT EHA, Név, FROM lista WHERE (EHA DELETE FROM lista WHERE (EHA AND (Név = @Original_Név IS NULL AND Név IS NULL) AND ( IS NULL AND IS NULL) J.Zs.Cs.: Vizuális programozás (c) 2014

222 Az adatforrás adatainak frissítése MS SQL Server esetén2
Egyénileg áttanulmányozandó anyagrész Meghívjuk a DataAdapter objektum Update metódusát Ez meghatározza az adatforráshoz képest bekövetkezett módosításokat, és végrehajtja a megfelelő SQL parancsot (Insert, Update vagy Delete) J.Zs.Cs.: Vizuális programozás (c) 2014

223 Az adatbázis adatainak frissítése
Egyénileg áttanulmányozandó anyagrész Paraméterek és SQL parancs megadása programból SqlCommand insertTitlesCommand = new SqlCommand ("Insert titles (title_id, title, type) values insertTitlesCommand.Parameters.Add SqlDbType.VarChar, 6, "title_id"); SqlDbType.VarChar, 80, "title"); SqlDbType.Char, 12, "type"); titlesSQLDataAdapter.InsertCommand = insertTitlesCommand; titlesSQLDataAdapter.Update(pubsDataSet, "titles"); J.Zs.Cs.: Vizuális programozás (c) 2014


Letölteni ppt "Vizuális programozás Adatbázisok elérése."

Hasonló előadás


Google Hirdetések