50
Modern adatbázis- elérés 9. előadás Bolla Kálmán MCTS

Modern adatbázis-elérés

  • Upload
    milla

  • View
    47

  • Download
    0

Embed Size (px)

DESCRIPTION

Modern adatbázis-elérés. 9. előadás. Bolla Kálmán MCTS. .NET nyelvi újdonságok. Automatikus tulajdonság. Nem kell létrehoznunk sem az adattagot (mező), sem a hozzá tartozó tulajdonságot, mivel a fordító mindkettőt legenerálja nekünk Programkód rövidebb és átláthatóbb lesz Példa: - PowerPoint PPT Presentation

Citation preview

ASP.NET

Modern adatbzis-elrs9. eladsBolla KlmnMCTS1.NET nyelvi jdonsgokAutomatikus tulajdonsgNem kell ltrehoznunk sem az adattagot (mez), sem a hozz tartoz tulajdonsgot, mivel a fordt mindkettt legenerlja neknkProgramkd rvidebb s tlthatbb leszPlda:class Person{ public string Name { get; set; }}A fordt automatikusan ltrehoz egy private elrs, string tpus name nev adattagot, s elkszti hozz a getter-t/setter-t isHozzfrs mdosthat (pl.: private set;)Visual Studio code snippet:prop + TAB + TAB

Objektum inicializls mskppenLtezik az objektumok inicializlsnak egy alternatv mdja, ami a tulajdonsgokat hasznlja felrtkadshoz kapcsos zrjelet hasznlunk s megnevezhetjk (tetszleges sorrendben), hogy minek szeretnnk rtket adniPlda:class Person{ public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; }}rtkads:Person p = new Person{ FirstName = "Istvn", LastName = "Kiss", Age = 22};

Bvt fggvnyekEgy nem ltalunk rt osztlyt ki tudunk egszteni fggvnyekkelLambda kifejezseknl s Linq-nl sokszor hasznljuk (ezekrl majd ksbb)Vannak beptett bvt fggvnyek, de mi is ltre tudunk hozni sajtotIntellisense-ben rzsaszn doboz + nylPlda:int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };double avg = numbers.Average(); //Average egy bvt metdus

var tpusHa az egyenlsg jobb oldaln tallhat tpus egyrtelm, akkor a fordt is ki tudja tallni a tpustProgramkd olvashatbb vlik tleFleg, ha hossz osztlynevek vannakPldul:DriverCardApplicationIdentification obj = new DriverCardApplicationIdentification();Helyett:var obj = new DriverCardApplicationIdentification();Hasznlatkor egybl inicializlni kell, ha nem adunk rtket neki, a fordt hibt fog jelezniIlyet nem lehet:var obj; //hiba!

Nvtelen tpusokA .NET C# 3.0 szintaktikja megengedi gynevezett nvtelen tpusok ltrehozstA nvtelen tpus valjban nvvel is rendelkezik, de ezt a fordtprogram jl eldugja ellnkSok esetben nincs szksgnk egy objektum minden adatra, ilyenkor feleslegesen foglaln egy lekrdezs eredmnye a memrit A nvtelen tpusok bevezetse lehetv teszi, hogy helyben deklarljunk egy nvtelen osztlytvar p = new{ FirstName = "Istvn", LastName = "Kiss", Age = 2};Console.WriteLine(p.FirstName + " " + p.LastName + ": " + p.Age);Az rtkads itt teljesen megegyezik az elbbivel, viszont a new kulcssz utn nincs megadva semmilyen konstruktor neve

Lambda kifejezsekEgy nvtelen fggvnynek felel megMinden lambda kifejezsben van lambda opertor: =>Jelentse az, hogy legyenOpertor (=>) bal oldaln a bemen vltozk, jobb oldalon pedig a bemeneten alkalmazott kifejezs llGyakran a bvt metdusok paramtereiPlda:List words = new List(); words.Add("alma"); words.Add("krte"); words.Add("szilva");

var fruits = words.Where(f => f.Contains('a'));

Label1.Text = "";foreach (var item in fruits){ Label1.Text += item + " ";}8Linq9LinqLinq = Language Integrated Query (Nyelvbe gyazott lekrdezs)Hasonlt az SQL nyelvhezF klnbsg, hogy a select a lekrdezs vgn van, a from pedig legellEgysges felletet biztost adatforrsok kezelshezVan Intellisense tmogatsSQL lekrdezseket tudjuk vele helyettesteniMr fordtsi idben kiderlnek a hibk!Linq kifejezsek Extension method-okk s Lambda kifejezsekk fordulnak leA lekrdezs csak akkor fut le, ha valahol hasznljuk az eredmnyt!Lazy Loading

10Honnan krdezetnk le?Objektum (Linq to Objects)Relcis adatbzis (Linq to SQL, Linq to Entites, Linq to DataSet)XML (Linq to XML)

Linq plda s elemzsstring[] fruits = { "alma", "krte", "szilva" };

var query = from f in fruits where f.Contains('a') select f;

foreach (string fruit in query){ Response.Write(fruit + "
");} fruits: adatforrs (datasource)f: vltoz; adatforrs egy elemt reprezentlja (range variable), esetnkben ez egy string lesz; ezt mindig a from utn kell megadni, neve brmilyen vltoznv lehetwhere f.Contains('a'): felttelknt azt adtuk meg, hogy csak azok a string-ek kellenek, ami a bett tartalmaznakselect f: kivlasztjuk azokat a string-eket, amik a felttelnek megfelelnek

whereboolean felttel(eke)t fogad (prediktum): !=, ==, bool-t visszaad metdusok, stb.Szelekci, segtsgvel vlaszthatjuk ki a neknk megfelel objektumokat

var queryLowNums = from num in numberswhere num < 5select num;13selectEzzel tudjuk kivlasztani az elemeket, vagy csak azok valamely rszt (akr tbbet is, nvtelen objektumok)Mindig a lekrdezs vgn vanintoHa van allekrdezsnk, akkor az into kulcsszval lehetsgnk van az allekrdezs eredmnyt egy vltozba elmenteniselect, Elemek egy rsznek kivlasztsaEmployee osztlyban rjuk le a dolgoztpublic class Employee { public int EmployeeID { get; set; } public string Name { get; set; } public decimal Salary { get; set; } }

Employess egy lista, amiben a dolgozkat troljuk List Employees = new List(); //fel kell tlteni adatokkal a listt Employees.Add(new Employee { EmployeeID = 1, Name = "Kiss Pista", Salary = 1000 });Dolgoznak csak a nevt szeretnnk kivlasztanivar query = from emp in Employees select emp.Name;

select, Nvtelen tpus ltrehozsavar ShortEmployees = from emp in Employees select new { ID = emp.EmployeeID, Name = emp.Name };

foreach (var emp in ShortEmployees){ Response.Write(emp.ID + " " + emp.Name + "
");}

group (Csoportosts)Egyszer csoportosts (nem kell a select)var studentQuery1 = from student in studentsgroup student by student.Last[0];Csoportosts eredmnynek mentse vltozbavar studentQuery2 = from student in studentsgroup student by student.Last[0] into gorderby g.Keyselect g;

joinInner joinEzt hasznljuk legtbbszrCsak azok a sorok jelennek meg a lekrdezsben, amelyek pontosan kielgtik a join felttelt var innerJoinQuery = from category in categoriesjoin prod in products on category.ID equals prod.CategoryIDselect new { ProductName = prod.Name, Category = category.Name };Group joinLeft outer join

order byRendezs nvekv vagy cskken sorrendbeascending: nvekv (alaprtelmezett, nem kell kirni)descending: cskken

var sortAscendingQuery = from fruit in fruitsorderby fruit select fruit;19letLtrehozhatunk a lekrdezsben j vltoztVgig lehet rajta iterlniCsak egyszer kaphat rtketPlda: Keressk azokat a termkeket, amelyek ra maximlis

var maxProducts = from p in Products let maxPrice = Products.Max(s => s.Price) where p.Price == maxPrice select p;

var, IEnumerable, IQueryablevarAkkor hasznlhat, ha az egyenlsg jobb oldalbl egyrtelmen ki tudja a fordt tallni a tpustNvtelen tpusokat ebbe trolhatjukIEnumerableMemriban trolt adatokkal rdemes hasznlni (Linq to Objects, Linq to XML)IQueryableAdatbzisban trolt adatokkal rdemes hasznlnia lehet legtbb mveletet az adatbzisszerver hajtja vgre, gyorsabb, olcsbb mkdst eredmnyezhetMskpp kezeldnek az Extension method-ok21IGroupingAkkor rdemes hasznlni, ha pldul egy olyan fggvnyt kell rnunk, ahol a group by eredmnyt vissza kell adni

publicIEnumerableGroupedByYear(){ varcarlist=GetCarList(); vargrouped=fromcarincarlist groupcarbycar.YearSold; returngrouped; }Konverzis metdusokLehetsgnk van a lekrdezs eredmnyt listv, tmbb vagy dictionary-v alaktaniToList()List productsQuery = (from p in productswhere p.Price >= 30select p).ToList();ToArray()ToDictionary()Single(), SingleOrDefault()A lekrdezs eredmnye ltalban tbb elem szokott lenni, de lehet olyan eset, hogy tudjuk a lekrdezs eredmny egyetlen elem leszErre hasznlhatjuk a Single() metdustHa mgis tbb elemet kapnnk vissza, akkor dob egy kivteltProduct myProduct = (from p in Products where p.Name == "Beer" select p).Single();Ha szmtani lehet arra is, hogy a lekrdezs nem ad vissza semmit, akkor a SingleOrDefault() metdust ajnlott hasznlniAdatbzishoz kapcsolds Visual Studio-bl25Adatbzishoz kapcsolds Visual Studio-bl #1Tools Connect to Database Ki kell vlasztani milyen adatbzisunk van (pl.: MS SQL)Ezutn szksg van a szerver nevreVS-val kapunk egy MS SQL Express-tBe kell lltani az autentikci tpustVlasszuk ki az adatbzisunkat

Adatbzishoz kapcsolds Visual Studio-bl #2Adatbzis kapcsolatainkat a VS Server Explorer ablakban lthatjukA tblk tartalmt megnzhetjk

Pldaadatbzisok MS SQL-hezNorthwind, PubsNorthwind egy kpzeletbeli vllalat, ami lelmiszerek forgalmazsval foglalkozikInnen letlthet:http://www.microsoft.com/download/en/details.aspx?id=23654Teleptsi tmutat:http://www.gamf.hu/portal2/netsegedlet.zip02 Northwind pldaadatbzis teleptseAdventureWorksInnen letlthet:http://msftdbprodsamples.codeplex.com/releases/view/4004AdventureWorksDB.msiAdatbzisok elrse29Eddig tanult adatbzis-elrsKapcsolat alapKapcsoldunk az adatbzishoz mveleteket vgznk az adatbzison (lekrdezs, mdosts, trls) lezrjuk a kapcsolatotSQLConnection, SQLCommand, SQLDataReader,Kapcsolat nlkliLoklis msolatot ksztnk az adatbzisrl (DataSet)Kapcsolat alap pldastring connectionString = @"Data Source=.\SQLEXPRESS;InitialCatalog=Northwind;Integrated Security=True";SqlConnection conn = new SqlConnection(connectionString);conn.Open();

SqlCommand cmd = new SqlCommand("SELECT * FROM Products", conn);

SqlDataReader rdr = cmd.ExecuteReader();while (rdr.Read()){ Response.Write(rdr["ProductName"].ToString() + " " + rdr["UnitPrice"].ToString() + "
");}

conn.Close();

Mi a problmnk ezzel?Tl sok le- s felkapcsolds esetn feleslegesen terheljk az adatbzisszervertLekrdezseket, mdostsokat, trlseket string-knt adjuk megHa valamit elgpelnk, csak futsi idben derl ki!Nincs IntellisenseReader hasznlata nem tl bartsgosOszlopnevek esetn is ugyangy elgpelhetnk mindentNincs Intellisense32Kapcsolat nlkli (ADO.NET)Adatbzist memriba mentjk le egy DataSet objetumbaSima DataSet, tpusos DataSetHa vgeztnk a mdostssal szinkronizljuk az adatbzissalNincs folyamatos kapcsolattartsAz adatbzist sor s oszlopknt mutatja neknkTpusos DataSet esetn mr van tpusellenrzsTpusos DataSet ltrehozsa:Jobb klikk a projecten Add New Item DataSetDesign felletre r kell hzni a Server Explorer-bl azokat a tblkat, amiket hasznlni szeretnnkTableAdapter-ekkel kommuniklunk az adatbzissalTpusos DataSet pldadsNorthwind dsNorth = new dsNorthwind();ProductsTableAdapter taProducts = new ProductsTableAdapter();taProducts.Fill(dsNorth.Products);

foreach (dsNorthwind.ProductsRow row in dsNorth.Products){ Response.Write(row.ProductName + " " + row.UnitPrice + "
");}

Modern adatbzis-elrs35Entity FrameworkA relcis adatbzist objektum orientltan tudjuk kezelni ORM (Object Relation Mapping)Linq to SQL testvre, mkdsk hasonlMS fejlesztiNagymret projekteknl igen hasznosLekrdez nyelv a LinqHa lass lenne a lekrdezs kszthetnk magunk begyazott SQL-tKt lehetsgnk van:Database firstA relcis adatbzis mr ltezik, ebbl hozunk ltre entits osztlyokatModel firstElbb ltrehozzuk az entits osztlyokat, majd ebbl generlunk adatbzist!Idnknt hibsan mkdik, de nagyon hasznos tud lenni36Hogyan kpzdik le a relcis adatbzis OO-raA teljes relcis adatbzist egy ObjectContext fogja reprezentlniTblkbl Entits osztlyok keletkeznekOszlopokbl pedig mezk s tulajdonsgokSQLC# kdAdatbzisTblaOszlopokObjectContextEntits osztlyMezk, tulajdonsgok[Database][Table][Column]Hogyan kpzeljk el?Sorokbl lesznek entits objektumokAz ObjectContext egy entits objektum halmaznak tekinthetAz egyes mveleteket (j hozzadsa, trls, mdosts) ezen a halmazon hajtjuk vgeEntity Framework ltrehozsa #1Jobb klikk a projektre Add New Item ADO.NET Entity Data Model

Entity Framework ltrehozsa #2Ha adatbzisbl akarunk generlni entitsokat, akkor vlasszuk a Generate from database-t

Entity Framework ltrehozsa #3Vlasszuk ki az adatbzis kapcsolatot NextVlasszuk ki azokat a tblkat, amiket hasznlni szeretnnkPluralize or sigularize generated object namesEgyes szm tbbes szm talakts

Mi jtt ltre? #1Legenerlta az ObjectContext-et s az entitsokatItt a context osztlyunk az ObjectContext-tl rkl!Hasznlat eltt Build-eljnk!

Mi jtt ltre? #2Solution Explorer-ben ltrejtt egy .edmx fjl.designer.cs llomnyban vannak a generlt C# nyelv osztlyokA referencik (References) kz felvette a System.Data.Entity dll-tKonfigurcis llomnyba (web.config vagy app.config desktop alkalmazsnl) felvette a connection string-et

Lekrdezs az adatbzisbl (EF)Northwind adatbzisbl lekrdezzk a termkek nevt

//pldny az ObjectContext-blNorthwindEntities ctx = new NorthwindEntities();

//csak a termkek nevei kellenekvar productNames = from p in ctx.Products select p.ProductName;

foreach (string product in productNames){ Response.Write(product + "
");}

j sor hozzadsa (EF)Egy termk hozzadsa

Product p1 = new Product{ ProductName = "j termk", CategoryID = 1, SupplierID = 4};//hozzadjuk a DataContext-hezctx.Products.AddObject(p1);//tnylegesen ekkor kerl bele az adatbzisbactx.SaveChanges();

Lehet hasznlni a context AddToProducts() fggvnyt isSor mdostsa (EF)Egy termk mdostsa

//kikeressk az adatbzisblProduct modProduct = (from p in ctx.Products where p.ProductName == "j termk" select p).Single();

//megvltoztatjuk a nevtmodProduct.ProductName = "Mdostott termk";

//vltozsok mentsectx.SaveChanges();

Sor trlse (EF)Egy termk trlse

Product delProduct = (from p in ctx.Products where p.ProductName == "Mdostott termk" select p).Single();

//trls a DataContext-blctx.Products.DeleteObject(delProduct);

//vltozsok mentsectx.SaveChanges();

Tbbrteg alkalmazs ltrehozsaEntity Framework hasznlata tbbrteg alkalmazsbanTbbrteg alkalmazsMegjelentsi rtegWF, ASP.NET, WPF, Silverlight,zleti logikai rtegFeladat specifikus megoldsokAdatelrsi rtegKommunikci az adatbzissalKzvetlen kapcsolat, DataSet,Linq to SQL, Entity Framework,

EF hasznlata tbbrteg alkalmazsbanKell a connectionString abba a project-be, ahol hasznljuk a DAL-tEzen fell kell a System.Data.Entity dll isVan ms megolds isPOCO osztlyokat kell ltrehozni kzzel s egy sajt osztlyt, ami azObjectContext-tl rklgy mr nem kell a System.Data.Entity dll sem a connectionString