ZiBaT => Peter Levinsky => SWD => exercise

Hotel Opgave

Opdated : 2018-02-12

Database med hotel

Ide : At arbejde med en hotel database

Trin 1: Lav en Domain model

Scandic hotel – kæde

Lav en domain model af Hotel-kæden.

Der er flere hoteller. Hvert hotel har flere værelser.

Hotellets kunder kan reservere et eller flere værelser.

Angiv attributter for klasserne og associeringer mellem klasserne.

 

Trin 2: Lav en database model

Scandic hotel – kæde – fortsat

Beskriv klasser, attributter og associering som tabeller med primær nøgler, søjler og fremmed nøgler

 

Trin 3: Undersøg tabeller for om de er på 3NF

Scandic hotel – kæde – fortsat

Undersøg om tabellerne er på 3NF

 

Trin 4: Opret tabellerne i en Database

Scandic hotel – kæde – fortsat

De tabeller du har defineret og undersøgt i Trin 3, Opret dem som tabeller i databasen.

se (Fronter) evt: database-note kapitel 3 eller https://www.w3schools.com/sql/sql_create_table.asp

 

Trin 5: Udtræk data

Del A - opsætning af hotel database

Inden du fortsætter skal du downloade og 'køre' disse to SQL-scripts

  1. Opret tabeller
  2. Insæt værdier i tabellerne

Når du indlæser og kører opret tabeller sql-script'et, så får du en database, som ser således ud:

Hotel tabeller

 

Del B - select fra een tabel
  1. List alle oplysninger om alle hoteller.
  2. List alle oplysninger om alle hoteller i Roskilde.
  3. List navne og adresser på alle gæster fra Roskilde.
  4. List navne og adresser på alle gæster fra Roskilde sorteret alfabetisk efter navn.
  5. List alle dobbeltværelser med en pris under 200 pr. nat.
  6. List alle dobbeltværelser eller familierum med en pris under 400 pr. nat.
  7. List alle dobbeltværelser eller familierum med en pris under 400 pr. nat
    sorteret i stigende orden efter pris.
  8. List alle gæster, som har et navn, der starter med 'G'.
Del C - Aggregate-funktioner
  1. Hvor mange hoteller er der?
  2. Hvor mange hoteller er der i Roskilde?
  3. Hvad er gennemsnitsprisen på et værelse?
  4. Hvad er gennemsnitsprisen på et enkeltværelse?
  5. Hvad er gennemsnitsprisen på et dobbeltværelse?
  6. Hvad er gennemsnitsprisen på et værelse på Hotel Scandic?
  7. Hvad er den totale indtægt pr. nat for alle dobbeltværelser?
  8. Hvor mange forskellige gæster har foretaget bookinger i marts måned?
  9. Hvor mange bookinger er der i dag på Scandic hotel?
  10. Hvor mange bookinger er der i morgen på Scandic hotel?
Del D - Flere tabeller
  1. List pris og type på alle værelser på 'Prindsen'.
  2. List alle gæster, der p.t. bor på 'Prindsen'.

  3. Gruppering
  4. List antal værelser for hvert hotel.
  5. List antal værelser for hvert hotel i Roskilde.
  6. Hvad er det gennemsnitlige antal bookinger for hvert hotel i denne måned?
Del E - Insert og Update af Tabeller
  1. Indsæt nye gæster.
  2. Indsæt et nyt hotel.
  3. Indsæt værelser i det nye hotel.
  4. Indsæt bookinger.
  5. Forøg prisen på alle værelser med 5%.

 

Trin 6: Dokumenter resultatet

Udarbejd et mindre dokument, der beskriver

 

Trin 7 Simpel DB-forbindelse til Hotel databasen

Lav en almindeligt Konsol-application.

Lav en klasse DBClient med en metode:

public void Start()

I main lav et object af DBClient og kald Start()-metoden.

 

I start metoden skal du kode en DB-forbindelse til din database og foretage forskellige SQL-kald.

Med hensyn til DB-Forbindelsen se nedenfor:

Hjælp se mere : SQLConnection

------------- generelt eksempel ----------------------

queryString => SQL-string eks: delete from Team where id = 44
connectionString => Connetion String til databasen se i egenskaber for databasen using (SqlConnection connection = new SqlConnection(connectionString)) {
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
-----------------------------------
Trin 7.1 Hent alle hoteller

Du skal hente alle hoteller fra din database (eller fra DemoHotel).

DVS. du skal lave en SQL-command select * from Hotel evt. fra DemoHotel

Når det er en select-sql-statement, så skal du benytte følgende i stedet for command.ExecuteNonQuery():

SqlDataReader reader = command.ExecuteReader();

Herefter kan du læse fra reader ved at skrive :

while (reader.Read())                  
{
int id = reader.GetInt32(0); -- læser int fra første søjle string name = reader.GetString(1); -- læser string fra anden søjle . . .
}
Trin 7.2 Hent specielt hotel

Du skal hent et hotel ud fra et hotel nummer.

select * from Hotel
where Hotel_No = xx

 

Trin 7.3 Indsæt et hotel

Du skal oprette og indsætte et hotel.

Insert into Hotel Values ( xx,yy,zz, ...)

Dette er ikke en select så her skal du benytte 'command.ExecuteNonQuery();'

Trin 7.4 Slet et hotel

Du skal slette et hotel med et specifikt nummer.

Delete from Hotel
where Hotel_No = xx

Du skal benytte 'command.ExecuteNonQuery();'

Trin 7.5 Opdater et hotel

Du skal opdatere et hotel.

Update Hotel
set Hotel_No = xx, ...

Du skal benytte 'command.ExecuteNonQuery();'

 

 

Trin 8 Opbgning af en REST-service

NU er det tid til at lave en egentlig REST-Service. Til det skal du have model-klasser, en controller samt selve REST-servicen.

Trin 8.1 Model klasser

Du kommer til at arbejde med modelklasserne både på REST-Provider siden, såvel som på REST-consumer siden, derfor skal du lave dem i et Library (ddl-fil) der kan deles.

Du skal lave et projekt i VS2017 'Class Library (Legacy Portable)'.

Du skal implementere de 4 model klasser:

Husk at alle klassene skal være public, samt de skal have en default konstruktør.
Du må gerne tilføje (overload) endnu en konstruktør til initialisering. Typerne skal følge typerne i databasen.

 

Trin 8.2 Controller klasse

Inden selve REST-servicen isolerer du kommunikationen med databasen i en eller rettere 4 controllere men start med 'Guest'.

Du skal lave et projekt i VS2017 under web 'ASP.NET Web Application (.NET Framework)' - klik ok til default valg af web api.

Du skal i solution lave en mappe 'DBUtil' til de 4 hjælpe controllere.

I mappen 'DBUtil' skal du lave følgende interface se IManageGuest.cs: Du kan evt bare kopiere fra filen.

Dernæst skal du implementere dette interface i klassen ManageGuest i mappen 'DBUtil'

Du skal lave meget af det sammen som i trin 7 bare for tabellen Guest (DemoGuest),
dvs. oprette DB-forbindelser (SQLConnection)
samt benytte de relevante SQL kommandoer (SQLCommand) altså select ..., insert ..., update .... og delete ....

 

Trin 8.3 REST-Controller

Nu kommer du til selve REST-servicen.

Du skal i din solution finde mappem controllers, her skal du added (dvs. højre klik og add) en ny controller.
Du skal vælge 'Web API 2 controller with read/write actions' - kald din controller 'GuestController'.

Nu skal du tilpasse din REST-Service controller, den har de samme 5 metoder som ManageGuest.

'public IEnumerable<string> Get()' skal ændres til public 'IEnumerable<Guest> Get()' og du skal lave et object af din ManageGuest klasse og kalde GetAllGuest

'public string Get(int id)' skal ændres til 'public Guest Get(int id)' og på objectet af ManageGuest-klassen kalde GetGuestFromId

'public void Post([FromBody]string value)' ændres til 'public bool Post([FromBody]Guest value)' og benyt metoden CreateGuest

'public void Put(int id, [FromBody]string value)' ændres til 'public bool Put(int id, [FromBody]Guest value)' og benyt metoden UpdateGuest

'public void Delete(int id)' ændres til 'public Guest Delete(int id)' og benyt metoden DeleteGuest

Nu kan du køre din REST-Service:

 

Trin 8.4 Prøv din REST-Service

Du skal nu starte fx. Fiddler4 (kan også være Postman), se semester plan for downloads.

Vælg fanen composer - her kan du opbygge og sende REST-Request til din REST-service.

Efter GET skriv din URL: fx. 'http://localhost:27481/API/Guest'. Du vil sikkert have et andet portnummer så erstat 27481 med DIT portnummer.

Prøv følgende REST-kald:

1) Get http://localhost:27481/API/Guest, se svaret

2) Get http://localhost:27481/API/Guest/4, se svaret (prøv med 444, som ikke findes)

3) Post http://localhost:27481/API/Guest -- OBS! Header Field indsæt 'Content-Type: application/json' + Boby noget der minder om '{"GuestNr":301,"Navn":"EtGodtNavn","Adresse":"EnFinVej"}'

4) Put http://localhost:27481/API/Guest/301 + Body noget der minder om '{"GuestNr":301,"Navn":"EtAndetNavn","Adresse":"EnNyVej"}'

5) Delete http://localhost:27481/API/Guest/301

 

Fint nu har du en REST service kørende for Guest

 

Trin 8.5 Udvid din REST-Service til Hotel, Room og Booking

Lav tilsvarende REST-Servicer dvs. Controllere for Hotel, Room og Booking

Så Vink:

Ved Hotel Når et hotel skal hentes skal værrelser (rooms) til hotellet også hentes (fx. select * from DemoRoom where Hotel_No = xx, hvor xx er Nummer på hotellet)

Ved Booking skal et Hotel hhv. en Guest hentes udfra deres Nummer

 

Trin 9 Udarbejd ’design’ Sekvens Diagram og Design Klasse Diagram for REST-servicen

Lav et DSD og et DCD for REST servicen

For at forstå designet af REST-service systemet (der bliver et support system (’supporting actor’)) skal du udarbejde et ’design’ Sekvens Disgram (SD) samt et Design Klasse Diagram (DCD).

 

Trin 10 Lav et program der konsumere Hotel REST-servicen

Du skal lave et program der kan konsumere din REST-service.

Trin 10 del A : hent alle gæster

Du skal lave et projekt i VS2017 'Console Application (.NET Framework)' kald det "HotelProgram".

Lav en klasse ConsumeRest med en metode:

public void Start()

I main lav et object af ConsumeRest og kald Start()-metoden.

Lav en metode HentAlleGæster() der returnere en liste af 'Guest', som skal kalde REST servicen, som henter alle gæster fra REST servicen.

--------------------------- Kode eksempel -------------------

String GuestUri = "http://resthotel-pele-easj.azurewebsites.net/api/Guest"; // din URL til din REST

using (HttpClient client = new HttpClient())
{
   string jsonStr = client.GetStringAsync(GuestUri).Result; // info fra body
   List<Guest> cList = JsonConvert.DeserializeObject<List<Guest>>(jsonStr);
   return cList;
}

------------------------- SLUT --------------------------------

For at dette kan virke skal du tilføje to referencer:

1) Add reference til dit hotel library (højre klik på referencer og add 'sti til din dll-fil')

2) Tilføj et bibliotek til JsonConvert (højre klik på dit projekt og 'Manage NuGet Packages' browse efter json og vælg 'newtonsoft.json', der skal installeres)

Trin 10 del B : hent en gæst med nummer 4

Lav en ny metode HentEnGæst(int nr), der hent en gæst.

Det vil være tilsvarende del A, men tilpas URI med et nummer, samt Deserialize<Guest> ikke en hel liste.

 

Trin 10 del C : Indsæt en gæst

Lav en ny metode IndsætGæst(Guest guest), der indsætter en gæst over REST.

I metoden skal du oprette et objekt af Guest (det opjekt der skal indsættes), Derefter skal du indkode det i json-format:

String json = JsonConvert.SerializeObject(guest);

Derefter skal du oprette den 'content' der skal sendes i body i dit HTTP-request.

StringContent content = new StringContent(json);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json")

Tilsidst sendes requestet

var resultMessage= client.PostAsync(GuestUri, content).Result;

.REST service svaret afkodes (dvs. HTTP response)

Du skal benytte noget svarende til dette:

-------------------------------- Kode eksempel ---------------

if (result.IsSuccessStatusCode)
{
   string resultStr = result.Content.ReadAsStringAsync().Result;
   bool res = JsonConvert.DeserializeObject<bool>(resultStr);
   return res;
}

------------------------------------------------------------------

 

Trin 10 del D : Opdater en gæst

Lav en ny metoder OpdaterEnGæst(int nr, Guest guest), der opdaterer en gæst

Det vil være tilsvarende del C, men tilpas URI med et nummer serialiser Guest-objektet, samt Deserialize<bool>.

Trin 10 del E : Slet en gæst

Lav en ny metoder SletGæst(int nr), der sletter gæst nummer 'nr'.

Det vil være tilsvarende del C, men tilpas URI med et nummer, samt Deserialize<Guest>.

 

 

Trin 11 flere trin ??? ...