Feladat: ADO.NET adatelérés¶
A házi feladat opcionális. A teljesítéssel 2 pluszpont és 2 iMsc pont szerezhető.
GitHub Classroom segítségével hozz létre magadnak egy repository-t. A meghívó URL-t Moodle-ben találod. Klónozd le az így elkészült repository-t. Ez tartalmazni fogja a megoldás elvárt szerkezetét. A feladatok elkészítése után kommitold és pushold a megoldásod.
A megoldáshoz szükséges szoftvereket és eszközöket lásd itt. A feladat MSSQL adatbázist használ.
Feladat 0: Neptun kód¶
Első lépésként a gyökérben található neptun.txt
fájlba írd bele a Neptun kódodat!
Feladat 1: Termék repository (2 pluszpont)¶
Készíts a termékek (Product
) kezeléséhez egy repository osztályt ADO.NET Connection technológiát használva. Nyisd meg a kiinduló kódban az sln fájlt Visual Studio-val. Keresd meg a Repository.ProductRepository
és Model.Product
osztályokat. Implementáld a ProductRepository
osztály alábbi funkcióit:
- A
Search(string name)
függvény keresse meg az adatbázisban a paraméterben kapott terméknévre illeszkedő találatokat, és adja őket vissza C# osztály példányaként. Ha a kapott szűrési paraméternull
, akkor minden terméket adjon vissza, ellenkező esetben case-insensitive módon a névben bárhol keressen! - A
FindById(int id)
adja vissza az ID alapján megtalált terméket, vagynull
értéket, ha nem található ilyen. - Az
Update(Product p)
egy létező termék adatait frissítse az adatbázisban a kapott paraméter alapján. Csak aName
,Price
ésStock
változhat, a többi tulajdonságot itt nem kell figyelembe venni. - A
Delete(int id)
törölje az ID alapján meghatározott terméket az adatbázisból, amennyiben az létezik. A visszatérési érték jelzi, hogy sikeres volt-e a törlés. (Csak a termék rekordot kell törölni, semmilyen kapcsolódó rekordot nem! Ha külső kulcs miatt nem törölhető a rekord, a hibát ne kezeld le, hanem engedd tovább a hívónak.)
Ügyelj az alábbiakra:
- A megoldásban csak adatbázis-szerver oldali szűrést alkalmazz!
- Csak a
ProductRepository
osztály kódját módosítsd! - A repository kódjában az ADO.NET kapcsolat megnyitásához a
connectionString
változót használd (és ne aTestConnectionStringHelper
-t). - A termék áfakulcsát is ki kell keresni, tehát nem a kapcsolódó rekord id-ját kell a
Model.Product
osztálynak átadni, hanem az áfakulcs százalékos értékét! A termék kategóriájának nevét hasonlóan ki kell keresni. - Csak ADO.NET technológiát használhatsz!
- Védekezz SQL injectionnel szemben!
- A
Model.Product
osztály kódját ezen feladathoz ne módosítsd! - A
ProductRepository
osztály definícióját (pl. osztály neve, konstruktor, függvények definíciója) ne változtasd meg, csak a függvények törzsét írd meg.
A teszteléshez találsz unit teszteket a solution-ben. Ezeket a teszteket Visual Studio-ban egyszerűen tudod futtatni, de ha mást használsz fejlesztéshez (pl. VS Code és/vagy dotnet cli
), akkor is tudsz teszteket futtatni. Az adatbázis eléréséhez a TestConnectionStringHelper
segédosztályban módosíthatod a connection stringet.
Tesztek
A tesztek az adatbázis kiinduló állapotát feltételezik. Futtasd le az adatbázis scriptet a kiinduló állapot visszaállításához.
A tesztek kódját NE módosítsd. Ha a teszteléshez szükséges, ideiglenesen beleszerkeszthetsz, de ügyelj rá, hogy az eredeti állapottal kommitold a megoldásod.
BEADANDÓ
A módosított C# forráskódot töltsd fel.
Emellett készíts egy képernyőképet Visual Studio-ból (vagy másik, a fejlesztéshez használt eszközből, ami akár dotnet cli
is lehet), amelyben a vonatkozó teszteket lefuttattad. Látszódjon a repository kódja (a releváns része, amennyi kifér) és a tesztek futásának eredménye! A képet f1.png
néven mentsd el és add be a megoldásod részeként!
Ha dotnet test
-et használsz a teszt futtatásához, a képernyőképen látszódjon az összes teszt neve. Ehhez használd a -v n
kapcsolót a részletesebb naplózáshoz.
A képernyőképen levő forráskód tekintetében nem szükséges, hogy a végső megoldásban szereplő kód betűről betűre megegyezzen a képen és a feltöltött változatban. Tehát a tesztek sikeres lefutása után elkészített képernyőképet nem szükséges frissíteni, ha a forráskódban kisebb változtatást eszközölsz.
Feladat 2: Optimista konkurenciakezelés (2 iMsc pont)¶
Az iMsc pont megszerzésére az első feladat megoldásával együtt van lehetőség.
A termékek adatbázisban történő frissítése esetén vegyük észre, és ne engedjük a módosítást, ha a frissítéssel felülírnánk egy nem látott módosítást. A ProductRepository.UpdateWithConcurrencyCheck
függvénye legyen felelős a helyes viselkedésért, és ne végezze el a kért módosítást, ha elveszett módosítás jellegű konkurenciaproblémát észlel.
A konkrét eset, amit el szeretnénk kerülni:
- A felhasználó lekérdez egy terméket.
- B felhasználó lekérdezi ugyanazt a terméket.
- A felhasználó módosítja a termék árát (vagy más tulajdonságát), visszamenti az adatbázisba.
- B felhasználó is módosítja a termék árát (vagy más tulajdonságát), és felülírja ezzel A módosítását figyelmeztetés nélkül.
Optimista konkurenciakezelés
A megoldáshoz az optimista konkurenciakezelés koncepcióját alkalmazd. Ne használj tranzakciót, mert a lekérdezés és módosítás időben eltolva történik, közben az adatbázis kapcsolat megszűnik. Ne használj több SQL utasítást se, mert a lefutásuk között más adatbázis hozzáférések történhetnek, elrontva a várt viselkedést. A megoldást a ProductRepository.UpdateWithConcurrencyCheck
függvényben írd meg, valamint adaptáld a Model.Product
osztályt is. Az adatbázisba nem vehetsz fel új oszlopot.
Ügyelj az alábbiakra:
- Csak a
ProductRepository.UpdateWithConcurrencyCheck
függvény és aModel.Product
osztály kódját módosítsd! - A függvény visszatérési értékben jelezze, hogy sikeres volt-e a módosítás (vagyis, hogy nem volt konkurenciaprobléma).
- Magyarázd el a viselkedést az
UpdateWithConcurrencyCheck
függvényben egy kommentben (2-3 mondatban). - Egyetlen SQL parancs használatával oldd meg a feladatot!
- Csak ADO.NET technológiát használhatsz!
- Védekezz SQL injectionnel szemben!
- A
ProductRepository
osztály definícióját (pl. osztály neve, konstruktor, függvények definíciója) ne változtasd meg, csak a függvény törzsét írd meg. - A
Model.Product
osztály konstruktorának definícióját (paraméterek darabszáma, sorrendje, nevei) ne változtasd meg, de a kódját átírhatod. A meglevő property-ket ne változtasd meg, de újakat felvehetsz.
BEADANDÓ
A módosított C# forráskódot töltsd fel. Ne felejtsd el megírni a magyarázatot a C# kódban!