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 OE-NIK HP
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 OE-NIK HP
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-ben default: LocalDB, API-kompatibilis, de szerver-szolgáltatás helyett igény szerint induló library (Data Source = (localdb)\v11.0) Mi ezt fogjuk használni OE-NIK HP
SQL SERVER 2008 bejelentkezés Két fajta bejelentkezési mód: SQL Server Authentication és Windows authentication, nekünk az előbbi a jó, de alapértelmezetten az Express változatnál csak az utóbbi van engedélyezve Engedélyezés: Microsoft SQL Server 2008 R2 RTM - Management Studio Express: http://www.microsoft.com/en-us/download/details.aspx?id=22985 "Upgrade Microsoft Visual Studio 2008 to the SP1 before installing SQL Server 2008. Visual Studio SP1 can be found at http://go.microsoft.com/fwlink/?LinkId=159627." "New installation or add features" ablakon keresztül install, reboot http://www.microsoft.com/en-us/download/ details.aspx?id=29062 MSSQL 2012 Express OE-NIK HP
SQL Management Studio Ezt a folyamatot a laborgépeken NEM kell végigjátszani, a .\SQLEXPRESS szerverbe „nik” felhasználóval, „kin” jelszóval be tudunk lépni, és a „nikdb” adatbázisban ott találhatóak az Oracle rendszerben megszokott EMP és DEPT táblák Windows authentication móddal kell belépni.\SQLEXPRESS –be "Object Explorer" -ben gyökérelemre jobbkatt, Properties, Security > Server authentication: SQL Server AND Windows authentication Database létrehozásakor „Owner User” megadása kell, felhasználó létrehozásakor „Default Database” megadása kell … Lehetne módosítani később, de nem kell, jó lesz így, az új adatbázis tulajdonosa a Windows felhasználónk lesz... OE-NIK HP
SQL Management Studio Databases-re jobbkatt, New Database name: nikdb , owner: default, <OK> Security\logins -re jobbkatt, New Login name: nik, SQL server authentication, password: kin "Enforce password policy"-ből pipa kiszedése Default database: nikdb Security\logins\nik -re jobbkatt, Properties User Mapping, felső listában a nikdb mellé pipa; alsó listában a db_denydatareader és db_denydatawriter KIVÉTELÉVEL mindegyik mellé pipa SQL management studio -ból kilépünk Start Menu\Programs\Microsoft SQL Server 2008 R2\Configuration Tools\SQL Server Configuration Manager: SQL Server services/SQL Server, jobbkatt, restart OE-NIK HP
SQL Management Studio A szerver elindulása után lépjünk vissza az SQL management studio-ba User: nik, Pass: kin, "SQL server authentication" csatlakozás Databases\nikdb- re jobbkatt new query SQL_empdept.sql copypaste, <execute> (forrás: http://nik.uni-obuda.hu/hp/) Databases\nikdb\Tables dept & emp (és nem northwind) OE-NIK HP
DbConnection vs DataSet vs LINQ Különböző absztrakciós szintek 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 Az „Alapvető műveletek” listán fogunk mindegyik módszernél végigmenni http://www.akadia.com/services/dotnet_data_reader.html OE-NIK HP
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 OE-NIK HP
ADO.NET: DbConnection/DbReader Régi stílusú adatbázis-elérés (nem MVC) 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) RPC utasítás: Remote Procedure Call = Tárolt eljárás Az utódosztályok elnevezése a DbCommand és DbDataReader esetén is ugyanezt a mintát követi OE-NIK HP
1. Inicializálás string connStr = @"Data 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
1. 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: FDatabase_Connection = new NpgsqlConnection(FConnStr); OE-NIK HP
1. 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
2. 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
3. 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
4. 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
5. 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(); Cél: azon nevekkel feltölteni egy listboxot, akiknek a fizetése >= 3000 OE-NIK HP
6. 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(); Adatkötés létrehozása: cél dataGridView-hoz csatolni az adattáblát. Értelemszerűen alacsonyszintű kapcsolat esetén nem lehetséges kézzel kell feltölteni OE-NIK HP
6. 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
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 OE-NIK HP
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
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
1. Inicializálás private void button5_Click(object sender, EventArgs e) { eMPTableAdapter.Fill(nikdbDataSetVariable.EMP); MessageBox.Show("CONNECTED"); } OE-NIK HP
2. 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
3. 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
4. DELETE private void button6_Click(object sender, EventArgs e) { DataRow dr = nikdbDataSetVariable.EMP.Rows[0]; dr.Delete(); nikdbDataSetVariable.AcceptChanges(); eMPTableAdapter.Update(nikdbDataSetVariable); } DataRow dr = nikdbDataSetVariable.EMP.Select("empno=1000")[0]; // EZ NEM A LINQ EXTENSION METHOD, CSAK UGYANAZ A NEVE! A kód papíron működik (VS2005-ben még ezt használtam ) … Most teszteltem VS2010 alatt: mintha működne (a 14 soros táblánál 14x működik, 15-ödszörre ahogy kell, kiakad, hogy „dataset is empty”)… Közben meg fizikailag a táblából nem töröl semmit valamiért: a program újraindítása után a táblában megint 14 sor van. OE-NIK HP
5. 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()); } Cél: azon nevekkel feltölteni egy listboxot, akiknek a fizetése >= 3000 OE-NIK HP
6. 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; } Mindegy h hogyan állítom be az adatforrást OE-NIK HP
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 OE-NIK HP
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 OE-NIK HP
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) ( http://msdn.microsoft.com/en-us/magazine/hh148150.aspx ) OE-NIK HP
Entity Data Model – SQLExpress / MSSQL Ha van meglévő MSSQL vagy SQLExpress adatbázisunk, akkor a connection string-ben lévő adatok segítségével tudunk ehhez csatlakozni (host, user, pass, catalog) Data sources: Add new data source, Database, Entity Data Model Generate from database Data Connection kiválasztása Include sensitive data, save in app.config Táblák kiválasztása után <FINISH> EDMX diagram 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 OE-NIK HP
LocalDB létrehozása (EF v6) Entity Framework version 6, NuGet install-package EntityFramework mi nem ezt fogjuk választani Csak már elmentett Solution esetén működik! Project, Add New Item, Service-based Database Adatbázisból egyből osztályokat tudunk létrehozni az <ADD> gomb után (Data Source Configuration Wizard) Többnyire itt „Cancel” kell, ha az adatbázis még nincs kész, és manuálisan kell létrehozni az adatokat, majd EZUTÁN tudjuk az osztályokat létrehozni ( http://msdn.microsoft.com/ en-us/library/vstudio/ms233763%28v=vs.110%29.aspx ) OE-NIK HP
LocalDB létrehozása (EF v4.3 / v5) Server Explorer -> Right click (Data Connections) -> Add Connection ( Microsoft SQL Server + .Net provider for SQL Server <OK> ) Server name = (localdb)\v11.0 , Database name = EMPDEPT <OK> "Database does not exists. Attempt to create?" <YES> Ú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 data source, Database <NEXT>; Entity data model <NEXT>; Generate from database <NEXT>; LocalDB legyen a legördülő menüben + save connection settings <NEXT>; Mindegyik tábla mellett pipa + Pluralize object names + Model namespace = EMPDEPTModel <FINISH> Template can harm your computer, click ok to run ... <OK> <OK> ( http://msdn.microsoft.com/en-us/data/jj206878 ) http://users.nik.uni-obuda.hu/szabozs/install/DATABASES/INIT%20SQL%20scripts/ora_MS_INIT.sql http://users.nik.uni-obuda.hu/hp/SQL_empdept.sql OE-NIK HP
1. Inicializálás nikdbEntities NE = new nikdbEntities(); az „NE.EMP” és „NE.DEPT” adattagok LINQ adatforrásként használhatóak: var reszleg = NE.DEPT.First(); var dolg = from dolgozo in NE.EMP where dolgozo.ENAME.Contains("E") select dolgozo; nikdbEntities NE; private void button4_Click(object sender, EventArgs e) { NE = new nikdbEntities(); MessageBox.Show("CONNECTED"); } OE-NIK HP
2. INSERT private void button1_Click(object sender, EventArgs e) { var ujdolg = new EMP() ENAME = "BELA", MGR = null, DEPTNO = 20, EMPNO = 1000 }; NE.EMP.AddObject(ujdolg); NE.SaveChanges(); MessageBox.Show("DONE"); } OE-NIK HP
3. UPDATE private void button2_Click(object sender, EventArgs e) { var valaki = NE.EMP.Single(x => x.EMPNO == 1000); valaki.ENAME = "JOZSI"; NE.SaveChanges(); MessageBox.Show("DONE"); } OE-NIK HP
4. DELETE private void button3_Click(object sender, EventArgs e) { var valaki = NE.EMP.Single(x => x.EMPNO == 1000); NE.EMP.DeleteObject(valaki); NE.SaveChanges(); MessageBox.Show("DONE"); } OE-NIK HP
5. SELECT private void button9_Click(object sender, EventArgs e) { listBox1.Items.Clear(); foreach (var dolg in NE.EMP.Where(dolgozo => dolgozo.SAL >= 3000)) listBox1.Items.Add(dolg.ENAME); } Cél: azon nevekkel feltölteni egy listboxot, akiknek a fizetése >= 3000 OE-NIK HP
6. BIND private void button10_Click(object sender, EventArgs e) { dataGridView1.Columns.Clear(); dataGridView1.Rows.Clear(); dataGridView1.DataSource = null; var dolgozok = from dolgozo in NE.EMP orderby dolgozo.ENAME select dolgozo; dataGridView1.DataSource = dolgozok; } Mindegy h hogyan állítom be az adatforrást OE-NIK HP
+1 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 }; select new { dolgozo.ENAME, dolgozo.SAL, dolgozo.DEPT.DNAME Mindegy h hogyan állítom be az adatforrást OE-NIK HP
Feladat Az EMP táblához csatlakozzunk LINQ módszerrel, listázzuk ki a táblát DataGridView és TreeView vezérlőkben Legyen lehetőségünk a CRUD alapműveletek elvégzésére CRUD = Create, Read, Update, Delete OE-NIK HP
Források http://msdn.microsoft.com/en-us/library/bb882674 http://msdn.microsoft.com/en-us/library/ms254937 … é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) OE-NIK HP
OE-NIK HP
OE-NIK HP