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

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

V 1.0 OE-NIK HP 1 Haladó Programozás Adatbázis-elérési módszerek összehasonlítása Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése.

Hasonló előadás


Az előadások a következő témára: "V 1.0 OE-NIK HP 1 Haladó Programozás Adatbázis-elérési módszerek összehasonlítása Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése."— Előadás másolata:

1 V 1.0 OE-NIK HP 1 Haladó Programozás Adatbázis-elérési módszerek összehasonlítása Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése DataSet módszerrel SQL server elérése Entity Framework módszerrel

2 V 1.0 OE-NIK HP 2 Haladó Programozás Adatbázis-elérési módszerek összehasonlítása Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése DataSet módszerrel SQL server elérése Entity Framework módszerrel

3 V 1.0 SQL Server / SQL Express / LocalDB MSSQL: tipikusan kis- és középvállalatok által használt adatbázis-kezelő szerver –SQL Express: kisebb változat: max 10GB/database, max 1 CPU, max 1GB RAM Korábbi VS verziók (x<2012): SQL Express integrálva volt a fejlesztőeszköz telepítőjébe (Data Source=.\SQLEXPRESS) VS 2010 óta elérhető, VS 2012-től default: LocalDB (Data Source=(localdb)\v11.0) –Szerver-szolgáltatás helyett igény szerint induló library, ami egy adatbázis-file-t használ –Órán ezt használjuk –A gépeken van MSSQL 2012 Express is, ha esetleg a projekthez kell OE-NIK HP 3

4 V 1.0 DbConnection vs DataSet vs Entity Framework Különböző absztrakciós szintek DbConnection –Alap SQL-szintű elérés, string SQL utasításokkal, object tömb eredményekkel DataSet –Az SQL réteg fölé egy erősen típusos, GUI központú réteg kerül, a műveleteket típusos metódusok végzik Entity Framework –Az SQL réteg fölé egy MVC elvű ORM (Object Relational Mapping) réteget helyezünk: a táblákat mint objektumok általános gyűjteményét kezeljük Alapvető műveletek: Kapcsolódás/inicializáció; beszúrás; módosítás; törlés; adatlekérés; GUI-hoz kapcsolás OE-NIK HP 4

5 V 1.0 OE-NIK HP 5 Haladó Programozás Adatbázis-elérési módszerek összehasonlítása Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése DataSet módszerrel SQL server elérése Entity Framework módszerrel

6 V 1.0 ADO.NET: DbConnection/DbReader „Kapcsolt” adatbázis-elérés (Connected Data-Access Architecture) Előny: gyors, egyszerű Hátrány: nehéz módosítani és technológiát/tárolási módszert váltani; kapcsolat elveszését kezelni kell A különböző adatbázis-szerverekhez különböző implementációk Közös ősosztályok a különféle feladatokhoz –Adatbázis-kapcsolat: DbConnection –SQL/RPC utasítás végrehajtása: DbCommand –Utasítás eredményének beolvasása: DbDataReader Specifikus utódosztályok a különféle adatbázis-szerverekhez –SqlConnection (MSSQL System.Data.SqlClient) –MySqlConnection (MySQL MySql.Data.MySqlClient) –NpgsqlConnection (PostgreSQL - Npgsql) –OracleConnection (Oracle System.Data.OracleClient) OE-NIK HP 6

7 V Inicializálás string connStr Source=(LocalDB)\v11.0;AttachDbFilename=path\to\empdept.mdf; Integrated Security=True;"; SqlConnection conn; private void button15_Click(object sender, EventArgs e) { conn = new SqlConnection(connStr); conn.Open(); MessageBox.Show("CONNECTED"); } OE-NIK HP 7

8 V INSERT private void button18_Click(object sender, EventArgs e) { SqlCommand comm = new SqlCommand("insert into EMP (ENAME, MGR, DEPTNO, EMPNO) values ('BELA', NULL, 20, 1000)", conn); SqlDataReader reader=comm.ExecuteReader(); MessageBox.Show(reader.RecordsAffected.ToString()); reader.Close(); } OE-NIK HP 8

9 V UPDATE private void button18_Click(object sender, EventArgs e) { SqlCommand comm = new SqlCommand("update EMP set ENAME='JOZSI' where EMPNO=1000", conn); SqlDataReader reader=comm.ExecuteReader(); MessageBox.Show(reader.RecordsAffected.ToString()); reader.Close(); } OE-NIK HP 9

10 V DELETE private void button18_Click(object sender, EventArgs e) { SqlCommand comm = new SqlCommand("delete from EMP where empno=1000", conn); SqlDataReader reader=comm.ExecuteReader(); MessageBox.Show(reader.RecordsAffected.ToString()); reader.Close(); } OE-NIK HP 10

11 V SELECT private void button14_Click(object sender, EventArgs e) { listBox1.Items.Clear(); SqlCommand comm = new SqlCommand("select * from EMP where sal>=3000 order by ename", conn); SqlDataReader reader = comm.ExecuteReader(); while (reader.Read()) { listBox1.Items.Add(reader["ENAME"].ToString()); } reader.Close(); } OE-NIK HP 11

12 V Megjelenítés GUI-n private void button13_Click(object sender, EventArgs e) { dataGridView1.DataSource = null; dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); dataGridView1.AllowUserToAddRows = false; SqlCommand comm = new SqlCommand("select * from EMP order by ename", conn); SqlDataReader reader = comm.ExecuteReader(); while (reader.Read()) { [GRIDVIEW FELTÖLTÉSE] } reader.Close(); } OE-NIK HP 12

13 V Megjelenítés GUI-n - GRIDVIEW FELTÖLTÉSE if (dataGridView1.Columns.Count == 0) { for (int i = 0; i < reader.FieldCount; i++) { string coltext = reader.GetName(i).ToLower(); dataGridView1.Columns.Add(coltext, coltext); } dataGridView1.Rows.Add(); int rowid = dataGridView1.Rows.Count - 1; for (int i = 0; i < reader.FieldCount; i++) { dataGridView1.Rows[rowid].Cells[i].Value = reader[i].ToString(); } OE-NIK HP 13

14 V 1.0 OE-NIK HP 14 Haladó Programozás Adatbázis-elérési módszerek összehasonlítása Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése DataSet módszerrel SQL server elérése Entity Framework módszerrel

15 V 1.0 ADO.NET: DataAdapter/DataSet/DataTable „Kapcsolat nélküli” adatbázis-elérés (Disconnected D-A. A.) Előny: nem kell konkrét SQL utasításokat írni, könnyebb adatkapcsolódás a GUI elemeihez Hátrány: nehéz módosítani és technológiát/tárolási módszert váltani; nagy memóriaigény Automatikusan generált, adatfüggő típusozott osztályok keletkeznek (~200KB teljesen normális méret egy két táblás adatbázishoz) Az osztályok legenerálása után egyedi osztályok vannak a táblákhoz/adatmezőkhöz: –TableAdapter: az adatbázishoz való kapcsolatot építi fel, eredményeket olvas –DataSet: az adatbázis reprezentációja –BindingSource: adatforrás-kapcsolat az ablak felé OE-NIK HP 15

16 V 1.0 DataSet létrehozása Server explorer (Express Edition-ben: Database Explorer) és Data Sources (Shift+Alt+D) fül kell Server explorer: Adatbázis/connection létrehozása –Későbbi dián részletezzük Data sources: Add new data source –Database / DataSet –Connection kiválasztása, „Include sensitive data” –„Save connection string to the application file”, Táblák kiválasztása Ezután a DataSources-ból az ablakra egyszerűen ráhúzzuk a táblát, máris kész az alkalmazás OE-NIK HP 16

17 V Inicializálás private void button5_Click(object sender, EventArgs e) { eMPTableAdapter.Fill(nikdbDataSetVariable.EMP); MessageBox.Show("CONNECTED"); } OE-NIK HP 17

18 V INSERT private void button8_Click(object sender, EventArgs e) { DataRow ujsor = nikdbDataSetVariable.EMP.NewRow(); //NewEmpRow() is használható lenne ujsor["ENAME"] = "BELA"; ujsor["MGR"] = DBNull.Value; ujsor["DEPTNO"] = 20; ujsor["EMPNO"] = 1000; nikdbDataSetVariable.EMP.Rows.Add(ujsor); eMPTableAdapter.Update(nikdbDataSetVariable); MessageBox.Show("DONE"); } OE-NIK HP 18

19 V UPDATE private void button7_Click(object sender, EventArgs e) { DataRow dr = nikdbDataSetVariable.EMP.Rows[0]; dr.BeginEdit(); dr["ENAME"] = "JOZSI"; dr.EndEdit(); nikdbDataSet valtozas=(nikdbDataSet)nikdbDataSetVariable. GetChanges(DataRowState.Modified); if (valtozas.HasErrors) { nikdbDataSetVariable.RejectChanges(); } else { nikdbDataSetVariable.AcceptChanges(); eMPTableAdapter.Update(valtozas); } OE-NIK HP 19

21 V SELECT private void button12_Click(object sender, EventArgs e) { listBox1.Items.Clear(); foreach (DataRow dr in nikdbDataSetVariable.EMP.Select("sal>=3000")) { listBox1.Items.Add(dr["ENAME"].ToString()); } OE-NIK HP 21

22 V Megjelenítés GUI-n private void button11_Click(object sender, EventArgs e) { dataGridView1.Columns.Clear(); dataGridView1.Rows.Clear(); dataGridView1.DataSource = null; //dataGridView1.DataSource = nikdbDataSetVariable.EMP; dataGridView1.DataSource = eMPBindingSource; } OE-NIK HP 22

23 V 1.0 OE-NIK HP 23 Haladó Programozás Adatbázis-elérési módszerek összehasonlítása Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése DataSet módszerrel SQL server elérése Entity Framework módszerrel

24 V 1.0 Entity Framework (LINQ: to SQL / to Entities) ADO.NET Entity Framework (+LINQ to Entites) –Teljes ORM –N:M kapcsolatokat is támogat –Alternatív adatbázis-dialektusokkal is működik/het (Oracle, MySQL...) –Entity osztályok létrehozása: Data sources / Add new data source / Database / Entity Data Model –Újabb VS verzióknál: Project / Add New Item / Data / ADO.NET Entity Data Model LINQ to SQL –Formailag nagyon hasonló –Régebbi módszer, NEM UGYANAZ! –Csak közvetlen leképezést, és csak MSSQL dialektust támogat –Egyszerű és gyors, de nagyon korlátozottan használható („Rapid development”) –Osztályok létrehozása: Project/Add Class/LINQ to SQL classes OE-NIK HP 24

25 V 1.0 Entity model megközelítési módok Code First: Először hozzuk létre az osztályokat, és ebből az adatbázist Database/SQL First: Kész adatbázisból csinálunk modell osztályokat Model First: Modellező eszközzel „megrajzoljuk” az adatmodellt (= osztálydiagramot) ( ) OE-NIK HP 25

26 V 1.0 Entity Framework verziók EF1 = EF3.5 .NET 3.5 EF4 .NET 4 „POCO support, lazy loading, testability improvements, customizable code generation and the Model First workflow” EF4.1  „first to be published on NuGet. This release included the simplified DbContext API and the Code First workflow”  Jó! EF4.3  „Code First Migrations”  Teljesen használható ORM! EF5, EF6, EF 6.1  https://msdn.microsoft.com/en-us/data/jj aspx Frissíthető (nekünk nem kell, jó a beépített): > NuGet> Install-Package EntityFramework (esetleg: -Version x.x.x) > Entity Framework 6 Tools for Visual Studio: OE-NIK HP 26

27 V 1.0 LocalDB létrehozása In-Solution –Project / Add New Item / Service-based Database (ez SQL server file lesz. Local Database: SQL server compact file) –Nekünk mindkettő jó, service-based-et használunk: EmpDept –Előbb feltöltjük az adatbázist, majd azután generálunk osztályokat In-Profile –Server Explorer -> Right click (Data Connections) -> Add Connection ( Microsoft SQL Server +.Net provider for SQL Server ) –Server name = (localdb)\v11.0, Database name = EMPDEPT –"Database does not exist. Attempt to create?" –Akár a „Create New SQL Server Database” is jó, ugyanilyen lépésekkel OE-NIK HP 27

28 V 1.0 Adatbázis feltöltése Új DB-re jobbkatt, New query, a létrehozó SQL -ből mindent copypaste, Execute, ez után a query bezárható (Új db /tables- re jobbkatt, refresh: táblák megjelennek) Project, Add new Item, ADO.NET Entity Data Model ; Generate from database ; az MDF file legyen a legördülő menüben + save connection settings ; EF6.0 ; Mindegyik tábla mellett pipa + Model namespace = EmpDeptModel Konfigurációtól függően: Template can harm your computer, click ok to run... ( ) Eredmény: automatikusan generált osztályok (mint DataSetnél), csak ezek nagyrészt generikus osztályok típusparaméterezett változatai  ~30KB a két táblás adatbázis OE-NIK HP 28

29 V Inicializálás ED = new EmpDeptEntities(); Console.WriteLine("Connect OK"); var reszleg = ED.DEPT.First(); Console.WriteLine(reszleg.DNAME); var dolg = from dolgozo in ED.EMP where dolgozo.ENAME.Contains("E") select dolgozo; Console.WriteLine(dolg.Count()); OE-NIK HP 29

30 V INSERT var ujdolg = new EMP() { ENAME = "BELA", MGR = null, DEPTNO = 20, EMPNO = 1000 }; ED.EMP.Add(ujdolg); // régen: AddObject ED.SaveChanges(); Console.WriteLine("Insert OK"); OE-NIK HP 30

31 V UPDATE var valaki = ED.EMP.Single(x => x.EMPNO == 1000); valaki.ENAME = "JOZSI"; ED.SaveChanges(); Console.WriteLine("Update OK"); OE-NIK HP 31

32 V DELETE var valaki = ED.EMP.Single(x => x.EMPNO == 1000); ED.EMP.Remove(valaki); // régen: DeleteObject ED.SaveChanges(); Console.WriteLine("Delete OK"); OE-NIK HP 32

33 V SELECT string s = "", sep=""; foreach (var dolg in ED.EMP.Where(dolgozo => dolgozo.SAL >= 3000)) { s += sep + dolg.ENAME; sep = ","; } Console.WriteLine(s); Console.WriteLine( string.Join(";", ED.EMP.Select(x => x.ENAME)) ); OE-NIK HP 33

34 V Megjelenítés GUI-n { dataGridView1.Columns.Clear(); dataGridView1.Rows.Clear(); dataGridView1.ItemsSource = null; var dolgozok = from dolgozo in NE.EMP orderby dolgozo.ENAME select dolgozo; dataGridView1.ItemsSource = dolgozok.ToList(); } Így bindelhető DataContexten keresztül is ItemsSource csak dolgozok.ToList() lehet, vagy teljes tábla esetén ED.EMP.Load() után ED.EMP.Local OE-NIK HP 34

35 V JOIN var dolgozok = from dolgozo in NE.EMP join reszleg in NE.DEPT on dolgozo.DEPTNO equals reszleg.DEPTNO select new { dolgozo.ENAME, dolgozo.SAL, reszleg.DNAME }; VAGY Lazy Loading kihasználásával: var dolgozok = from dolgozo in NE.EMP select new { dolgozo.ENAME,dolgozo.SAL,dolgozo.DEPT.DNAME }; OE-NIK HP 35

36 V 1.0 ORM használatának előnyei A kódban sehol sem használunk dialektus függő SQL utasításokat –Bármikor dialektust/szervert válthatunk a kód átírása nélkül A string formátumú SQL utasítások helyett a fordítás közben szintaktikailag ellenőrzött lekérdező formátumot használunk –A fordítás közben kiderül, ha a bárhol szintaktikai hiba van A string formátumú SQL paraméterek (string összefűzés) helyett változókat használunk lekérdezés paraméterként –SQL injection elkerülése A lekérdezések eredménye nem általános anonymous típus / objektum / asszociatív tömb –Helyette erősen típusos ismert típusú érték / példány / lista Az ORM rétegre +1 réteg elhelyezésével könnyedén megoldható az adatforrás tetszőleges cseréje és a kód tesztelése –Repository Pattern, Dependency Injection Pattern OE-NIK HP 36

37 V 1.0 Feladatok 1.Adjunk hozzá a projekthez egy „Service-Based Database” elemet EmpDept.mdf névvel, ezt töltsük föl az orademo.sql –ből, majd hozzunk létre Entity osztályokat! 2.Határozzuk meg részleg nevenként a dolgozók átlagjövedelmét (jövedelem = fizetés+jutalék)! 3.Határozzuk meg a legnagyobb (legtöbb főt foglalkoztató) részleg minden adatát! 4.Melyik a legkisebb összfizetésű munkakör? / Írjuk ki a munkaköröket átlagfizetés szerinti sorrendben. 5.Kik azok a dolgozók, akik az elnök felvétele utáni 30 napon belül lettek felvéve? OE-NIK HP 37

38 V 1.0 Táblák Oracle demo táblák OE-NIK HP 38

39 V 1.0 OE-NIK HP 39 Források … és még soksok link az msdn.microsoft.com –ról … és még soksok link a stackoverflow.com –ról LINQ: Reiter István: C# jegyzet (http://devportal.hu/content/CSharpjegyzet.aspx), 250. oldal (A könyv az alap LINQ to Objects-et tartalmazza)

40 V 1.0 OE-NIK HP 40

41 41 OE-NIK HP


Letölteni ppt "V 1.0 OE-NIK HP 1 Haladó Programozás Adatbázis-elérési módszerek összehasonlítása Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése."

Hasonló előadás


Google Hirdetések