vizuális programozás

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

Upload: keely-erickson

Post on 31-Dec-2015

39 views

Category:

Documents


1 download

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 Presentation

TRANSCRIPT

Page 1: Vizuális programozás

Vizuális programozás

Adatbázisok elérése

Page 2: Vizuális programozás

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

Page 3: Vizuális programozás

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

Page 4: Vizuális programozás

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

Page 5: Vizuális programozás

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

Page 6: Vizuális programozás

Entity Framework

Page 7: Vizuális programozás

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

Page 8: Vizuális programozás

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

Page 9: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Entitás modell fölvétele a projektbe9

Page 10: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Adatmodell létrehozása10

Page 11: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Üres modell létrehozása11

Page 12: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Tároló átnevezéseEntitás és entitás halmaz

12

Page 13: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Entitások és tulajdonságok13

Page 14: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Entitások összekapcsolása 14

Page 15: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

A modell elemei15

Page 16: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Adatbázis létrehozása16

Page 17: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Adatbázis állomány17

Page 18: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

18

Page 19: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Kapcsolati sztring + App.Config19

Page 20: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Kapcsolódás az adatbázishoz és SQL szkript generálása

20

Page 21: Vizuális programozás

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

Page 22: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Ellenőrzés22

Page 23: Vizuális programozás

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

Page 24: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Entity Framework szerelvények projekthez rendelése

24

Page 25: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Adat-felvitel

25

Mi hiányzik a kódból?

Page 26: Vizuális programozás

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);

Page 27: Vizuális programozás

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

Page 28: Vizuális programozás

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

Page 29: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Northwind – adatbázis állomány létrehozása29

Page 30: Vizuális programozás

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

Page 31: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Entity modell generálása31

Page 32: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Kapcsolati sztring32

Page 33: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Entity modell33

Page 34: Vizuális programozás

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

Page 35: Vizuális programozás

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

Page 36: Vizuális programozás

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

Page 37: Vizuális programozás

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

Page 38: Vizuális programozás

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

Page 39: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Ellenőrzés39

Page 40: Vizuális programozás

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]

Page 41: Vizuális programozás

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

Page 42: Vizuális programozás

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

Page 44: Vizuális programozás

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

Page 45: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

ADO.NET45

Ábra forrása: http://swechhaindia.wordpress.com/author/swechhaindia/page/3/

Page 46: Vizuális programozás

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

Page 47: Vizuális programozás

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

Page 48: Vizuális programozás

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

Page 49: Vizuális programozás

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

Page 50: Vizuális programozás

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

Page 51: Vizuális programozás

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

Page 52: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Provider osztályok

Connection

Command

DataReader

DataAdapter/TableAdapter

52

Page 53: Vizuális programozás

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

Page 54: Vizuális programozás

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

Page 55: Vizuális programozás

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

Page 56: Vizuális programozás

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

Page 57: Vizuális programozás

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

Page 58: Vizuális programozás

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

Page 59: Vizuális programozás

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

Page 60: Vizuális programozás

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

Page 61: Vizuális programozás

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

Page 62: Vizuális programozás

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

Page 63: Vizuális programozás

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

Page 64: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

64

Page 65: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Automatikusan generált osztályok65

Page 66: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

66

Page 67: Vizuális programozás

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

Page 68: Vizuális programozás

Kapcsolat alapú lekérdezés példa

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

68

Page 69: Vizuális programozás

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

Page 70: Vizuális programozás

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

Page 71: Vizuális programozás

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

Page 72: Vizuális programozás

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

Page 73: Vizuális programozás

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

Page 74: Vizuális programozás

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

Page 75: Vizuális programozás

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

Page 76: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Kapcsolat létrehozása vizuális eszközökkel

76

Page 77: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Adatlista a kapcsolat felhasználásával77

Page 78: Vizuális programozás

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

Page 79: Vizuális programozás

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

Page 80: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

DataSet-ben tárolt adatok módosítása3

Törlés

80

Page 81: Vizuális programozás

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

Page 82: Vizuális programozás

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

Page 83: Vizuális programozás

Dependency Property

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

83

Page 84: Vizuális programozás

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

Page 85: Vizuális programozás

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

Page 86: Vizuális programozás

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

Page 87: Vizuális programozás

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

Page 88: Vizuális programozás

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

Page 89: Vizuális programozás

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

Page 90: Vizuális programozás

Value Resolution Strategy

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

90

Page 91: Vizuális programozás

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

Page 92: Vizuális programozás

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

Page 93: Vizuális programozás

Validation Callback

private static bool OnValidateTimeProperty(object data)

{

return data is DateTime;

}

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

93

Page 94: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

LINQLanguage INtegrated Query

94

Page 95: Vizuális programozás

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

Page 96: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

LINQ to Objects96

Page 97: Vizuális programozás

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

Page 98: Vizuális programozás

Megoldás

Átalakítás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

98

Page 99: Vizuális programozás

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

Page 100: Vizuális programozás

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

Page 101: Vizuális programozás

Metódusok

Distinct<>()

Count<>()

Union<>()

Sum<>()

Min<>(), Max<>()

Intersect<>()

Reverse<>()

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

101

Page 102: Vizuális programozás

Névtelen típus előállítása projekcióval

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

102

Page 103: Vizuális programozás

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

Page 104: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

DemoSzótár

Számok

104

Page 105: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Szökőévek keresése – hagyományos megoldás

105

Page 106: Vizuális programozás

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

Page 107: Vizuális programozás

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

Page 108: Vizuális programozás

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

Page 109: Vizuális programozás

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

Page 110: Vizuális programozás

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

Page 111: Vizuális programozás

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

Page 112: Vizuális programozás

LINQ to DataSets

Page 113: Vizuális programozás

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

Page 114: Vizuális programozás

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

Page 115: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Aggregate és lambda kifejezés115

Page 116: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Any és lambda kifejezés116

Page 117: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

117

Page 118: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

118

Page 119: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

119

Page 120: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

3120

Page 121: Vizuális programozás

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

Page 122: Vizuális programozás

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

Page 123: Vizuális programozás

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

Page 124: Vizuális programozás

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

Page 125: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Element to Element Binding125

Page 126: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Kötés statikus erőforráshoz126

Page 127: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Az adatszerkezet127

Page 128: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Statikus erőforrás definiálása128

Page 129: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Adatkötés129

Page 130: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Kötés futási időben létrehozott objektumhoz

130

Page 131: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Felület131

Page 132: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Lista létrehozása és adatforrás megadása

132

Page 133: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Lépegetés megoldása133

Page 134: Vizuális programozás

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

Page 135: Vizuális programozás

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

Page 136: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

DataSet adatkötés, lépegetésDemo: WPF_Adatkotes_6_DataSet

136

Page 137: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

DataContext és ComboBoxDemo: WPF_EF_Northwind

137

Page 138: Vizuális programozás

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

Page 139: Vizuális programozás

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; }

}

Page 140: Vizuális programozás

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});}

}

Page 141: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

141

Page 142: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Entity Framework modell142

Page 143: Vizuális programozás

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;

Page 144: Vizuális programozás

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;

Page 145: Vizuális programozás

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>

Page 146: Vizuális programozás

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>

Page 147: Vizuális programozás

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; } }

Page 148: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Lista létrehozása148

Page 149: Vizuális programozás

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>

Page 150: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Futás közben150

Page 151: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Csoportosítás151

Demo: DataGrid_Group

Page 152: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

További forrás152

http://www.wpftutorial.net/datagrid.html

Page 153: Vizuális programozás

Adatkötés Windows Forms alkalmazásokbanEgyéni feldolgozásra

Page 154: Vizuális programozás

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

Page 155: Vizuális programozás

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

Page 156: Vizuális programozás

Példa egyszerű adatkötésre

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

156

Page 157: Vizuális programozás

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

Page 158: Vizuális programozás

Példa komplex adatkötésre1

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

158

Page 159: Vizuális programozás

Példa komplex adatkötésre2

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

159

Page 160: Vizuális programozás

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

Page 161: Vizuális programozás

Lépegetés megvalósítása CurrencyManager segítségével

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

161

Page 162: Vizuális programozás

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

Page 163: Vizuális programozás

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

Page 164: Vizuális programozás

Példa

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

164

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

Page 165: Vizuális programozás

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

Page 166: Vizuális programozás

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

Page 167: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

167

Page 168: Vizuális programozás

Adatbázis kezelés programozása vizuális eszközökkelWindows Forms alkalmazásokbanEgyéni feldolgozásra

Visual Studio .NET Professional 2008

Page 169: Vizuális programozás

Egyszerű kötés a DataBindings tulajdonsággal

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

169

Page 170: Vizuális programozás

DataSource és DisplayMember

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

170

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

Page 171: Vizuális programozás

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

Page 172: Vizuális programozás

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

Page 173: Vizuális programozás

Új kapcsolat

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

173

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

Page 174: Vizuális programozás

Add Connection

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

174

Page 175: Vizuális programozás

Kapcsolat

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

175

Page 176: Vizuális programozás

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

Page 177: Vizuális programozás

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

Page 178: Vizuális programozás

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

Page 179: Vizuális programozás

Ű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

Page 180: Vizuális programozás

Ű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

Page 181: Vizuális programozás

Komponensek beállítása

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

181

Page 182: Vizuális programozás

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

Page 183: Vizuális programozás

Program használata

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

183

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

Page 184: Vizuális programozás

A mintaprogram:AccessOLEDB

Page 185: Vizuális programozás

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

Page 186: Vizuális programozás

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

Page 187: Vizuális programozás

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

Page 188: Vizuális programozás

Formátum2

Speciális karakterek szimbólumokkal (&szimbólumnév;) vagy kóddal (&#kód;) adhatók meg pl. a &lt; 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

Page 189: Vizuális programozás

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

Page 190: Vizuális programozás

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

Page 191: Vizuális programozás

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

Page 192: Vizuális programozás

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

Page 193: Vizuális programozás

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

Page 194: Vizuális programozás

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

Page 195: Vizuális programozás

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

Page 196: Vizuális programozás

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

Page 197: Vizuális programozás

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

Page 198: Vizuális programozás

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

Page 199: Vizuális programozás

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

Page 200: Vizuális programozás

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

Page 201: Vizuális programozás

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

Page 202: Vizuális programozás

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

Page 203: Vizuális programozás

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

Page 204: Vizuális programozás

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

Page 205: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

XML dokumentum előállítása a memóriában

205

Page 206: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

Beolvasás, mentés és kiírás a konzolra

206

Page 207: Vizuális programozás

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

Page 208: Vizuális programozás

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

XML dokumentum lekérdezése208

Page 209: Vizuális programozás

IsmétlésEgyéni feldolgozásra

Page 210: Vizuális programozás

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

Page 211: Vizuális programozás

Megoldások

Bináris

SOAP-XML

XML

Dr. Johanyák Zsolt Csaba: Vizuális programozás (c) 2015

211

Page 212: Vizuális programozás

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

Page 213: Vizuális programozás

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

Page 214: Vizuális programozás

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

Page 215: Vizuális programozás

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

Page 216: Vizuális programozás

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

Page 217: Vizuális programozás

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

Page 218: Vizuális programozás

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

Page 219: Vizuális programozás

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