Tworzenie interfejsów do bazy
Tworzenie interfejsów do bazy
danych z wykorzystaniem
danych z wykorzystaniem
technologii ADO.Net
technologii ADO.Net
2informatyka +
Obiektowe spojrzenie na bazę danych
Baza danych Model logiczny bazy danych Procedury składowane Obiekt „BazaDanych” Atrybuty obiektu Metody obiektuSQLServer
Interfejs „Form”
Środowisko śieciowe
Wykonaj przelew z konta A na konto B 1.Zapytanie o stan konta A
2.Odpowiedź – stan Konta A 3.Rozpoczęcie transakcji 4.Odpowiedź na polecenie
5.Zmiejszenie stanu konta A 6.Odpowiedź na polecenie
7.Zwiekszenie stanu konta B 8.Odpowiedź na polecenie 9. Zakończenie transakcji 10.Odpowiedź na polecenie Wykonane
A teraz inne podejście
A teraz inne podejście
SQL Server
Iterfejs „Form”
Środowisko śieciowe
Wykonaj przelew z konta A na konto B Metoda
„WykonajPrzelew”
1.Wykonaj metodę „…Przelew” 2.Odpowiedź z metody
Dostęp do baz danych
Dostęp do baz danych
(.NET Framework 3.5) (.NET Framework 3.5)
7
informatyka +
Wymagania wstępne
• Podstawowa znajomość Visual Studio (.NET 2003, 2005 lub 2008)
• Podstawowa znajomość języka C#
• Podstawowa znajomość serwera baz danych MS SQL Server (2000, 2005, 2008)
• Szczere chęci do nauki ;-)
8
informatyka +
Agenda
• Architektura aplikacji korzystających z baz danych
• Jaką architekturę wybrać i kiedy?
• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę? • Co oferuje .NET Framework w zakresie dostępu do danych? • Planowanie i implementacja warstwy dostępu do danych
• Metoda „na piechotę”
• Data Access Application Block (Enterprise Library) • LINQ to SQL
• mało? ... krótki przegląd innych możliwości • Podsumowanie i wnioski
9
informatyka +
Architektura aplikacji
•Nie ma architektury doskonałej
•Nie ma doskonałego procesu wytwórczego
•Każde z podejść sprawdza się różnie w różnych projektach
10
informatyka
+“We know why projects fail, we know how to prevent their failure -- so why do they still fail?”
Martin Cobb
"Wiemy, dlaczego projekty upadają, wiemy jak zapobiec tym upadkom – więc dlaczego one ciągle upadają ?"
Architektura aplikacji
Kilka „oczywistych oczywistości” :
•Dostęp do danych jest uzyskiwany praktycznie w każdej aplikacji.
• Zwykle, jako ze źródła danych, korzysta się z bazy danych • W kodzie aplikacji, jego znaczna część dotyczy
pobierania/modyfikowania danych
• Po wdrożeniu aplikacji pojawia się konieczność jej rozwijania i ulepszania
11
informatyka
+Architektura aplikacji c.d.
• W ciągu kilkudziesięciu ostatnich lat wypracowano cały szereg dobrych praktyk dotyczących zarówno samego procesu wytwarzania
oprogramowania jak i planowania jego architektury
• W ramach wykładu zajmiemy się małym fragmentem tej dziedziny
• W praktyce ważne jest znalezienie rozsądnego kompromisu pomiędzy
planowaną architekturą aplikacji, a czasem potrzebnym na jej zastosowanie i celowością korzystania z niej w konkretnej sytuacji
12
WYMAGANIE:
„Ma zapewnić ochronę przed
deszczem”
Który wariant wybrać
???
Architektura aplikacji c.d.
•
Skupmy się na typowej, prostej architekturze warstwowej13
informatyka
+Agenda
• Architektura aplikacji korzystających z baz danych
• Jaką architekturę wybrać i kiedy?
• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę?
• Co oferuje .NET Framework w zakresie dostępu do danych? • Planowanie i implementacja warstwy dostępu do danych
• Metoda „na piechotę”
• Data Access Application Block (Enterprise Library) • LINQ to SQL
• mało? ... krótki przegląd innych możliwości • Podsumowanie i wnioski
14
informatyka +
Architektura aplikacji c.d.
„Jedyną stałą rzeczą w projekcie są zmiany”
Aby uniknąć problemów przy rozbudowie i modyfikowaniu aplikacji:
• należy dobrze zdefiniować jakie operacje będą wykonywane na danych (interfejs warstwy dostępu do danych)
• należy wydzielić kod odpowiedzialny za przekazywanie poleceń do bazy danych i odbieranie od niej rezultatów
• w takim przypadku, aplikacja nie musi znać żadnych szczegółów (z jaką bazą się łączyć, jakie zapytanie wykonać, z jakiej procedury składowanej skorzystać itp..)
• łatwiej jest szacować nakład pracy potrzebny na implementację
15
informatyka
+Agenda
• Architektura aplikacji korzystających z baz danych
• Jaką architekturę wybrać i kiedy?
• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę? • Co oferuje .NET Framework w zakresie dostępu do danych?
• Planowanie i implementacja warstwy dostępu do danych • Metoda „na piechotę”
• Data Access Application Block (Enterprise Library) • LINQ to SQL
• mało? ... krótki przegląd innych możliwości • Podsumowanie i wnioski
16
informatyka +
Jak skorzystać z bazy danych?
.NET Framework 3.5 oferuje kilka interfejsów pomocnych przy komunikowaniu się z bazami danych. Klasy implementujące te interfejsy pełnią następujące role:
•IDbConnection
• odpowiedzialna za zdefiniowanie i zarządzanie połączeniem z bazą danych
• IDbCommand
• odpowiedzialna za zbudowanie polecenia, które będzie wysłane do bazy danych za pośrednictwem połączenia
• IDataReader
• umożliwia odbieranie rezultatu wykonania polecenia przez bazę danych
• IDbParameter
• pozwala na definiowanie parametrów polecenia przekazywanego do bazy danych, lub odbierania wartości parametrów wyjściowych •IDataAdapter
• pozwala na zdefiniowanie operacji CRUD (Create, Read, Update, Delete) dla określonej tabeli w bazie danych
17
informatyka +
Agenda
• Architektura aplikacji korzystających z baz danych • Jaką architekturę wybrać i kiedy?
• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę? • Co oferuje .NET Framework w zakresie dostępu do danych? • Planowanie i implementacja warstwy dostępu do danych
• Metoda „na piechotę”
• Data Access Application Block (Enterprise Library) • LINQ to SQL
• mało? ... krótki przegląd innych możliwości • Podsumowanie i wnioski
18
informatyka +
19
Na początek…
• Potrzebujemy pomysłu na przykładową aplikację bazodanową…
• …Są jakieś?
• …i tak nie mamy dość czasu, żeby je przedyskutować ;-) • W takim razie proponuje skorzystać z wcześniej
przygotowanego:
20
Wymagania stawiane aplikacji
Dzienniczek ucznia ma umożliwiać: 1.Wyświetlenie listy uczniów
2.Wystawienie oceny ucznia z wybranego przedmiotu
3.Wyświetlenie średniej arytmetycznej ze wszystkich ocen ucznia
4.Wyświetlenie listy wszystkich ocen ucznia
5.Wyświetlenie listy ocen uczniów z wybranego przedmiotu
21
Struktura aplikacji
Przygotowane zostało rozwiązanie (solution) zawierające projekty niezbędne do zademonstrowania funkcjonowania aplikacji i mechanizmów dostępu do danych.informatyka +
22
Warstwa prezentacji
23
Warstwa biznesowa
24
Klasy warstwy biznesowej
25
Definicja interfejsu IStudentNotesDB
• definiuje operacje, które będą
wykonywane na danych
• korzysta z interfejsu
IDataReader
•Jest podstawą do budowania
implementacji warstwy dostępu do
danych
26
Diagram bazy danych
• skrajnie proste rozwiązanie
• zawiera przykładowe procedury składowane
Agenda
• Architektura aplikacji korzystających z baz danych • Jaką architekturę wybrać i kiedy?
• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę? • Co oferuje .NET Framework w zakresie dostępu do danych? • Planowanie i implementacja warstwy dostępu do danych
• Metoda „na piechotę”
• Data Access Application Block (Enterprise Library) • LINQ to SQL
• mało? ... krótki przegląd innych możliwości • Podsumowanie i wnioski
27
informatyka +
28
Metoda „na piechotę”
Komunikacja z baza danych (typowy scenariusz):
1.Utworzenie połączenia z bazą (SqlConnection)
2.Utworzenie polecenia do wykonania (SqlCommand) 3.Otwarcie połączenia
4.Wykonanie polecenia (ExecuteReader(), 5.ExecuteScalar(), ExecutenonQuery())
6.Przetworzenie wyników (iteracja po SqlDataReader) 7.Zamknięcie połączenie
29
Metoda „na piechotę” – ogólna koncepcja
30
Metoda „na piechotę” – praktyczne rozwiązanie
31
Metoda „na piechotę” – zwrócenie SqlDataReadera
Parametr CommandBehavior.CloseConnection pozwala na zwrócenie obiektu SqlDataReader, który automatycznie zamknie połączenie z bazą gdy zostanie wykonana jego metoda Close().
32
Metoda „na piechotę” – korzystanie z parametrów
• zamiast parametrów można po prostu „skleić” fragmenty polecenia wplatając w odpowiednie miejsca wartości parametrów. Jest to jednak
NIEBEZPIECZNE i może być wykorzystane do przeprowadzenia ataku typu SQL Injection
• korzystanie z parametrów eliminuje większość takich zagrożeń
33
Metoda „na piechotę” – korzystanie z parametrów
• najwygodniej jest skorzystać z procedury składowanej
• można używać parametrów wejściowych, wyjściowych oraz korzystać z wartości zwracanej (return value)
34
Metoda „na piechotę” – SchoolController
35
Metoda „na piechotę” – aplikacja desktopowa
•Ilość kodu niezwiązanego z logiką aplikacji (obsługa zdarzeń, sterowanie zachowaniem kontrolek itp.) jest minimalna i sprowadza się do wywołania metody obiektu controller.
•Aplikacja nie ma i nie musi mieć żadnych informacji na temat sposobu uzyskania dostępu do bazy danych.
36
Metoda „na piechotę” - podsumowanie
• Kod budowany w oparciu o stałe szablony • Łatwo popełniać błędy
• Bez korzystania z procedur składowanych – silna zależność od struktury bazy i zapytań
• Wielokrotne powtarzanie tego samego kodu różniącego się niewielkimi fragmentami
• Korzystanie z tego sposobu niechybnie prowadzi do
wniosku, że można by to nieco uprościć (poprzez tworzenie uogólnionych metod)
37
Metoda „na piechotę” – podsumowanie cd.
• NIE TRZEBA JEDNAK TEGO ROBIĆ!
•Wielu ludzi wpadło na ten pomysł wcześniej i często udostępniają swoje wynalazki innym.
• Najlepiej jednak korzystać ze sprawdzonych,
przemyślanych i dobrze udokumentowanych rozwiązań – jeżeli trafimy na problem, to istnieje spora szansa, że już ktoś się z nim spotkał i znalazł rozwiązanie.
38
Metoda „na piechotę” – podsumowanie cd.
• Nie korzystaliśmy z klas DataSet, SqlDataAdapter,
TableAdapter – są to rozwiązania opisane w każdej książce i najprostszym tutorialu dotyczącym dostępu do danych w
.NET.
• Pozornie są one wygodne i szybko da się „wyklikać” w ten sposób gotowy mechanizm, ale szybko okazuje się, że jest on niezbyt wydajny, nadaje się tylko do typowych rozwiązań i trudno go modyfikować.
Agenda
•
Architektura aplikacji korzystających z baz danych • Jaką architekturę wybrać i kiedy?• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę?
• Co oferuje .NET Framework w zakresie dostępu do danych?
• Planowanie i implementacja warstwy dostępu do danych
• Metoda „na piechotę”
• Data Access Application Block (Enterprise Library)
• LINQ to SQL
• mało? ... krótki przegląd innych możliwości • Podsumowanie i wnioski
39
informatyka +
40
DAAB – koncepcja
Źródło:Dokumentacja DAAB
41
DAAB – tworzenie kodu dostępu do danych
Typowy scenariusz komunikacji z bazą:
1. Utworzenie instancji klasy Database 2. Wywołanie metody utworzonej instancji
Cechy rozwiązania:
• Nie trzeba martwic się o otwieranie i zamykanie połączeń
• Nie trzeba martwić się o definiowanie parametrów (czasem trzeba…)
• Zwięzły i czytelny kod
• Odporność na błędy – wbudowana obsługa
• Szczególnie wygodne rozwiązanie przy korzystaniu z procedur składowanych
42
DAAB – tworzenie kodu dostępu do danych cd.
informatyka +
43
DAAB – konfigurowanie aplikacji
• DAAB można konfigurować za pomocą wygodnego narzędzia
• Otwiera się w nim plik konfiguracyjny aplikacji
• Po „wyklikaniu” konfiguracji narzędzie tworzy odpowiednie wpisy w pliku konfiguracyjnym aplikacji
• na podstawie tych wpisów klasa DatabaseFactory tworzy odpowiednie obiekty i konfiguruje je do komunikacji z
właściwą bazą
44
DAAB – konfigurowanie aplikacji cd.
informatyka +
45
DAAB – konfigurowanie aplikacji cd.
informatyka +
46
DAAB – zmiany w aplikacji
• Żeby skorzystać z nowej implementacji warstwy dostępu do danych wystarczy:
• dodać do aplikacji referencję do projektu zawierającego kod dostępu do danych
• zmodyfikować plik konfiguracyjny aplikacji za pomocą narzędzia Enterprise Library Configuration
• W klasie SchoolController zmodyfikować konstruktor
47
DAAB – podsumowanie
• Znaczne uproszczenie kodu • Poprawa wydajności
• Spójna obsługa błędów • Wygodna konfiguracja
• Bogata dokumentacja i wsparcie
http://msdn.microsoft.com/en-us/library/cc467894.aspx
Agenda
• Architektura aplikacji korzystających z baz danych • Jaką architekturę wybrać i kiedy?
• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę? • Co oferuje .NET Framework w zakresie dostępu do danych? • Planowanie i implementacja warstwy dostępu do danych
• Metoda „na piechotę”
• Data Access Application Block (Enterprise Library) • LINQ to SQL
• mało? ... krótki przegląd innych możliwości • Podsumowanie i wnioski
48
informatyka +
49
LINQ to SQL – wprowadzenie
• LINQ – Language Integrated Query
• Język zapytań zostaje wbudowany w języki programowania •Programista nie martwi się szczegółami i niezależnie od
źródła danych używa tej samej składni LINQ w celu budowania zapytań i manipulowania danymi
•Istnieje kilka wariantów LINQ przeznaczonych do współpracy z różnymi źródłami danych
• LINQ to SQL współpracuje TYLKO z SQL Server 2005 lub 2008
50
LINQ to SQL – architektura
51
LINQ to SQL – korzystanie
• Podstawą przy pracy z LINQ to SQL jest stworzenie modelu:
52
LINQ to SQL – korzystanie cd
• Tworzenie może odbywać się „ręcznie” lub za pomocą wygodnego narzędzia (designera)
• Praca z designerem sprowadza się do przeciągania i upuszczania obiektów z bazy (tabel, widoków, procedur składowanych i funkcji).
• Na tej podstawie zostaje wygenerowany kod klas odpowiadających tym obiektom
• Łatwo można modyfikować i rozszerzać zachowanie wygenerowanych klas
• Nie trzeba w kodzie aplikacji umieszczać żadnego kodu
SQL!
• Nie trzeba tworzyć samodzielnie encji biznesowych
(Student, Note, Subject…)
53
LINQ to SQL – praca z modelem
54
LINQ to SQL – praca z modelem
Model utworzony z trzech tabel i jednej procedury składowanej
55
LINQ to SQL – Model
• Relacje na modelu odpowiadają kluczom obcym i powodują tworzenie dodatkowych właściwości w wygenerowanych
klasach.
• Np. klasa Student będzie miała właściwość StudentNotes
56
LINQ to SQL – DataContext
•Efekt pracy z modelem – klasa DataContext
•Zawiera właściwości
odpowiadające tabelom i widokom oraz metody odpowiadające
procedurom i funkcjom
57
LINQ to SQL – Encje (tabele i widoki)
58
LINQ to SQL – klasa (odpowiednik IStudentNotesDB)
59
LINQ to SQL – korzystanie w aplikacji
60
LINQ to SQL – podsumowanie
• Korzystanie z LINQ to SQL pozwala uniknąć pisania sporej ilości kodu ( jest generowany automatycznie)
• Dotyczy to również pisania poleceń SQL
• Poprzez korzystanie z widoków, wyzwalaczy oraz funkcji i procedur składowanych można mieć w szczególnych
przypadkach wpływ na postać poleceń wykonywanych przez bazę danych
61
LINQ to SQL – podsumowanie cd.
•Można na tę postać wpływać także przez konfigurowanie właściwości klas modelu
• LINQ to SQL zapewnia wydajność na akceptowalnym poziomie i pozwala uniknąć wielu typowych błędów przy tworzeniu zapytań SQL.
• Zapewnia przyspieszenie procesu tworzenia kodu • Działa tylko z SQL Server 2005 i 2008 :(
Agenda
• Architektura aplikacji korzystających z baz danych • Jaką architekturę wybrać i kiedy?
• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę? • Co oferuje .NET Framework w zakresie dostępu do danych? • Planowanie i implementacja warstwy dostępu do danych
• Metoda „na piechotę”
• Data Access Application Block (Enterprise Library) • LINQ to SQL
• mało? ... krótki przegląd innych możliwości
• Podsumowanie i wnioski
62
informatyka +
63
Inne rozwiązania
• Subsonic (http://subsonicproject.com )
•nHibernate (https://www.hibernate.org/343.html ) •ADO.NET Entity Framework
(http://msdn.microsoft.com/en-us/library/bb399572.aspx )
Agenda
• Architektura aplikacji korzystających z baz danych • Jaką architekturę wybrać i kiedy?
• Na co zwrócić uwagę, żeby później nie pluć sobie w brodę? • Co oferuje .NET Framework w zakresie dostępu do danych? • Planowanie i implementacja warstwy dostępu do danych
• Metoda „na piechotę”
• Data Access Application Block (Enterprise Library) • LINQ to SQL
• mało? ... krótki przegląd innych możliwości
• Podsumowanie i wnioski
64
informatyka +
65
Podsumowanie
• Dokonaliśmy bardzo krótkiego i pobieżnego przeglądu technik organizowania dostępu do danych.
• Zaznaczyliśmy ich charakterystyczne cechy i różnice w koncepcjach
• Sprawdziliśmy w praktyce ich działanie • Wymyślanie/korzystanie z rozwiązań
dostępu do danych nie jest celem w samym sobie!
66
Podsumowanie cd.
•Warstwa dostępu do danych jest tylko jednym z „klocków” wchodzących w skład aplikacji
• Ważne jest, żeby zdawać sobie sprawę z konsekwencji
nieprzyłożenia właściwej wagi do sensownego zaplanowania architektury aplikacji
• Problemy pojawiają się nie przy tworzeniu, ale przy rozwijaniu i modyfikowaniu aplikacji.
• Właściwe podejście pozwala uniknąć tych problemów
•Warto sporo czytać na temat dobrych praktyk dotyczących planowania i tworzenia aplikacji