vizuális programozás
DESCRIPTION
Vizuális programozás. Adatbázisok elérése. Adatbázisok elérése 1. Közvetlen elérés - minden adatbázismotorhoz külön függvénygyűjtemény Absztrakciós rétegen keresztül - PowerPoint PPT PresentationTRANSCRIPT
Vizuális programozás
Adatbázisok elérése
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 dolgozikDr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
2
ODBC
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
3
AlkalmazásMetódushívás
OD
BC
réte
g
Oracle
MS SQL
MySQL
Oracle Driver
MS SQL Driver
mySQL Driver
… Driver
OLE-DB
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
4
Alkalmazás
OLE-DB Consumer
OLE-DB Provider
AdatforrásAdatforrás
specifikus API
MS Eszközök
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
Entity Framework – ORM réteg, .NET 3.5-től
LINQ – beágyazott SQL C# 3.0-tól a Cω-ból átvéve
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
5
Entity Framework
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entity Framework
A relációs adatbázist objektum orientáltan tudjuk kezelni– ORM (Object Relation Mapping)
LINQ támogatás Hogyan kezdjünk hozzá?
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
Database first – a relációs adatbázis már létezik, ebből hozunk létre entitás osztályokat
7
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Model First
Készítünk egy külön osztálykönyvtár projektet az entitás modell és az adatelérési réteg számára (nem kötelező)
Entitás modell létrehozása Adatbázis generálása az entitás
modellből
8
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entitás modell fölvétele a projektbe9
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatmodell létrehozása10
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Üres modell létrehozása11
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Tároló átnevezéseEntitás és entitás halmaz
12
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entitások és tulajdonságok13
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entitások összekapcsolása 14
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
A modell elemei15
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatbázis létrehozása16
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatbázis állomány17
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
18
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Kapcsolati sztring + App.Config19
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Kapcsolódás az adatbázishoz és SQL szkript generálása
20
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatbázis létrehozása az SQL szkript segítségével
21
Hiba:
Megoldás
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Ellenőrzés22
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatfelvitel entitásokkal
Konzol alkalmazás App.Config átmásolása az
osztálykönyvtár projektjéből Szerelvények hivatkozása (References)
Entity Framework Az előzőekben létrehozott osztálykönyvtár
projektje
23
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entity Framework szerelvények projekthez rendelése
24
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adat-felvitel
25
Mi hiányzik a kódból?
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
26
Megoldás a Main Metódusban:var DataDir =
Directory.GetParent(Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName) +"\\DAL_Tantargyak";
AppDomain.CurrentDomain.SetData("DataDirectory", DataDir);
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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'[email protected]')
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'[email protected]')
SET IDENTITY_INSERT [dbo].[Tantárgyfelelősök] OFF
27
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Database first
Az entitás modellt az adatbázis alapján generáljuk
Northwind példaadatbázis letöltése
https://northwinddatabase.codeplex.com/
28
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Northwind – adatbázis állomány létrehozása29
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatbázis létrehozása szkriptből
1. Nyissuk meg az instnwnd.sql-t Visual Studio-ban
2. Töröljük ki a "set quoted_identifier on" első előfordulásásig (28. sor)
3. A use " Northwind " helyére use [teljes_elérési_út\northwind.mdf]
4. Futtassuk a szkriptet
30
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entity modell generálása31
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Kapcsolati sztring32
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entity modell33
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Code First
Létrehozzuk az adatbázis állományt az EXE könyvtárában
34
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Az App.Config-hoz hozzáadjuk a kapcsolati sztringet
<?xml version="1.0" encoding="utf-8"?>
<configuration>
…
<connectionStrings>
<add name="csCikkadatok"
connectionString="Data Source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\
cikkadatok.mdf;Integrated Security=true"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
35
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Osztályok megtervezése
Id adattag kötelező
Navigációs tulajdonságok
1: skalár
*: gyűjtemény
Konstruktor
Gyűjtemény típusú navigációs objektumok létrehozása
36
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Konténer és entitás osztályok37
Kapcsolati sztring
Konténer/tároló
Entitás halmazok
Entitás típus
Entitás típus
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatfelvitel
Entitás objektumok létrehozása
Navigációs kapcsolatok felépítése
Entitás objektumok felvétele az entitás halmazokba
Módosítások mentése
38
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Ellenőrzés39
Leképezés
Relációs C# kód
Adatbázis
Tábla
Oszlopok
DbContext
Entitás osztály
Adattagok, tulajdonságok
[Database]
[Table]
[Column]
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Lekérdezés41
LINQ lekérdezés és lambda kifejezés használatával
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
További források
Entity Framework Tutorial
http://www.entityframeworktutorial.net/
Bátyai Krisztián EF linkgyűjteménye
http://goo.gl/Pk1MT
Reiter István: Code First bevezető
http://goo.gl/XT6DSE
MVA: Implementing Entity Framework with MVC
http://goo.gl/TtTXvv
42
EF könyvek
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
44
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
ADO.NET45
Ábra forrása: http://swechhaindia.wordpress.com/author/swechhaindia/page/3/
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
46
Kapcsolat alapú adatelérés
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
47
Connection
Command DataReader
Command
•Select •Tárolt eljárás
•Insert•Update•Delete •Stored
procedure
Kliens alkalmazás
Adatbázis
Olvasás
Írás
Windows Forms, WPF,Konzol, XAML
Web Forms
Kapcsolat nélküli adatelérés
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
48
J.Zs.Cs.: Vizuális programozás (c) 2010
TableAdapterTableAdapter
DataSetDataSet
SQL Server
DataAdapterDataAdapter
SelectCommandSelectCommand UpdateCommandUpdateCommand
InsertCommandInsertCommand
DeleteCommandDeleteCommand
ConnectionConnection
DataTable DataTable
SelectCommandSelectCommand
Fill()Fill() Update()Update()
UpdateCommandUpdateCommand
InsertCommandInsertCommand
DeleteCommandDeleteCommand
Forrás: Albert István Okos kliens fejlesztése a .NET platformra
Adat objektumokProvider-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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
49
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
50
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);Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
51
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Provider osztályok
Connection
Command
DataReader
DataAdapter/TableAdapter
52
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
53
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
54
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)
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
55
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
56
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
57
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
58
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Consumer objektumok
DataSet/típusos DataSet
DataTable/típusos DataTable
DataRow
DataColumn
Relation
59
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
60
DataSet felépítése
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
61
Relation
Row
Column
Table
DataSet
Tables
Columns
Constraints
Rows
Relations
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óColumnDr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
62
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Típusos DataSet létrehozásalé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 …
63
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
64
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Automatikusan generált osztályok65
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
66
Kapcsolat alapú adatbázis elérésLeké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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
67
Kapcsolat alapú lekérdezés példa
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
68
Kapcsolatalapú adatbáziselérésBeszúrás, Módosítás, TörlésLé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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
69
Kapcsolat alapú beszúrás példa
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
70
J.Zs.Cs.: Vizuális programozás (c) 2010
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
71
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
72
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Kapcsolat nélküli adatbeolvasás példa - típus nélküli DataSet
73
Kapcsolat nélküli – adatbeolvasás típusos DataSet-be
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
74
J.Zs.Cs.: Vizuális programozás (c) 2010
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);
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
75
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Kapcsolat létrehozása vizuális eszközökkel
76
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatlista a kapcsolat felhasználásával77
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()
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
78
DataSet-ben tárolt adatok módosítása2 Rekord hozzáadása
Rekord módosítása
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
79
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
DataSet-ben tárolt adatok módosítása3
Törlés
80
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
81
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Dependency Property
Hasonló a hagyomá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
82
Dependency Property
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
83
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
84
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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)
85
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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)
86
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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)
87
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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);
88
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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>
89
Value Resolution Strategy
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
90
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...
}
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
91
Coerce Value Callback
private static object OnCoerceTimeProperty( DependencyObject sender, object data )
{
if ((DateTime)data > DateTime.Now )
{
data = DateTime.Now;
}
return data;
}
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
92
Validation Callback
private static bool OnValidateTimeProperty(object data)
{
return data is DateTime;
}
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
93
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
LINQLanguage INtegrated Query
94
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
95
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
LINQ to Objects96
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
97
Megoldás
Átalakítás
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
98
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
99
Operátorok
from x in y
where
orderby x ascending|descending
group x by y into z
select
join, on, equals, into
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
100
Metódusok
Distinct<>()
Count<>()
Union<>()
Sum<>()
Min<>(), Max<>()
Intersect<>()
Reverse<>()
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
101
Névtelen típus előállítása projekcióval
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
102
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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.
103
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
DemoSzótár
Számok
104
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Szökőévek keresése – hagyományos megoldás
105
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Szökőévek keresése – névtelen metódus
Eredeti
Fordítás után (.Net Reflector)
106
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Szökőévek keresése – LINQ lekérdezéssel
Eredeti
Fordítás után (.Net Reflector)
107
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Szökőévek keresése – Lambda kifejezéssel
Eredeti
Fordítás után (.Net Reflector)
108
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Csökkenő sorba rendezés – névtelen metódussal
Eredeti
Fordítás után (.Net Reflector)
109
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Csökkenő sorba rendezés – lambda kifejezéssel
Eredeti
Fordítás után (.Net Reflector)
110
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
LINQ to ADO.NET
LINQ to DataSets
LINQ to XML
LINQ to SQL
111
LINQ to DataSets
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Á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>();)
113
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Lekérdezés
Átalakítás ToArray, ToDictionary, ToList
Elem ElementAt, First
Aggregáció Aggregate, Average, Count, LongCount, Max, Min, Sum
114
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Aggregate és lambda kifejezés115
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Any és lambda kifejezés116
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
117
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
118
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
119
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
3120
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
121
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
122
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
123
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Egyszerű adatkötés
DataContext – forrás objektum
Értéke öröklődik a logikai fa hierarchiában
124
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Element to Element Binding125
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Kötés statikus erőforráshoz126
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Az adatszerkezet127
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Statikus erőforrás definiálása128
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Adatkötés129
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Kötés futási időben létrehozott objektumhoz
130
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Felület131
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Lista létrehozása és adatforrás megadása
132
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Lépegetés megoldása133
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
134
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Mode=OneWay
<TextBlock Width="248" Height="24"
x:Name="tbSelectedColor"
Text="{Binding ElementName=lbColor,
Path=SelectedItem.Content, Mode=OneWay}"
Background="{Binding ElementName=lbColor,
Path=SelectedItem.Content, Mode=OneWay}"/>
135
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
DataSet adatkötés, lépegetésDemo: WPF_Adatkotes_6_DataSet
136
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
DataContext és ComboBoxDemo: WPF_EF_Northwind
137
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
DataGrid
AutoGenerateColumns="True" – generált oszlopok típusai: String DataGridTextColumn
Boolean DataGridCheckBoxColumn
Enumerable DataGridTextColumn
Uri DataGridHyperlinkColumn
Egyéb semmi/típusnév
AutoGenerateColumns="False" A megjelenített oszlopok jellemzőit egyedileg meg kell adni az XAML
kódban
138
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Oktató139
public enum Nem { férfi = 1, nő };public class Oktató{
public String Név { get; set; }public Nem Nem { get; set; }public Boolean VanFokozat { get;
set; }public Uri Honlap { get; set; }public ImageSource Kép { get; set; }
}
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
140
public partial class MainWindow : Window{ private List<Oktató> Oktatók;
public MainWindow(){ InitializeComponent();
Oktatók=new List<Oktató>(); Feltölt(); dgAdatok.ItemsSource = Oktatók;
}private void Feltölt(){ var ims = (new ImageSourceConverter()).ConvertFromString(
"pack://application:,,,/Images/pacman-145855_640.png") as ImageSource;
Oktatók.Add(new Oktató { Név="Kutató József",Nem=Nem.férfi, VanFokozat = false,
Honlap = new Uri("http://kutatojozsef.hu"), Kép = ims});ims = (new ImageSourceConverter()).ConvertFromString(
"pack://application:,,,/Images/pacman-145859_640.png") as ImageSource;
Oktatók.Add(new Oktató { Név = "Kutató Jolán", Nem = Nem.nő, VanFokozat = true,
Honlap = new Uri("http://kutatojolan.hu"), Kép = ims});ims = (new ImageSourceConverter()).ConvertFromString(
"pack://application:,,,/Images/viking-149113_640.png") as ImageSource;
Oktatók.Add(new Oktató{ Név="Kutató Gerzson",Nem = Nem.férfi,VanFokozat = true,
Honlap = new Uri("http://kutatogerzson.hu"),Kép = ims});}
}
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
141
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entity Framework modell142
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entity Framework – Partial Class - ObservableCollection
143
// ObservableCollectiondgHelységek.ItemsSource = cnTelefonszámok.enHelységek.Local;
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Entity Framework – Partial Class - ObservableCollection
144
<DataGrid x:Name="dgMinden" ItemsSource="{Binding}"
Visibility="Hidden" CanUserResizeColumns="True"
CanUserSortColumns="True" CanUserAddRows="False" />dgMinden.ItemsSource =cnTelefonszámok.enSzemélyek.Local;
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Egyedi oszlopdefiníciók145
<DataGrid x:Name="dgHelységek" ItemsSource="{Binding}" Visibility="Hidden" CanUserResizeColumns="True"CanUserSortColumns="True" CanUserAddRows="False" AutoGenerateColumns="False"><DataGrid.Columns>
<DataGridTextColumn Header="Irányítószám" Binding="{Binding Irsz}" />
<DataGridTextColumn Header="Helységnév" Binding="{Binding Név}" />
</DataGrid.Columns></DataGrid>
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Egyedi oszlopdefiníciók
146
<DataGrid x:Name="dgMinden" ItemsSource="{Binding}" Visibility="Hidden" CanUserResizeColumns="True"
CanUserSortColumns="True" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns><DataGridTextColumn Header="Vezetéknév" Binding="{Binding
Vezetéknév}" /><DataGridTextColumn Header="Utónév" Binding="{Binding Utónév}" /><DataGridTextColumn Header="Helység" Binding="{Binding
TeljesHelységAzonosító}" /><DataGridTextColumn Header="Lakcím" Binding="{Binding Lakcím}" /><DataGridTextColumn Header="Telefonszámok" Binding="{Binding
Telefonszámok}" /></DataGrid.Columns>
</DataGrid>
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Egyedi oszlop-definíciók és kép- az alap osztály
147
private List<Oktató> Oktatók; public MainWindow(){
InitializeComponent();Oktatók=new List<Oktató>();Feltölt();dgAdatok.ItemsSource =
Oktatók;}public enum Nem { férfi = 1, nő };
public class Oktató{
public String Név { get; set; }public Nem Nem { get; set; }public Boolean VanFokozat { get;
set; }public Uri Honlap { get; set; }public ImageSource Kép { get;
set; } }
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Lista létrehozása148
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Felület149
<DataGrid x:Name="dgAdatok" AutoGenerateColumns="False" ItemsSource="{Binding}" IsReadOnly="True" CanUserReorderColumns="True" CanUserResizeColumns="True"
CanUserSortColumns="True"><DataGrid.Columns>
<DataGridTextColumn Header="Név" Binding="{Binding Név}" /><DataGridTextColumn Header="Nem" Binding="{Binding Nem}" /><DataGridCheckBoxColumn Header="Tudományos fokozat" Binding="{Binding
VanFokozat}"/><DataGridHyperlinkColumn Header="Honlap" Binding="{Binding
Honlap}"/><DataGridTemplateColumn Header="Kép" Width="100"
IsReadOnly="True"><DataGridTemplateColumn.CellTemplate>
<DataTemplate><Image Source="{Binding Kép}" />
</DataTemplate></DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn></DataGrid.Columns>
</DataGrid>
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Futás közben150
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Csoportosítás151
Demo: DataGrid_Group
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
További forrás152
http://www.wpftutorial.net/datagrid.html
Adatkötés Windows Forms alkalmazásokbanEgyéni feldolgozásra
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)
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
154
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
155
Példa egyszerű adatkötésre
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
156
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
157
Példa komplex adatkötésre1
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
158
Példa komplex adatkötésre2
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
159
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
160
Lépegetés megvalósítása CurrencyManager segítségével
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
161
Format és Parse események és az adatmegjelenítés
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
162
TextBox1TextBox1Format
Parse
Kötést megvalósító
objektum
Adatforrás
10 10,00 Ft
10,00 Ft10
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)
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
163
Példa
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
164
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
165
Megkönnyíti az adatok közötti navigálást és az adatforrás esetleges lecserélésétDataSourceDataMember
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
166
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
167
Adatbázis kezelés programozása vizuális eszközökkelWindows Forms alkalmazásokbanEgyéni feldolgozásra
Visual Studio .NET Professional 2008
Egyszerű kötés a DataBindings tulajdonsággal
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
169
DataSource és DisplayMember
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
170
J.Zs.Cs.: Vizuális programozás (c) 2010
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
171
Adatforrás típusának kiválasztása
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
172
J.Zs.Cs.: Vizuális programozás (c) 2010
Új kapcsolat
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
173
J.Zs.Cs.: Vizuális programozás (c) 2010
Add Connection
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
174
Kapcsolat
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
175
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!
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
176
Kapcsolatsztring konfigurációs fájlba mentése
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
177
J.Zs.Cs.: Vizuális programozás (c) 2010
Mi kerüljön be a Dataset-be?Mi legyen a DataSet neve?
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
178
J.Zs.Cs.: Vizuális programozás (c) 2010
Ű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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
179
Ű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)
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
180
Komponensek beállítása
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
181
Teendők
Menü a főablakra
Böngésző-módosító ablak megjelenítése
Adatbázis helyének módosítása
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
182
Program használata
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
183
J.Zs.Cs.: Vizuális programozás (c) 2010
A mintaprogram:AccessOLEDB
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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)
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
186
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
187
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ásnakDr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
188
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 -->
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
189
Dokumentumot leíró fa hierarchia
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
190
GyökérElem – normál tag
Attribútum
Szöveg
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>
</konyv>
</adatbazis>
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
191
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>
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
192
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
193
Forrás:http://en.wikipedia.org/wiki/URI
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>
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
194
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>
<pz:ar>1500</pz:ar>
</konyv>
</adatbazis>
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
195
Névtérhasználat
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
196
J.Zs.Cs.: Vizuális programozás (c) 2010
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
198
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ányXML Schema definition language (XSD)
Gyökér elem a Schema
Definiálni lehet: elem típusokat, attribútum típusokat, elemeket, attribútumokat
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
201
J.Zs.Cs.: Vizuális programozás (c) 2010
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
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
202
Demo: XML_Cikkek_Alap
Demo: XML_Szerzok_Cikkek
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
203
J.Zs.Cs.: Vizuális programozás (c) 2010
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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
204
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
XML dokumentum előállítása a memóriában
205
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
Beolvasás, mentés és kiírás a konzolra
206
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
XML dokumentum előállítása gyűjtemény lekérdezésével
207
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
XML dokumentum lekérdezése208
IsmétlésEgyéni feldolgozásra
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 Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
210
Megoldások
Bináris
SOAP-XML
XML
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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]Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
212
Mentés
Stream st=File.Create("fájlnév");
BinaryFormatter bf=new BinaryFormatter();
bf.Serialize(st,objektum);
//ezt az objektumot akarjuk sorosítanist.Close();
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
213
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();
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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é.
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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();
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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();
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
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]
Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
218
Mentés és helyreállításMenté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");
XmlSerializer xs=new XmlSerializer(typeof(Osztály_Név));
objektum=(Osztály_Név)xs.Deserialize(st);
// Az objektum típusa Osztály_Név
st.Close();Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015
219