LINQ - PRZEŁOM W PROJEKTOWANIU APLIKACJI BAZODANOWYCH



Podobne dokumenty
TEMAT ĆWICZENIA Zapoznanie z technologią LINQ

Leszek Stasiak Zastosowanie technologii LINQ w

Przestrzenne bazy danych Podstawy języka SQL

Systemy GIS Tworzenie zapytań w bazach danych

Relacyjne bazy danych. Podstawy SQL

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Database Connectivity

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Wykład 6. SQL praca z tabelami 3

Relacyjne bazy danych. Podstawy SQL

Microsoft SQL Server Podstawy T-SQL

Wprowadzenie do Doctrine ORM

Wykład 9 Kolekcje, pliki tekstowe, Przykład: Notatnik

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Oracle PL/SQL. Paweł Rajba.

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

ZAPOZNANIE SIĘ ZE SPOSOBEM PRZECHOWYWANIA

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

Programowanie obiektowe

Oracle11g: Wprowadzenie do SQL

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

Plan. Raport. Tworzenie raportu z kreatora (1/3)

Wprowadzenie do baz danych

LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

P o d s t a w y j ę z y k a S Q L

SQL (ang. Structured Query Language)

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

PHP: bazy danych, SQL, AJAX i JSON

Tworzenie zapytań do Microsoft SQL Server

Language INtegrated Query (LINQ)

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Podstawy programowania. Podstawy C# Tablice

Bazy danych - wykład wstępny

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Wykład 5. SQL praca z tabelami 2

ITA-103 Aplikacje Internetowe. Piotr Bubacz. Moduł 9. Wersja 1. LINQ w ASP.NET

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

DECLARE VARIABLE zmienna1 typ danych; BEGIN

LINQ TO SQL w dużym skrócie jest to zintegrowany język zapytao pozwalający na mapowanie relacyjnych baz danych na model obiektowy.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

4 Web Forms i ASP.NET Web Forms Programowanie Web Forms Możliwości Web Forms Przetwarzanie Web Forms...152

Bazodanowe usługi sieciowe w technologii ASP.NET. dr inż. Tomasz Tatoń

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Imię i Nazwisko Data Ocena. Laboratorium 7

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Część I Tworzenie baz danych SQL Server na potrzeby przechowywania danych

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Programowanie obiektowe

Ćwiczenie zapytań języka bazy danych PostgreSQL

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

Baza danych. Baza danych to:

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

Część I Rozpoczęcie pracy z usługami Reporting Services

Autor: Joanna Karwowska

Bazy danych. Polecenia SQL

Wykład XII. optymalizacja w relacyjnych bazach danych

Ref. 7 - Język SQL - polecenia DDL i DML

Autor: Joanna Karwowska

Spis treści. Przedmowa

Szkolenie autoryzowane. MS Tworzenie zapytań do Microsoft SQL Server Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje

Założenia do ćwiczeń: SQL Server UWM Express Edition: \SQLEXPRESS. Zapoznaj się ze sposobami użycia narzędzia T SQL z wiersza poleceń.

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

Język SQL podstawy zapytań

Wprowadzenie do baz danych

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Przykład powyżej pokazuje, że w zapytaniu można umieszczać funkcje zarówno zdefiniowane w ramach środowiska, jak również własne.

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

Kwerenda. parametryczna, z polem wyliczeniowym, krzyżowa

Wprowadzenie do projektu QualitySpy

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

PLAN WYKŁADU BAZY DANYCH PODSTAWOWE KWESTIE BEZPIECZEŃSTWA OGRANICZENIA DOSTĘPU DO DANYCH

Struktura drzewa w MySQL. Michał Tyszczenko

Bazy danych. dr Radosław Matusik. radmat

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Laboratorium Technologii Informacyjnych. Projektowanie Baz Danych

Oracle PL/SQL. Paweł Rajba.

Bazy danych 2. Wykład 6

Podstawowe pojęcia dotyczące relacyjnych baz danych. mgr inż. Krzysztof Szałajko

Kostki OLAP i język MDX

Podstawowe funkcje dodatku linq w C#

Projektowanie systemów baz danych

Wykład 4. Architektura ADO.NET Dostawcy danych Modele dostępu do danych model połączeniowy Model bezpołączeniowy. Bazy danych 2

Transkrypt:

Scientific Bulletin of Che lm Section of Mathematics and Computer Science No. 1/2008 LINQ - PRZEŁOM W PROJEKTOWANIU APLIKACJI BAZODANOWYCH GRZEGORZ WIŚNIEWSKI Państwowa Wyższa Szkoła Zawodowa w Chełmie Streszczenie. W niniejszej publikacji chciałbym przedstawić LINQ - nowoczesny, a zarazem bardzo prosty sposób osadzania zapytań dotyczących zbiorów danych w środku kodu w języku C# oraz VB.NET. Źródłem może być XML, kolekcja.net czy właśnie baza danych. 1. Wstęp LINQ (czyt. Link) - Language Integrated Query - zapytania zintegrowane z językiem programowania. Technologia LINQ pojawiła się wraz z platformą.net w wersji 3.5. LINQ to mechanizm ułatwiający pracę z danymi po stronie aplikacji. Dane mogą pochodzić z: - bazy danych (LINQ to sql), - dokumentów xml (LINQ to xml), - zwykłych obiektów (LINQ to objects). Można zastosować na nich takie operacje jak: projekcje lub złączenia. LINQ zapożyczył z języka SQL sposób budowania zapytań. Każdy programista mający kontakt z językiem SQL nie będzie miał większych problemów z tworzeniem zapytań LINQ [2]. Należy także wspomnieć o słowie kluczowym var - daje ono możliwości określania typu zmiennej lokalnej przy inicjalizacji - jest to jedna z nowości języka C# 3.0 i platformy.net 3.5. Typ zmiennej jest ustalany przez kompilator na podstawie wartości użytej do inicjalizacji: var i = 5; -> int i =5; var lancuch = "Slowo"; -> string lancuch = "Slowo"; var liczby = new int [ ] {1,2,3}; -> int[ ] liczby = new int[ ] {1,2,3}; Trzeba jednak zauważyć, że inicjalizacja zmiennej musi nastąpić w tej samej linii kodu co deklaracja. Dzięki zastosowaniu słowa kluczowego var można odczytywać dane z nieznanych źródeł. Jest to bardzo przydatne przy stosowaniu zapytań LINQ. 325

326 GRZEGORZ WIŚNIEWSKI Rysunek 1. Architektura LINQ [7] Według twórców języka C#, w niektórych przypadkach zapytanie LINQ może o 40% skrócić ilość kodu w stosunku do tradycyjnych metod dostępu do danych. 2. LINQ - ADO.NET LINQ to ADO.NET pozwala nam podpiąć do naszego programu relacyjne bazy danych. Omówię dwie metody: - LINQ to DataSet, - LINQ to SQL. 2.1. LINQ to DataSet. Po skonfigurowaniu kontrolki DataSet (konfiguracja polega na ustaleniu łańcucha połączenia, wydaniu polecenia SQL) istnieje możliwość modyfikowania i wyświetlania danych z bazy danych (MS Acces, SQL Server). Dane są uzyskiwane z bazy za pomocą polecenia SQL SELECT, po uzyskaniu danych połączenie jest zawieszane. Do zapisu danych służą polecenia: UPDATE, DELETE, INSERT. Dla pozostałych kontrolek aplikacji kontrolka DataSet jest źródłem danych - buforuje zawartość tabeli, przechowuje informacje o relacjach i strukturze bazy danych [1]. Aby połączyć się z bazą danych za pomocą kontrolki DataSet należy skopiować plik zawierający bazę danych do katalogu danej aplikacji, a następnie należy dodać go do projektu aplikacji. Gdy pojawi się kreator komponentu DataSet, należy wskazujać w nim interesującą tabelę (w tym przypadku jest to tabela pracownik). Do projektu dodany zostanie plik HotelDataSet.xsd i towarzyszące mu pliki zawierające definicję klasy HotelDataSet. Można umieścić teraz na formie programu kontrolkę DataGridView i jako źródło danych wybierać klasę HotelDataSet. Utworzony zostanie obiekt składowy klasy formy Form1 o nazwie hoteldataset oraz hoteldatasetbindingsource. We właściwości DataMember komponentu hoteldatasetbindingsource należy wskazać tabelę pracownik. Ukażą się na formie rekordy bazy danych.

LINQ - PRZEŁOM W PROJEKTOWANIU APLIKACJI BAZODANOWYCH 327 Komponent hoteldatasetbindingsource pozwala na filtrowanie i sortowanie danych z tabeli. We właściwości Filtr można wpisać miejscowosc== Chelm - dzięki temu zostaną wyświetlone osoby mieszkające w Chełmie. Natomiast we właściwości Sort nazwisko, imie - dane zostaną posortowane po nazwisku, następnie imieniu rosnąco. Rysunek 2. Baza danych Hotel Wszystko to dzieje się za pomocą kreatorów przy użyciu myszki. Czas teraz na LINQ. Na początku należy zadeklarować klasę człowiek. class Czlowiek { public int pesel; public string nazwisko; public string imie; public string miejscowosc; } Następnie należy utworzyć zapytanie LINQ, które pobierze kolekcję osób mieszkających w Chełmie. var pracownik chelm = from człowiek in hoteldataset.pracownik where człowiek.miejscowosc== Chelm orderby czlowiek.nazwisko slecet New człowiek {pesel=człowiek.pesel, nazwisko=człowiek.nazwisko, imie=człowiek.imie, miejsowosc=człowiek.miejscowosc}; Po wykonaniu zapytania LINQ tworzymy obiekt DataTable. DataTable tableka=new DataTable("pracownik chelm"); Następnie należy zbudować strukturę tabeli. Czlowiek first = pracownik chelm.first(); DataColumn pesel = new DataColumn("pesel"); pesel.allowdbnull = false; pesel.datatype = first.pesel.gettype();

328 GRZEGORZ WIŚNIEWSKI DataColumn nazwisko = new DataColumn("nazwisko"); nazwisko.datatype = first.nazwisko.gettype(); DataColumn imie = new DataColumn("imie"); imie.datatype = first.imie.gettype(); DataColumn miejscowosc = new DataColumn("miejscowosc"); miejscowosc.datatype = first. miejscowosc.gettype(); tabelka.columns.add(pesel); tabelka.columns.add(nazwisko); tabelka.columns.add(imie); tabelka.columns.add(miejscowosc); Na koniec należy uzupełnić dane w tabeli. Foreach(Czlowiek czlowiek in pracownik chelm) { DataRow wiersz = tabelka.newrow(); wiersz["pesel"] = czlowiek.pesel; wiersz["nazwisko"] = czlowiek.nazwisko; wiersz["imie"] = czlowiek.imie; wiersz["miejscowosc"] = czlowiek.miejscowosc; tabelka.rows.add(wiersz); } Poprzez polecenie hoteldataset.tables.add (tabelka) należy dodać tabelę do hotel- DataSet. Kod z użyciem LINQ powoduje natychmiastową konwersję tabeli do kolekcji. Konwersja z kolekcji na tabele wymaga nieco więcej linii kodu. Korzyści z LINQ to DataSet: - odczytywanie danych w jednej linii kodu, dzięki któremu uzyskamy ten sam efekt co paroma liniami starego kodu, - możliwość sortowania i filtrowania pobieranych danych. Jest to duży plus, gdyż pod operatory orderby i where możemy podstawić każde wyrażenie języka C#, - łączenie danych z różnych tabel; dzięki operatorowi join możemy łączyć dane pochodzące z różnych tabel. Rola kontrolki DataSet w środowisku.net 3.5 zmalała, gdyż pojawiło się lepsze rozwiązanie - LINQ to SQL, gdzie uzyskuje się bezpośredni dostęp do bazy danych. 2.2. LINQ to SQL - bezpośredni dostęp do baz danych. Zapytanie LINQ jest przez kompilator tłumaczone na polecenie SQL, które jest wysyłane do bazy danych. Na początku należy za pomocą klasy DataContext połączyć się z bazą danych. Następnie podczas pobierania danych używana jest klasa encji, która definiuje typ każdej encji tabeli bazy danych. Każdy element klasy encji powiązany jest z kolumnami w bazie danych za pomocą atrybutów [1]. Jest to pewnego rodzaju połączenie między bazą danych a programem, dzięki temu istnieje możliwość używania w zapytaniu LINQ nazw pól z tabeli. Dzięki klasie DataContext i klasie encji można połączyć się z bazą danych i pobierać dane z tabeli.

LINQ - PRZEŁOM W PROJEKTOWANIU APLIKACJI BAZODANOWYCH 329 Tabela 1: Metody składające się na LINQ Operacja Metoda Pobieranie danych Select, SelectMany Sortowanie OrderBy, ThenBy, OrderByDescending, ThenByDescending, Reverse Filtrowanie Where Operacje arytmetyczne Aggregate, Average,Count, LongCount, Max, Min, Sum Konwersja Cast, OfType, ToArray, ToDictionary, ToList, ToLookup, ToSequence Pobieranie elementów Element DefaultIfEmpty, ElementAt, ElementAtOrDefault, First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault Porównanie EqualAll Tworzenie Empty, Range, Repeat Grupowanie GroupBy Łączenie GroupJoin, Join Wybór i pomijanie Skip, SkipWhile, Take, TakeWhile elementów Kwantyfikatory All, Any, Contains Operacje na zbiorach Concat, Distinct, Except, Intersect, Union Baza danych hoteli i pracowników pracujących w tych hotelach, przedstawiona na rysunku 2, jest bardzo dobrym przykładem do ukazania jak uzyskać szczegółowe dane np. o pracownikach. Należy utworzyć klasę encji związaną z tabelą pracownik, która zawiera się w bazie danych. [Table(Name = "pracownik")] public class czlowiek { [Column(Name="pesel", IsPrimaryKey = true)] public Int pesel; [Column(Name="imie",CanBeNull = false)] public string imie; [Column(Name="nazwisko",CanBeNull = false)] public string nazwisko; [Column(Name="miejscowosc",CanBeNull = false)] public string miejscowosc; } Następnie zainicjować obiekt klasy DataContext (znajduje się ona w przestrzeni nazw System.Data.Linq). static string baza = "hotel.mdf"; static DataContext baza hotel = new DataContext(System.IO.Path.GetFullPath(ścieżka bezwzględna pliku)); static Table<czlowiek> pracownik = baza hotel.gettable<czlowiek>();

330 GRZEGORZ WIŚNIEWSKI Po utworzeniu połączenia można pobierać już dane. Przykładowo można uzyskać listę osób mieszkających w Chełmie: var pracownik chelm=from czlowiek in pracownik where miejscowość= Chełm select człowiek; i zmienić miejsce zamieszkania dla pracowników: Jana i Barbary Kowalskich na Lublin. var pracownik kowlaski=from czlowiek in pracownik where nazwisko= Kowalski select człowiek; //pobranie danych foreach (czlowiek czlowiek in pracownik kowalski) czlowiek.miejscowosc= Lublin ; //modyfikacja baza hotel.submitchanges(); //zapisanie zmian Jak łatwo zauważyć, zapytania LINQ są bardzo podobne do poleceń SQL (SELECT pracownik.imie, pracownik.nazwisko FROM pracownik WHERE miejscowość = Chelm ;), a zarazem sam kod staje się łatwiejszy i bardziej czytelny. Kolejnym argumentem przemawiającym na korzyść LINQ jest sprawdzanie poprawności składni na poziome kompilacji. 3. LINQ to XML Największą zaletą LINQ jest uniwersalny sposób dostępu do danych pochodzących z różnych źródeł. Dzięki temu programista znający LINQ, jego składnie i operatory, potrafiący budować zapytania będzie w stanie wyciągnąć dane z kolekcji, bazy danych czy plików XML. LINQ pozwala także na nowy sposób zapisu plików XML. W plikach XML możemy przechowywać na przykład ustawienia programu, które, przy ponownym uruchomieniu, zostaną automatycznie załadowane [1]. Do utworzenia pliku XML potrzebujemy zaznajomić się z kilkoma konstruktorami: - XDocument - tworzący dokument (np. XDocument xml = new XDocument();), w nim zawiera się cały kod dodający obiekty do pliku, - XDeclaration - deklaracja (np. XDeclaration deklaracja = new XDeclaration ( 1.0, utf-8, yes );), wersja pliku, kodowanie, - XComment - komentarz (np. new XComment ( plik XML )), - XElement - elementy główne (np. new XElement ( nazwa, parametr)). Na samym końcu następuje kod służący do zapisu pliku na dysk : xml.save( nazwa ). Na dysku w katalogu ścieżka dostępu do projektu\bin\debug pojawia się plik nazwa.xml. Do odczytu służy kod: XDocument nazwa = new XDocument.Load ( nazwa pliku ). Klasa XDocument pozwala wczytać cały plik XML. Elementy wczytanego pliku udostępniane są za pomocą zbioru własności. Własność Root zapewnia dostęp do elementu głównego, jego zawartość udostępniają metody Elements, Nodes, Descendants, które zawierają kolekcje elementów. Descendants pozwala na uzyskanie kolekcji elementów występujących na różnych poziomach drzewa, pozwala przefiltrować za pomocą nazwy

LINQ - PRZEŁOM W PROJEKTOWANIU APLIKACJI BAZODANOWYCH 331 podanej w argumencie. Metoda Elements udostępnia możliwość odczytu każdego elementu, warunkiem jest znanie nazwy elementu i podanie jej jako parametr metody Elements. LINQ to XML może służyć do przenoszenia danych z jednej bazy danych do drugiej, a także do wymiany danych między aplikacjami: - plik XML widziany jest jako zwykły plik tekstowy, - pliki XML mają możliwość przechowywania danych zgromadzonych na wielu encjach o tej samej strukturze (tabele). Dla przykładu można napisać program, który pozwoli nam na przeniesienie danych z jednej bazy pliku XML. Plik ten można później odczytać w innej bazie i zaimportować zawarte w nim rekordy. { XDocument xml = new XDocument ( new XDeclaration ("1.0", "utf-8", "yes"), new XElement ("Pracownicy", from czlowiek in pracownik orderby czlowiek.nazwisko slect new XElement ("Pracownik", new XAttribute ("Pesel", człowiek.pesel), new XElement ("Nazwisko", człowiek.nazwisko), new XElement ("Imie", człowiek.imie), new XElement ("Miejscowość", człowiek.miejscowosc) ) ) ); xml.save("pracownicy.xml"); } 4. Podsumowanie Obecnie prawie każda firma korzysta z aplikacji bazodanowych, większość z nich nie wie czym jest SQL, LINQ, XML. Dla nich nie ma różnicy czy programista korzysta z LINQ czy programuje po staremu. Firmy chcą, aby ich programy działały dobrze i niezawodnie. Ale dzięki LINQ praca programisty staje się łatwiejsza. LINQ ma pełne wsparcie IntelliSense i Debugera. Dzięki tym dwóm czynnikom programowanie aplikacji bazodanowych jest szybsze od starych metod i mamy możliwość wyłapania błędów w składni na poziomie kompilacji. Bibliografia [1] Matulewski J., C#3.0 i.net 3.5. Technologia LINQ, Helion 2008. [2] Czasopismo Software Developer s Journal, Kwiecień, Czerwiec, Lipiec 2008. [3] http://www.hookedonlinq.com/linqtosql5minuteoverview.aspx [4] http://www.hookedonlinq.com/linqtoxml5minuteoverview.aspx [5] http://hookedonlinq.com [6] http://msdn2.microsoft.com/pl-pl/netframework/aa904594(en-us).aspx [7] http://www.codeproject.com/kb/linq/understandinglinq.aspx

332 GRZEGORZ WIŚNIEWSKI LINQ - A TURNING-POINT IN A DATABASE APPLICATION PROJECTING GRZEGORZ WIŚNIEWSKI Abstract. The author of this publication wants to put forward LINQ. It is a modern but at the same time really simple way to set a questions referring to data collections in the middle of the code in the C# programming language and VB.NET. The source of it could be XML, collection.net or just database.