W poniższym kursie będę prezentował tematy, które przerabiam w ramach Specjalizacji z uczniami 3 klasy Technikum Elektrycznego w Słupsku. Kurs ma służyć zarówno uczniom w powtórce materiału, jak i wszytkim zainteresowanym programowaniem Aplikacji Internetowych.
W każdej aplikacji, czy to internetowej, czy innej istnieje problem przechowywania danych. Przeglądarka zdjęc, czy też odtwarzacz filmów korzysta z plików zgromadzonych na naszym komputerze. Aplikacja pokazująca pogodę, łączy się z serwerem przechowującym dane i pobiera informacje nt. pogody w określonej lokalizacji. Mamy więc do czynienia z przechowywaniem danych. Najprostszym sposobem są pliki na dysku, można je zapisywać i odczytywać, zmieniać ich zawartość. Bardzo często to wystarczy i nie ma potrzeby stosowania innych rozwiązań. Jednak gdy gromadzone dane mają być w pewien sposób organizowane, sortowane, wyszukiwane, często nie da się uniknąć stosowania bardziej wyrafinowanych mechanizmów. Rozwiązaniem tego typu problemów są bazy danych. Umożliwiają one przechowywanie danych, określanie ich typów, organizowanie w tabele, łączenie jednych danych z drugimi itp.
Najprostsze bazy danych działają na tym samym komputerze na którym uruchomiona jest aplikacja, często umożliwiają najprostsze operacje i są przeznaczone do obsługi małego ruchu (małej ilości jednoczesnych połączeń). Najczęsciej stosowane proste bazy danych to mySQL, PostgreSQL, SQL Server CE, SQLite. innym rozwiązaniem jest instalacja serwera baz danych na innym, przeznaczonym głównie do tego celu, komputerze. Takie bazy danych często obsługują wiele aplikacji, mają rozbudowane systemy tworzenia kopii zapasowych oraz replikacji danych pomiędzy kilkoma serwerami baz danych. Są w stanie obsłużyć wiele połączeń i zapytań z różnych komputerów. Przykładami takich baz jest Oracle i SQL Server.
Szczęśliwie, niezależnie jak bardzo zaawansowana jest nasza baza, możemy z nią się "dogadać" w uniwersalnym dla baz "języku", mianowicie SQL. Jest to skrót od Structured Query Language, czyli strukturalny język zapytań. Co to oznacza ? Oznacza to, że my zadajemy do bazy danych "pytania" a baza nam na nie odpowiada. Od nas zależy o co zapytamy, lub jakie wydamy jej polecenie do wykonania. Do podstawowje obsługi baz danych, wystarczą 4 rodzaje zapytań/poleceń:
Stąd nazwa podstawowego zestawu poleceń, CRUD.
Zanim jednak zaczniem z bazą "rozmawiać" musimy przygotowac naszą bazę na przechowywanie danych. Pierwszym krokiem jest założenie bazy. W programie WebMatrix robimy to z panelu Bazy Danych (lewy dolny róg), wybieramy polcenie Nowa baza danych a następnie Baza danych SQL Server CE (jest to prosta baza danych przechowywana na dysku w postaci jednego pliku). Nadajemy jej nazwę, w naszym przypadku niech to będzie forum.sdf. Przy nadawaniu nazy bazy, należy unikać spacji oraz polskich liter, znacznie ułatwi to późniejsze z niej korzystanie.
Ok.Mamy bazę co dalej. Załóżmy, że nasza baza będzie przechowywała dane dotyczące tworzonego forum. Na początek musimy przechować konta użytkowników, tak aby po pierwszej rejestracji mogli się później zalogować na swoje konto. Docelowo edziemy też potrzebowali struktury do przechowywania wpisów użytkowników. Takie struktury w bazie danych nazywamy Tabelami. Definicja tabeli przypomina definicję klasy z obiektowych języków programowania, nie ma co prawda metod, są natomiast właściwości, a każda z nich ma określony typ danych. Definicja tabeli w bazie danych przedstawia więc nazwy i typy pól jakie będziemy przechowywać.
Dane w tabeli przechowywane są w wierszach zwanych rekordami, trochę podobnie jak ma to miejsce np. w Excelu, kolumnami są określone pola, wiersze odpowiadają kolejnym rekordom z tabeli. Aby jednoznacznie zidentyfikować określony wiersz w bazach danych stosuje się identyfikatory (w Excelu będzie to numer wiersza - liczba).
Aby dodać tablę przy pomocy WebMatrix, klikamy na naszą nowo utworzoną bazę, i klikamy w ikonę Nowa tabela, w górne pole wpisujemy nazwe tabeli, w naszym przypadku niech to bedzie Uzytkownicy. Poniżej, w postaci tabelki, mamy definicję pól tabeli. Pierszym dodanym polem będzie identyfikator, pole to nazwiemy Id:
Nazwa: Id
Typ danych: int
Jest kluczem podstawowym: Tak - ozanacza to że nie może być 2 rekordów z taką samą wartością pola Id
Jest tożsamością: Tak - oznacza to, że wartośc tego pola będzie automatycznie wyliczana
kolejne pola to:
Login, nvarchar(50)
Password, nvarchar(50)
Email, nvarchar(150)
Typ nvarchar oznacza w przypadku bazy SQL Server typ string (zapisany w bazie danych przy pomocy kodowania unicode), wartośc w nawiasie oznacza maksymalną ilośc znaków przchowywaną w tym polu. Do przechowywania logina i hasła wystarczy 50, na email przeznaczymy sobie więcej, 150 powinno wystarczyć.
Zapisujemy zmiany w naszej bazie (ikona dyskietki w lewym górnym rogu) i testowo doamy sobie 2 rekordy do naszej bazy: klikamy w ioknę Dane i dodajemy 2 wiersze do naszej tabeli, pomijając pole Id, wartość tego pola wyliczy się automatycznie.
Jak wspominałem dostep do danych zgromadzonych w bazie otrzymujemy przy pomocy zapytań w języku SQL, poniżej podstawowa forma zapytania SQL służącego odczytywaniu danych z bazy:
SELECT Pole1,Pole2,Pole3 ...
FROM NazwaTabeli
Wywołanie takiego zapytania zwróci nam listę wszystkich rekordów z tabeli NazwaTabeli. Po słowie kluczowym SELECT podajmy listę pól które nas interesują, kązdy zwrócony rekord będzie zawierał pola, których nazwy podaliśmy. Nie ma więc potrzeby pobierania wszystkich pól, możemy równiez zwrócić pola w określonej kolejności.
Jeśli chcemy posortowac zwrócone dane, polecenie SELECT rozszerzamy o część dostyczącą sortowania, zaczyna się ona słowem kluczowym ORDER BY:
SELECT Pole1,Pole2
FROM NazwaTabeli
ORDER BY Pole1
Rekordy zostaną zwrócone w kolejności określonej przez wartośc pola Pole1, jeśli jest to pole tekstowe zostanie użyta kolejność alfabetyczna, w przypadku pół liczowych, pierwsze zostaną zwrócone te rekory w których wartośc pola Pole1 będzie najmniejsza. Czasem istnieje koniecznośc sortowania po większej ilości pól (np. kolejnośc alfabetyczna w dzienniku, sortowanie po nazwisku i imieniu), wtedy pola po kótórych sortujemy rozdzielamy znakiem ,
SELECT Pole1,Pole2
FROM NazwaTabeli
ORDER BY Pole1, Pole2
W przypadku gdy chcemy odwrócić kolejnośc sortowania (np. od największej liczby do najmniejszej), do nazwy pola dodajemy słowo kluczowe DESC
SELECT Pole1,Pole2
FROM NazwaTabeli
ORDER BY Pole1 DESC, Pole2
Najczęsciej zdarza sie tak, że nie potrzebujemy na raz wszystkich rekordów z określonej tabeli. Możemy ograniaczyć zestaw zwróconych rekordów poprzez dodanie do zapytania sekcji WHERE będącej zestawem warunków, które musi spełniać kazdy zwracany rekord.
SELECT Pole1,Pole2
FROM NazwaTabeli
WHERE Pole1 = 10 and Pole2 = 20
Jak widac warunki mozna łączyć przy pomocy opratorów binarnych AND oraz OR
Poleceniem SQL używanym do dodawania nowych danych do bazy jest INSERT INTO oto jego składnia
INSERT INTO NazwaTabeli (Pole1,Pole2.....)
VALUES (WartośćPola1,WartośćPola2,...)
Po słowie kluczowym INSERT INTO podajemy nazwy pól które ustawimy dodając nowy rekord do bazy. Najczęściej będą to wszystkie pola (oprócz automatycznie wyliczanego pola z indetyfikatorem), jednek czasami możemy podać tylko niektóre z nich. VALUES określa wartości tych pól, w takiej samej kolejności w jakiej podaliśmy pola
Wcześniej dodane dane możemy aktualizować, do tego celu stouje się polecenie UPDATE
UPDATE NazwaTabeli
SET Pole1=WartośćPola1, Pole2=WartoścPola2
WHERE WarunekOkreślającyKtóreRekordyAktualizować
To które rekordy będą zaktualizowane decyduje sekcja WHERE. Uwaga, brak seskcji WHERE spowoduje aktualizację wszystkich rekordów w tabeli, należy więc uważać. Najczęscie warunek ten przyjmuje formę:
...
WHERE Id=23
Oznacza to że zaktualizowany zostanie tylko ten rekod w którym pole Id = 23.
Jesłi jakieś rekordy już są niepotrzebne, np. zostały błednie dodane, możemy je z bazy usunąć:
DELETE FROM NazwaTabeli
WHERE WarunekKtóreUsunąć
Podobnie jak w przypadku UPDATE należy koniecznie podać warunek określający, które rekordy mają być usunięte, brak warunku WHERE oznacza, że wszystkie dane zostaną usunięte
Poniżej przestawiam gotowy kod strony umożliwiającej rejestrowanie i logowanie użytkowników. Dodałem niezbędne komentarze.
Założenie: mamy utworzoną bazę Forum.sdf, w bazie istnieje tabela User składająca się z pól: Id, Login, Password
@{ //łączenie z bazą Forum.sdf z katalogu App_data var db = Database.Open("Forum"); var text = "Nie jesteś zalogowany"; //czy reejestracja nowego użytkownika var newlogin = Request.Form["newlogin"]; if (newlogin!=null) { //szukaj czy użytkownik istnieje w tabeli User var users = db.Query("select login,password from [User] where login=@0",newlogin); //pobranie pierszego rekordu ze zwróconych var user = users.FirstOrDefault(); //jesli nie znajdzie w bazie to user==null if (user!=null) { text = "Użytkownik o podanym loginie już istnieje"; } else { //tworzenie nowego użytkownika var newpassword = Request.Form["newpassword"]; db.Execute("insert into [User] (login,password) values (@0,@1)",newlogin,newpassword); text = "Użytkownik "+newlogin+" został założony"; } } var login = Request.Form["login"]; //czy użytkownik się loguje if (login!=null) { //szukanie użytkownika w bazie var users = db.Query("select login,password from [User] where login=@0",login); var user = users.FirstOrDefault(); //jesli nie znajdzie w bazie to user==null if (user!=null) { //czy hasło się zgadza if (Request.Form["password"]==user["password"]) { //użytkownik podał prawidłowe hasło text = "Zalogowałeś się jako "+ login; } else { text = "Nieprawidłowe hasło"; } } else { text = "Nieprawidłowy użytkownik"; } } } <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title></title> </head> <body> <div>@text</div> <form method="post"> Login: <input type="text" name="login"><br/> Hasło: <input type="password" name="password"><br/> <input type="submit" /> </form> <h1>Zakładanie konta</h1> <form method="post"> Login: <input type="text" name="newlogin"><br/> Hasło: <input type="password" name="newpassword"><br/> <input type="submit" /> </form> </body> </html>