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 és felhasználó létrehozása MS SQL Server alatt Adatbázisok elérése DbConnection/DbReader módszerrel (Nem.

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 és felhasználó létrehozása MS SQL Server alatt Adatbázisok elérése DbConnection/DbReader módszerrel (Nem."— Előadás másolata:

1 V 1.0 OE-NIK HP 1 Haladó Programozás Adatbázis és felhasználó létrehozása MS SQL Server alatt Adatbázisok elérése DbConnection/DbReader módszerrel (Nem tananyag!) SQL server elérése DataSet módszerrel (Nem tananyag!) SQL server elérése LINQ / Entity Framework módszerrel

2 V 1.0 OE-NIK HP 2 Haladó Programozás Adatbázis és felhasználó létrehozása MS SQL Server alatt Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése DataSet módszerrel SQL server elérése LINQ / 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 („fully ACID compliant”) (Oracle, IBM, MSSQL, Sybase, Teradata ; Free: MySQL, PostgreSQL, MariaDB) Korábbi VS verziók (x<2012): Az MS-SQL szerver egy kisebb változata integrálva volt a fejlesztőeszköz telepítőjébe (SQL Express) : max 10gb/database, max 1 physical cpu, max 1gb ram (Data Source=.\SQLEXPRESS) VS 2010 óta elérhető, VS 2012-től default: LocalDB, de szerver- szolgáltatás helyett igény szerint induló library, ami egy adatbázis- file-t használ (Data Source = (localdb)\v11.0) –Ó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 Táblák Két fajta bejelentkezési mód: SQL Server Authentication és Windows authentication, mi az utóbbit használjuk Oracle demo táblák OE-NIK HP 4

5 V 1.0 DbConnection vs DataSet vs LINQ 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 DB-LINQ / 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énye 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 5

6 V 1.0 OE-NIK HP 6 Haladó Programozás Adatbázis és felhasználó létrehozása MS SQL Server alatt Adatbázisok elérése DbConnection/DbReader módszerrel (Nem tananyag!) SQL server elérése DataSet módszerrel SQL server elérése LINQ / Entity Framework módszerrel

7 V 1.0 ADO.NET: DbConnection/DbReader Régi stílusú adatbázis-elérés (nem MVC / ORM) Előny: gyors, egyszerű Hátrány: nehéz módosítani és technológiát/tárolási módszert váltani A különböző adatbázis-szerverekhez különböző implementációk Közös ős-osztá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 7

8 V Inicializálás string connStr Source=.\SQLEXPRESS;Initial Catalog=nikdb;User ID=nik;Password=kin"; SqlConnection conn; private void button15_Click(object sender, EventArgs e) { conn = new SqlConnection(connStr); conn.Open(); MessageBox.Show("CONNECTED"); } OE-NIK HP 8

9 V Inicializálás (alternatívák: MySQL, Postgre) case server_type.mysql: FConnStr = "server = " + FServer + ";\n" + "database = " + FDb + ";\n" + "user id = " + FUser + ";\n" + "password = " + FPass + ";\n"; FDatabase_Connection = new MySqlConnection(FConnStr); break; case server_type.postgre: FConnStr = "server = " + FServer + ";\n" + "database = " + FDb + ";\n" + "user id = " + FUser + ";\n" + "password = " + FPass + ";\n"; FDatabase_Connection = new NpgsqlConnection(FConnStr); break; OE-NIK HP 9

10 V Inicializálás (alternatíva: Oracle) case server_type.oracle: FConnStr = "data source = " + FServer + ";\n" + "user id = " + FUser + ";\n" + "password = " + FPass + ";\n"; FDatabase_Connection = new OracleConnection(FConnStr); break; OE-NIK HP 10

11 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 11

12 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 12

13 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 13

14 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 14

15 V BIND 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 15

16 V BIND - 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 16

17 V 1.0 OE-NIK HP 17 Haladó Programozás Adatbázis és felhasználó létrehozása MS SQL Server alatt Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése DataSet módszerrel (Nem tananyag!) SQL server elérése LINQ / Entity Framework módszerrel

18 V 1.0 ADO.NET: DataAdapter/DataSet/DataTable Régi stílusú adatbázis-elérés (nem MVC) 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 –Tipikusan csak MSSQL-lel működik normálisan (amúgy: szabványos ODBC drivereken keresztül: régi, bugos) Automatikusan generált, adatfüggő típusozott osztályoktól függ (~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: –BindingSource: Adatforrás-kapcsolat a form felé –TableAdapter: Tábla-leírás –DataSet: adatbázis-reprezentáció, táblák egységbe zárása OE-NIK HP 18

19 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: Add connection –Type: Microsoft SQL Server –Server Name:.\SQLEXPRESS, SQL Server Authentication, User: nik, Pass: kin, Save password, Database name: nikdb 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 a formra egyszerűen ráhúzzuk a táblát, máris kész az alkalmazás OE-NIK HP 19

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

21 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 21

22 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 22

24 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 24

25 V BIND 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 25

26 V 1.0 OE-NIK HP 26 Haladó Programozás Adatbázis és felhasználó létrehozása MS SQL Server alatt Adatbázisok elérése DbConnection/DbReader módszerrel SQL server elérése DataSet módszerrel SQL server elérése LINQ / Entity Framework módszerrel

27 V 1.0 LINQ: to SQL / to Entities (Entity Framework) Ránézésre hasonló: LINQ záradékok és szintaxis, Lambda kifejezések LINQ to SQL (DLINQ, DB-LINQ, L2S): csak közvetlen leképezést, és csak MSSQL dialektust támogat. Egyszerű és gyors, de nagyon korlátozottan használható („Rapid development”)  Project/Add Class/LINQ to SQL classes LINQ to Entities (ADO.NET Entity Framework, L2E): teljes ORM, N:M kapcsolatokat is támogat, és kiegészíthető alternatív adatbázis-dialektusokkal (LINQ to Oracle, NHibernate, InterLinq, LLBLGen) („Large-scale enterprise development”)  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 OE-NIK HP 27

28 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 28

29 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 29

30 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 exists. Attempt to create?" –Akár a „Create New SQL Server Database” is jó, ugyanilyen lépésekkel OE-NIK HP 30

31 V 1.0 Adatbázis feltöltése Ugyanúgy automatikusan generált osztályok, mint a DataSet esetén, csak ezek nagyrészt generikus osztályok típusparaméterezett változatai  ~30KB a két táblás adatbázis Ú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... ( ) OE-NIK HP 31

32 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 32

33 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 33

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

35 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 35

36 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 36

37 V BIND { 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 37

38 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 38

39 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 39

40 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 hozznk 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.A legkisebb összfizetésű munkakör dolgozóinak fizetését egyenlő összegekkel növeljük meg úgy, hogy a munkakör összfizetése ugyanannyi legyen, mint a második legkisebb összfizetésű munkakör összfizetése! 5.Töröljük azon dolgozókat, akik az elnök felvétele utáni 30 napon belül lettek felvéve! OE-NIK HP 40

41 V 1.0 OE-NIK HP 41 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)

42 V 1.0 OE-NIK HP 42

43 43 OE-NIK HP


Letölteni ppt "V 1.0 OE-NIK HP 1 Haladó Programozás Adatbázis és felhasználó létrehozása MS SQL Server alatt Adatbázisok elérése DbConnection/DbReader módszerrel (Nem."

Hasonló előadás


Google Hirdetések