Tworzenie interfejsów do bazy danych z wykorzystaniem technologii ADO.Net informatyka + 2 Obiektowe spojrzenie na bazę danych Baza danych Model logiczny bazy danych Procedury składowane Obiekt „BazaDanych” Atrybuty obiektu Metody obiektu Interfejs „Form” SQLServer Środowisko śieciowe Wykonane 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 A teraz inne podejście ???????????? Metoda „WykonajPrzelew” Iterfejs „Form” Wykonane Wykonaj przelew z konta A na konto B SQL Server Środowisko śieciowe 1.Wykonaj metodę „…Przelew” 2.Odpowiedź z metody Dostęp do baz danych (.NET Framework 3.5) Aplikacja Dostęp do danych Baza danych informatyka + 7 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 ;-) informatyka + 8 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 informatyka + 9 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 “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ą ?" informatyka + 10 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 informatyka + 11 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 WYMAGANIE: „Ma zapewnić ochronę przed deszczem” Który wariant wybrać ??? informatyka + 12 Architektura aplikacji c.d. • Skupmy się na typowej, prostej architekturze warstwowej Interfejs użytkownika • Zwany warstwą prezentacji • Zadanie: prezentować i pobierać dane Logika biznesowa • Definiuje obowiązujące w systemie reguły • Umożliwia realizację poleceń użytkownika Dostęp do danych • „Odcięcie” wyższych warstw od szczegółów mechanizmu dostępu do danych Baza danych • Składowanie danych informatyka + 13 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 informatyka + 14 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ę informatyka + 15 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 informatyka + 16 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 informatyka + 17 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 informatyka + 18 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: informatyka + 19 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 informatyka + 20 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 + 21 Warstwa prezentacji informatyka + 22 Warstwa biznesowa informatyka + 23 Klasy warstwy biznesowej informatyka + 24 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 informatyka + 25 Diagram bazy danych • skrajnie proste rozwiązanie • zawiera przykładowe procedury składowane informatyka + 26 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 informatyka + 27 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 informatyka + 28 Metoda „na piechotę” – ogólna koncepcja informatyka + 29 Metoda „na piechotę” – praktyczne rozwiązanie informatyka + 30 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(). informatyka + 31 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ń informatyka + 32 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) informatyka + 33 Metoda „na piechotę” – SchoolController informatyka + 34 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. informatyka + 35 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) informatyka + 36 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. nformatyka + i 37 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ć. informatyka + 38 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 informatyka + 39 DAAB – koncepcja Źródło:Dokumentacja DAAB informatyka + 40 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 informatyka + 41 DAAB – tworzenie kodu dostępu do danych cd. Przykładowy kod programu: informatyka + 42 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ą informatyka + 43 DAAB – konfigurowanie aplikacji cd. Elementy konfigurowania informatyka + 44 DAAB – konfigurowanie aplikacji cd. Wygenerowany dokument XML informatyka + 45 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 informatyka + 46 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 informatyka + 47 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 informatyka + 48 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 informatyka + 49 LINQ to SQL – architektura informatyka + 50 LINQ to SQL – korzystanie • Podstawą przy pracy z LINQ to SQL jest stworzenie modelu: informatyka + 51 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…) informatyka + 52 LINQ to SQL – praca z modelem informatyka + 53 LINQ to SQL – praca z modelem Model utworzony z trzech tabel i jednej procedury składowanej informatyka + 54 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 informatyka + 55 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 informatyka + 56 LINQ to SQL – Encje (tabele i widoki) informatyka + 57 LINQ to SQL – klasa (odpowiednik IStudentNotesDB) informatyka + 58 LINQ to SQL – korzystanie w aplikacji informatyka + 59 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 informatyka + 60 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 :( informatyka + 61 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 informatyka + 62 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 ) informatyka + 63 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 informatyka + 64 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! informatyka + 65 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 informatyka + 66 Koniec Dziękuję za uwagę. …jakieś pytania? informatyka + 67