3. Studium przypadku
Chcemy stworzyć aplikację .NET, która pozwoli użytkownikowi przeprowadzać symulacje obliczeń wynagrodzeń opiekunek dziecięcych ze stowarzyszenia „Maison de la petite enfance” w danej gminie. Zajmiemy się zarówno organizacją kodu aplikacji DotNet, jak i samym kodem.
3.1. a bazy danych
Dane statyczne potrzebne do sporządzenia karty płacowej są przechowywane w bazie danych SQL Server Express o nazwie dbpam (pam = Paie Assistante Maternelle). Administratorem tej bazy jest użytkownik o nazwie sa, którego hasło brzmi msde.
![]() |
Baza zawiera trzy tabele: EMPLOYES, COTISATIONS oraz INDEMNITES, których struktura jest następująca:
Table EMPLOYES : rassemble des informations sur les différentes assistantes maternelles
Struktura:
![]() |
|
Jego zawartość mogłaby wyglądać następująco:
![]()
Table COTISATIONS : rassemble les taux des cotisations sociales prélevées sur le salaire
Struktura:
![]() |
Jego zawartość mogłaby wyglądać następująco:
Stawki składek na ubezpieczenie społeczne są niezależne od pracownika. Powyższa tabela zawiera tylko jeden wiersz.
Table INDEMNITES : rassemble les différentes indemnités dépendant de l'indice de l'employé
![]() |
|
Jego treść mogłaby wyglądać następująco:

Należy zauważyć, że dodatki mogą się różnić w zależności od opiekunki. Są one bowiem powiązane z konkretną opiekunką poprzez jej wskaźnik wynagrodzenia. Tak więc pani Marie Jouveinal, której wskaźnik wynagrodzenia wynosi 2 (tabela EMPLOYES), ma stawkę godzinową w wysokości 2,1 euro (tabela INDEMNITES).
Związki między tymi trzema tabelami są następujące:
![]() |
Między kolumną EMPLOYES (INDICE) a kolumną INDEMNITES (INDICE) istnieje relacja klucza obcego.
W ten sposób utworzona baza danych [dbpam] generuje dwa pliki w folderze serwera SQL Server Express:
![]() |
Pliki o nazwie [dbpam.mdf, dbpam_log.ldf] można przenieść na inny komputer i ponownie podłączyć do serwera SGBD SQL Server Express na tym komputerze. Oto jak to zrobić:
- Pliki BD i [dbpam] należy skopiować do folderu
![]() |
- uruchamia się program SQL Server Express
- za pomocą klienta SQL Server Management Studio Express, a następnie dołączyć plik [dbpam.mdf] do pliku SGBD:
![]() |
![]() |
- kliknij prawym przyciskiem myszy na pliku [Databases] / Dołącz
- wybierz plik [dbpam.mdf] za pomocą przycisku [Add] (nie pokazany na obrazku)
- załączony plik spowoduje utworzenie pliku BD, który nie może już istnieć. Tutaj, w polu [Attach As] nadano nazwę [dbpam2] nowemu plikowi BD.
- Widoczny jest nowy plik BD wraz z jego tabelami
Ta technika dołączania pliku BD jest przydatna do przenoszenia pliku BD z jednego stanowiska na inne i będziemy z niej czasami korzystać w tym miejscu.
3.2. Sposób obliczania wynagrodzenia opiekunki do dzieci
Przedstawiamy teraz sposób obliczania miesięcznego wynagrodzenia opiekunki do dzieci. Jako przykład posłużymy się wynagrodzeniem pani Marie Jouveinal, która przepracowała 150 godzin w ciągu 20 dni w miesiącu rozliczeniowym.
Uwzględniono następujące elementy: | | |
Wynagrodzenie podstawowe opiekunki do dzieci oblicza się według następującego wzoru: | ||
Od tego wynagrodzenia podstawowego należy potrącić określone składki na ubezpieczenie społeczne: | | |
Łączna kwota składek na ubezpieczenie społeczne: | ||
Ponadto opiekunka ma prawo, za każdy przepracowany dzień, do dodatku na utrzymanie oraz dodatku na posiłki. W związku z tym otrzymuje następujące dodatki: | | |
Ostatecznie wynagrodzenie netto przysługujące opiekunce nad dziećmi wynosi: |
3.3. Przypomnienia ADO.NET
Aplikacja do obliczania wynagrodzeń wymaga informacji z bazy danych [dbpam]. Jej architektura będzie wyglądać następująco:
![]() |
- w [1] użytkownik wysyła zapytanie
- w [2] aplikacja do obliczania wynagrodzeń przetwarza to żądanie.
- może wówczas potrzebować danych z bazy danych. Wysyła więc zapytanie do dostawcy (provider) ADO.NET dotyczące bazy SGBD wykorzystywanej przez [4].
- Ten ostatni korzysta z bazy danych [5] i przekazuje wyniki dostawcy ADO.NET, który z kolei przekazuje je aplikacji
- ta z kolei wykorzystuje te wyniki i generuje odpowiedź [5] dla użytkownika
Przypomnijmy teraz główne interfejsy udostępniane przez dostawcę ADO.NET swoim klientom [3].
W trybie połączonym aplikacja:
- nawiązuje połączenie ze źródłem danych
- współpracuje ze źródłem danych w trybie odczytu/zapisu
- zamyka połączenie
Operacje te dotyczą głównie trzech interfejsów ADO.NET:
- IDbConnection, który zawiera właściwości i metody połączenia.
- IDbCommand, który zawiera właściwości i metody wykonanego polecenia SQL.
- IDataReader, który zawiera właściwości i metody wyniku polecenia SQL Select.
Interfejs IDbConnection
Służy do zarządzania połączeniem z bazą danych. Wśród metod M i właściwości P tego interfejsu znajdują się następujące:
Nazwa | Typ | Rola |
P | ciąg znaków służący do połączenia z bazą danych. Określa on wszystkie parametry niezbędne do nawiązania połączenia z konkretną bazą danych. | |
M | otwiera połączenie z bazą zdefiniowaną przez ConnectionString | |
M | zamyka połączenie | |
M | rozpoczyna transakcję. | |
P | stan połączenia: ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting, ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken |
Jeśli Connection jest klasą implementującą interfejs IDbConnection, nawiązanie połączenia może przebiegać w następujący sposób:
Interfejs IDbCommand
Służy do wykonania polecenia SQL lub procedury przechowywanej. Wśród metod M i właściwości P tego interfejsu znajdują się następujące:
Nazwa | Typ | Rola |
P | wskazuje, co należy wykonać – przyjmuje wartości z listy wyliczeniowej: - CommandType.Text: wykonuje polecenie SQL zdefiniowane we właściwości CommandText. Jest to wartość domyślna. - CommandType.StoredProcedure: wykonuje procedurę przechowywaną w bazie | |
P | - tekst polecenia SQL, które ma zostać wykonane, jeśli CommandType = CommandType.Text - nazwa procedury przechowywanej, która ma zostać wykonana, jeśli CommandType = CommandType.StoredProcedure | |
P | połączenie IDbConnection, które ma zostać użyte do wykonania zlecenia SQL | |
P | transakcja IDbTransaction, w ramach której ma zostać wykonane zlecenie SQL | |
P | lista parametrów zdefiniowanego polecenia SQL. Polecenie update articles set price=price*1.1 where id=@id posiada parametr @id. | |
M | w celu wykonania polecenia SQL Select. Otrzymujemy obiekt IDataReader reprezentujący wynik polecenia Select. | |
M | w celu wykonania polecenia SQL: aktualizacja, wstawienie, usunięcie. Otrzymujemy liczbę wierszy, których dotyczy operacja (zaktualizowanych, wstawionych, usuniętych). | |
M | aby wykonać polecenie SQL Select, które zwraca tylko jeden wynik, tak jak w przypadku: select count(*) from articles. | |
M | w celu utworzenia parametrów IDbParameter dla zdefiniowanego zlecenia SQL. | |
M | pozwala zoptymalizować wykonanie zapytania z parametrami, gdy jest ono wykonywane wielokrotnie z różnymi parametrami. |
Jeśli Command jest klasą implementującą interfejs IDbCommand, wykonanie polecenia SQL bez transakcji będzie miało następującą postać:
Interfejs IDataReader
Służy do enkapsulacji wyników polecenia SQL Select. Obiekt IDataReader reprezentuje tabelę z wierszami i kolumnami, z której korzysta się sekwencyjnie: najpierw pierwszy wiersz, potem drugi itd. Wśród metod M i właściwości P tego interfejsu znajdują się następujące:
Nazwa | Typ | Rola |
P | liczba kolumn w tabeli IDataReader | |
M | GetName(i) zwraca nazwę kolumny nr i z tabeli IDataReader. | |
P | Element [i] reprezentuje kolumnę nr i w bieżącym wierszu tabeli IDataReader. | |
M | przechodzi do następnego wiersza tabeli IDataReader. Zwraca wartość logiczną True, jeśli odczyt się powiódł, a w przeciwnym razie – False. | |
M | zamyka tabelę IDataReader. | |
M | GetBoolean(i): zwraca wartość logiczną z kolumny nr i bieżącego wiersza tabeli IDataReader. Inne analogiczne metody to: GetDateTime, GetDecimal, GetDouble, GetFloat, GetInt16, GetInt32, GetInt64, GetString. | |
M | Getvalue(i): zwraca wartość z kolumny nr i bieżącego wiersza tabeli IDataReader jako typ object. | |
M | IsDBNull(i) zwraca True, jeśli kolumna nr i w bieżącym wierszu tabeli IDataReader nie ma wartości, co jest oznaczone wartością SQL NULL. |
Wykorzystanie obiektu IDataReader często wygląda następująco:









