Aplikacje bazodanowe w WebMatrix

Aplikacje Internetowe: Kurs › Aplikacje bazodanowe w WebMatrix

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.

 

Bazy danych - a co to wogóle jest

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 mySQLPostgreSQLSQL Server CESQLite. 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 SQL Server.

SQL - czyli rozmawiamy z bazą w jej języku

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ń:

  • Create - dodawanie danych do bazy, polecenie INSERT
  • Read - pobieranie danych z bazy, polecenie SELECT
  • Update - aktualizacja danych, polecenie UPDATE
  • Delete - usuwanie danych, polecenie DELETE


Stąd nazwa podstawowego zestawu poleceń, CRUD.

Przygotowujemy bazę do przechowywania danych

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.sdfPrzy 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.

SQL: SELECT - czyli pobieramy dane

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

WHERE - ograniczamy dane

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

INSERT - wstawiamy nowe dane

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

UPDATE - aktualizujemy dane

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.

DELETE - pozbywamy się niepotrzebnych danych

 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


 

Strona rejestracji i logowania

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>

Komentarze

Komentarze do Aplikacje bazodanowe w WebMatrix na it.jursza.com