Vizuális programozás Adatbázisok elérése
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
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
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
Microsoft/Windows Data Access Components (MDAC/WDAC) J.Zs.Cs.: Vizuális programozás (c) 2014 Kép forrása: http://msdn.microsoft.com/en-us/library/ms810810.aspx
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
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
J.Zs.Cs.: Vizuális programozás (c) 2014 ADO.NET J.Zs.Cs.: Vizuális programozás (c) 2014 Ábra forrása: http://swechhaindia.wordpress.com/author/swechhaindia/page/3/
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
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
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
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
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
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
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
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
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 http://www.connectionstrings.com J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
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 http://msdn.microsoft.com/en-us/library/bb384426%28v=vs.100%29.aspx J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
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
J.Zs.Cs.: Vizuális programozás (c) 2014
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
J.Zs.Cs.: Vizuális programozás (c) 2014
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
Kapcsolat alapú lekérdezés példa J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
Kapcsolat nélküli adatbeolvasás példa - típus nélküli DataSet J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
Kapcsolat létrehozása vizuális eszközökkel J.Zs.Cs.: Vizuális programozás (c) 2014
Adatlista a kapcsolat felhasználásával J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
DataSet-ben tárolt adatok módosítása3 Törlés J.Zs.Cs.: Vizuális programozás (c) 2014
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
Language INtegrated Query LINQ Language INtegrated Query J.Zs.Cs.: Vizuális programozás (c) 2014
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
J.Zs.Cs.: Vizuális programozás (c) 2014 LINQ to Objects J.Zs.Cs.: Vizuális programozás (c) 2014
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
J.Zs.Cs.: Vizuális programozás (c) 2014 Megoldás Átalakítás J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
Névtelen típus előállítása projekcióval J.Zs.Cs.: Vizuális programozás (c) 2014
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
J.Zs.Cs.: Vizuális programozás (c) 2014 Demo Szótár Számok J.Zs.Cs.: Vizuális programozás (c) 2014
Szökőévek keresése – hagyományos megoldás J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
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
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
LINQ to DataSets
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
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
Aggregate és lambda kifejezés J.Zs.Cs.: Vizuális programozás (c) 2014
Any és lambda kifejezés J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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: http://www.wpftutorial.net/dependencyproperties.html WPF Control Hierachia: http://soumya.wordpress.com/2010/01/10/wpf-simplified-part-10-wpf-framework-class-hierarchy/
J.Zs.Cs.: Vizuális programozás (c) 2012 Dependency Property J.Zs.Cs.: Vizuális programozás (c) 2012
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
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)
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)
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)
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);
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>
Value Resolution Strategy http://www.wpftutorial.net/dependencyproperties.html 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
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
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
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
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
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
Element to Element Binding J.Zs.Cs.: Vizuális programozás (c) 2014
Kötés statikus erőforráshoz J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014 Az adatszerkezet J.Zs.Cs.: Vizuális programozás (c) 2014
Statikus erőforrás definiálása J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014 Adatkötés J.Zs.Cs.: Vizuális programozás (c) 2014
Kötés futási időben létrehozott objektumhoz J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014 Felület J.Zs.Cs.: Vizuális programozás (c) 2014
Lista létrehozása és adatforrás megadása J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014 Lépegetés megoldása J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
Adatkötés Windows Forms alkalmazásokban
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
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
Példa egyszerű adatkötésre J.Zs.Cs.: Vizuális programozás (c) 2014
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
Példa komplex adatkötésre1 J.Zs.Cs.: Vizuális programozás (c) 2014
Példa komplex adatkötésre2 J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
Példa J.Zs.Cs.: Vizuális programozás (c) 2010
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
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
J.Zs.Cs.: Vizuális programozás (c) 2014
Adatbázis kezelés programozása vizuális eszközökkel Visual Studio .NET Professional 2008
Egyszerű kötés a DataBindings tulajdonsággal J.Zs.Cs.: Vizuális programozás (c) 2014
DataSource és DisplayMember J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
Új kapcsolat J.Zs.Cs.: Vizuális programozás (c) 2010
J.Zs.Cs.: Vizuális programozás (c) 2014 Add Connection J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014 Kapcsolat J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
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
Komponensek beállítása J.Zs.Cs.: Vizuális programozás (c) 2014
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
Program használata J.Zs.Cs.: Vizuális programozás (c) 2010
A mintaprogram: AccessOLEDB
Entity Framework
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: http://www.sqlsummit.com/EFProv.htm http://msdn.microsoft.com/en-us/data/dd363565.aspx 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
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
Entitás modell létrehozása J.Zs.Cs.: Vizuális programozás (c) 2014
Entitás modell létrehozása J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014 A modell elemei J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
J.Zs.Cs.: Vizuális programozás (c) 2014 Hibaüzenet J.Zs.Cs.: Vizuális programozás (c) 2014
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", email = "gipsz.j@net.hu", EHAKód = "GJKM.FGRH", }); var tf1=ct.Tantárgyfelelősök.Add( { Vezetéknév = "Vendég", Utónév = "Oktató", email = "vendeg.o@net.hu", 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
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], [email]) VALUES (1, N'Vendég', N'Oktató', N'VEOK.FGRH', N'vendeg.o@net.hu') INSERT INTO [dbo].[Tantárgyfelelősök] ([Id], [Vezetéknév], [Utónév], [EHAKód], [email]) VALUES (2, N'Gipsz', N'Jakab', N'GJKM.FGRH', N'gipsz.j@net.hu') 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
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 http://devportal.hu/Fajlok/Download.ashx?shareid=1&path=Akademia%5cinstnwnd.sql J.Zs.Cs.: Vizuális programozás (c) 2014
Példaadatbázisok MS SQL-hez Northwind, Pubs Northwind egy képzeletbeli vállalat, ami élelmiszerek forgalmazásával foglalkozik Innen letölthető: http://www.microsoft.com/download/en/details.aspx?id=23654 AdventureWorks http://msftdbprodsamples.codeplex.com/releases/view/4004 AdventureWorksDB.msi J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014 Megnyitjuk az instnwnd.sql-t Futatjuk J.Zs.Cs.: Vizuális programozás (c) 2014
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
J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
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
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
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
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
J.Zs.Cs.: Vizuális programozás (c) 2014 A részletek … J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
J.Zs.Cs.: Vizuális programozás (c) 2014 CSDL J.Zs.Cs.: Vizuális programozás (c) 2014
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
J.Zs.Cs.: Vizuális programozás (c) 2014 MSL J.Zs.Cs.: Vizuális programozás (c) 2014
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
J.Zs.Cs.: Vizuális programozás (c) 2014 SSDL J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
Entity Client DataReader példa J.Zs.Cs.: Vizuális programozás (c) 2014
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
Entity SQL lekérdezés példa J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
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
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
Feldarabolás (Splitting) Entity Splitting Table Splitting J.Zs.Cs.: Vizuális programozás (c) 2014
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
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
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
J.Zs.Cs.: Vizuális programozás (c) 2014 További ORM eszközök Hibernate (Java) NHibernate (.NET) Enterprise Objects Framework (Mac OS) … http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#.NET J.Zs.Cs.: Vizuális programozás (c) 2014
J.Zs.Cs.: Vizuális programozás (c) 2014 XML eXtensible Markup Language World Wide Web Consortium (W3C) Első: XML 1.0 1998. február 10. Legfrissebb: XML 1.1 2006. szeptember 29. http://www.w3.org/TR/xml11/ 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
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
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
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
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-8859-2"?> 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
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
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
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
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:http://en.wikipedia.org/wiki/URI J.Zs.Cs.: Vizuális programozás (c) 2014
Példa alapértelmezett névtérre <?XML version="1.0" encoding="UTF-8" ?> <adatbazis xmlns="http://valami.valahol.org"> <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
Péda az álnévvel rendelkező névtérre <?XML version="1.0" encoding="UTF-8" ?> <adatbazis xmlns="http://valami.valahol.org" xmlns:pz="http://penzugy"> <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
Névtérhasználat J.Zs.Cs.: Vizuális programozás (c) 2010
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
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
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="http://www.w3.org/2001/XMLSchema" 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
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
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
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
Demo: XML_Szerzok_Cikkek J.Zs.Cs.: Vizuális programozás (c) 2010 J.Zs.Cs.: Vizuális programozás (c) 2014
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
XML dokumentum előállítása a memóriában J.Zs.Cs.: Vizuális programozás (c) 2014
Beolvasás, mentés és kiírás a konzolra J.Zs.Cs.: Vizuális programozás (c) 2014
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
XML dokumentum lekérdezése J.Zs.Cs.: Vizuális programozás (c) 2014
Ismétlés Egyéni feldolgozásra
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
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
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
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
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
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
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
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
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
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
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
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(); sqlDataAdapter1.SelectCommand.Parameters["@EHA"] .Value=tbKulcs.Text; sqlDataAdapter1.Fill(dataSet11.lista); } J.Zs.Cs.: Vizuális programozás (c) 2014
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 = @EHA, Név = @Név, email = @email WHERE (EHA = @Original_EHA) AND (Név = @Original_Név OR @Original_Név IS NULL AND Név IS NULL) AND (email = @Original_email OR @Original_email IS NULL AND email IS NULL); SELECT * FROM lista WHERE(EHA = @EHA) INSERT INTO lista(EHA, Név, email) VALUES (@EHA, @Név, @email); SELECT EHA, Név, email FROM lista WHERE (EHA = @EHA) DELETE FROM lista WHERE (EHA = @Original_EHA) AND (Név = @Original_Név OR @Original_Név IS NULL AND Név IS NULL) AND (email = @Original_email OR @Original_email IS NULL AND email IS NULL) J.Zs.Cs.: Vizuális programozás (c) 2014
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
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 (@title_id,@title,@type)"); insertTitlesCommand.Parameters.Add ("@title_id", SqlDbType.VarChar, 6, "title_id"); ("@title", SqlDbType.VarChar, 80, "title"); ("@type", SqlDbType.Char, 12, "type"); titlesSQLDataAdapter.InsertCommand = insertTitlesCommand; titlesSQLDataAdapter.Update(pubsDataSet, "titles"); J.Zs.Cs.: Vizuális programozás (c) 2014