450 likes | 616 Views
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. Haladó Programozás.
E N D
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éseDefault 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 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) OE-NIK HP
1. Inicializálás string connStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=nikdb;User ID=nik;Password=kin"; SqlConnection conn; privatevoid button15_Click(object sender, EventArgs e) { conn = newSqlConnection(connStr); conn.Open(); MessageBox.Show("CONNECTED"); } OE-NIK HP
1. Inicializálás (alternatívák: MySQL, Postgre) caseserver_type.mysql: FConnStr = "server = " + FServer + ";\n" + "database = " + FDb + ";\n" + "user id = " + FUser + ";\n" + "password = " + FPass + ";\n"; FDatabase_Connection = newMySqlConnection(FConnStr); break; caseserver_type.postgre: FConnStr = "server = " + FServer + ";\n" + "database = " + FDb + ";\n" + "user id = " + FUser + ";\n" + "password = " + FPass + ";\n"; FDatabase_Connection = newNpgsqlConnection(FConnStr); break; OE-NIK HP
1. Inicializálás (alternatíva: Oracle) caseserver_type.oracle: FConnStr = "data source = " + FServer + ";\n" + "user id = " + FUser + ";\n" + "password = " + FPass + ";\n"; FDatabase_Connection = newOracleConnection(FConnStr); break; OE-NIK HP
2. INSERT privatevoid button18_Click(object sender, EventArgs e) { SqlCommand comm = newSqlCommand("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 privatevoid button18_Click(object sender, EventArgs e) { SqlCommand comm = newSqlCommand("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 privatevoid button18_Click(object sender, EventArgs e) { SqlCommand comm = newSqlCommand("delete from EMP where empno=1000", conn); SqlDataReader reader=comm.ExecuteReader(); MessageBox.Show(reader.RecordsAffected.ToString()); reader.Close(); } OE-NIK HP
5. SELECT privatevoid button14_Click(object sender, EventArgs e) { listBox1.Items.Clear(); SqlCommand comm = newSqlCommand("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
6. BIND privatevoid button13_Click(object sender, EventArgs e) { dataGridView1.DataSource = null; dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); dataGridView1.AllowUserToAddRows = false; SqlCommand comm = newSqlCommand("select * from EMP order by ename", conn); SqlDataReader reader = comm.ExecuteReader(); while (reader.Read()) { [GRIDVIEW FELTÖLTÉSE] } reader.Close(); } 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 privatevoid button5_Click(object sender, EventArgs e) { eMPTableAdapter.Fill(nikdbDataSetVariable.EMP); MessageBox.Show("CONNECTED"); } OE-NIK HP
2. INSERT privatevoid 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 privatevoid 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 privatevoid 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! OE-NIK HP
5. SELECT privatevoid 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
6. BIND privatevoid 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
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 • CodeFirst: 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 • ModelFirst: 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, NuGetinstall-packageEntityFramework 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 providerfor SQL Server <OK> ) • Server name = (localdb)\v11.0 , Databasename = EMPDEPT <OK> • "Databasedoesnotexists. Attempttocreate?" <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 newdatasource, Database <NEXT>; Entitydatamodel <NEXT>; Generatefromdatabase <NEXT>; LocalDB legyen a legördülő menüben + saveconnectionsettings <NEXT>; Mindegyik tábla mellett pipa + Pluralizeobjectnames + Modelnamespace = EMPDEPTModel <FINISH> • Templatecanharmyour computer, click ok torun ... <OK> <OK> ( http://msdn.microsoft.com/en-us/data/jj206878 ) OE-NIK HP
1. Inicializálás • nikdbEntities NE = newnikdbEntities(); az „NE.EMP” és „NE.DEPT” adattagok LINQ adatforrásként használhatóak: varreszleg = NE.DEPT.First(); vardolg = fromdolgozoin NE.EMP wheredolgozo.ENAME.Contains("E") selectdolgozo; nikdbEntities NE; privatevoid button4_Click(objectsender, EventArgs e) { NE = newnikdbEntities(); MessageBox.Show("CONNECTED"); } OE-NIK HP
2. INSERT privatevoid button1_Click(object sender, EventArgs e) { var ujdolg = newEMP() { ENAME = "BELA", MGR = null, DEPTNO = 20, EMPNO = 1000 }; NE.EMP.AddObject(ujdolg); NE.SaveChanges(); MessageBox.Show("DONE"); } OE-NIK HP
3. UPDATE privatevoid 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 privatevoid 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 privatevoid button9_Click(object sender, EventArgs e) { listBox1.Items.Clear(); foreach (var dolg inNE.EMP.Where(dolgozo => dolgozo.SAL >= 3000)) { listBox1.Items.Add(dolg.ENAME); } } OE-NIK HP
6. BIND privatevoid button10_Click(object sender, EventArgs e) { dataGridView1.Columns.Clear(); dataGridView1.Rows.Clear(); dataGridView1.DataSource = null; var dolgozok = from dolgozo in NE.EMPorderby dolgozo.ENAME select dolgozo; dataGridView1.DataSource = dolgozok; } OE-NIK HP
+1 JOIN var dolgozok = from dolgozo in NE.EMP join reszleg in NE.DEPT on dolgozo.DEPTNO equals reszleg.DEPTNO selectnew { dolgozo.ENAME, dolgozo.SAL, reszleg.DNAME }; var dolgozok = from dolgozo in NE.EMP selectnew { dolgozo.ENAME, dolgozo.SAL, dolgozo.DEPT.DNAME }; 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 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