Grafikus C# – Windows Forms tanfolyam › 3.1 lecke

Windows Forms · 3.1 lecke · felkészülés az adatbázisokra

SQLite-alapok és DB Browser – táblák létrehozása

A programok többsége nem csak számol, hanem adatot is tárol: felhasználókat, termékeket, jegyzeteket. Ehhez adatbázis kell. Ebben a leckében megismered az SQLite adatbázist, a DB Browser for SQLite programmal létrehozod az első adatbázisodat és tábláidat, és kipróbálod az alapvető SQL lekérdezéseket, még C# kód nélkül.

  • kb. 90 perc
  • kezdő szint
  • adatbázis és SQL
Diáklány C# programot készít laptopon

A lecke végére

  • érted, mi az adatbázis, a tábla, az oszlop és a sor;
  • tudod, mi az SQLite, és miért nem kell hozzá külön szerver;
  • a DB Browser for SQLite programmal új adatbázist és táblát készítesz;
  • kulcsot (PRIMARY KEY) és egyedi értéket (UNIQUE) állítasz be;
  • kipróbálod a CREATE TABLE, INSERT és SELECT utasításokat, a WHERE és ORDER BY kulcsszóval;
  • nem felejted el a változtatások írását (Write Changes).

Mielőtt elkezded

Ehhez a leckéhez nem kell C# kód, csak Windows és a DB Browser for SQLite program. Az SQL-t nulláról tanuljuk. Az előző fejezetek tudása a következő leckékben kell majd, amikor C# programból kapcsolódunk az adatbázishoz.

2.16 Szövegszerkesztő záró projekt →

Mi az adatbázis és mi az SQLite?

Az adatbázis rendezett adatgyűjtemény, amelyet a program lekérdezhet és módosíthat. A leggyakoribb típus, a relációs adatbázis táblákból áll, a tábla pedig oszlopokból (mezőkből) és sorokból (rekordokból). Mint egy táblázat, de szigorúbb szabályokkal:

idfelhnevjelszo
1tanuloteszt123
2kataalmafa
TáblaEgy téma adatai, például a felhasználók. A neve: belepesi_adatok.
OszlopEgy tulajdonság minden rekordnál (például a felhasználónév). Meghatározott típusa van.
Sor (rekord)Egy konkrét elem összes adata (egy felhasználó).
SQLAz adatbázisok nyelve (Structured Query Language). Ezzel kérdezünk és módosítunk.

Az SQLite egy kicsi, egyszerű adatbázis-kezelő, amely az egész adatbázist egyetlen fájlban (.db) tárolja. Nem kell hozzá külön szervert telepíteni vagy elindítani: a program közvetlenül a fájlt olvassa és írja. Ezért kiváló tanuláshoz, kisebb alkalmazásokhoz, mobilappokhoz és böngészőkhöz is.

Jósolj!

Az iskola adatbázisába egy tanulót két sorban szerepeltetsz: mindkettőben azonos név, azonos osztály, azonos születési dátum. Hogyan tudjuk megkülönböztetni a két rekordot?

Jóslat ellenőrzése

Egyedi azonosítóval, vagyis kulccsal (id), amelyből minden sornak más van. Ezért kap minden tábla egy id oszlopot, amelyet PRIMARY KEY (elsődleges kulcs) jelöl.

A DB Browser for SQLite

A DB Browser for SQLite egy ingyenes program, amellyel grafikusan készíthetsz és nézhetsz meg SQLite adatbázisokat. Töltsd le a hivatalos oldalról (keresd: DB Browser for SQLite), és telepítsd, vagy használd a hordozható (portable) változatot, amely telepítés nélkül is indul. Ha az iskolai gépeken csak a hordozható változat érhető el, azt is használhatod.

Mindig a hivatalos oldalról tölts le

Programot csak a készítő hivatalos oldaláról tölts le, ne ismeretlen letöltő oldalról. Az internetes „letöltő” oldalak sokszor kéretlen programokat is csomagolnak a telepítőhöz.

📷 Képernyőkép helye

Mit tegyél ide: a DB Browser for SQLite főablaka induláskor, a négy lappal (Database Structure, Browse Data, Edit Pragmas, Execute SQL), és a felső eszközsoron a New Database és Open Database gombbal.Javasolt fájlnév: winforms-3-1-db-browser.webp · Alt szöveg: A DB Browser for SQLite főablaka a négy lappal

Az első adatbázis és tábla

  1. Indítsd a DB Browser for SQLite programot, és kattints a New Database gombra. Mentsd az adatbázist belepes.db néven egy mappába, amelyet könnyen megtalálsz (később a C# projekt mellé fogod másolni).
  2. A megnyíló Edit table definition ablakban a Table mezőbe írd: belepesi_adatok.
  3. Az Add gombbal vegyél fel három oszlopot a következő beállításokkal:
    NévTípusBeállítás
    idINTEGERPK (primary key), AI (autoincrement: automatikus számozás)
    felhnevTEXTNN (not null: kötelező), U (unique: egyedi)
    jelszoTEXTNN (kötelező)
  4. Kattints az OK gombra. A Database Structure lapon megjelenik a tábla.
INTEGER, TEXTAz oszlop típusa: egész szám, illetve szöveg. A tizedes számé REAL.
PRIMARY KEY (PK)Elsődleges kulcs: minden sor egyedi azonosítója.
AUTOINCREMENT (AI)Az adatbázis maga számozza a sorokat (1, 2, 3…), nem kell megadnod.
NOT NULL (NN)Az oszlop nem lehet üres.
UNIQUE (U)Két sorban nem lehet ugyanaz az érték. A felhasználónév ezért egyedi: nem regisztrálhat két felhasználó ugyanazzal a névvel.
📷 Képernyőkép helye

Mit tegyél ide: az Edit table definition ablak a belepesi_adatok táblával: az id (INTEGER, PK, AI), a felhnev (TEXT, NN, U) és a jelszo (TEXT, NN) sora kitöltve.Javasolt fájlnév: winforms-3-1-tabla-definicio.webp · Alt szöveg: A belepesi_adatok tábla három oszlopának beállítása a DB Browserben

A tábla ugyanezt az SQL utasítással is létrehozható. A DB Browser a háttérben ilyet hajt végre:

SQLSQLite
CREATE TABLE belepesi_adatok (
id INTEGER PRIMARY KEY AUTOINCREMENT,
felhnev TEXT NOT NULL UNIQUE,
jelszo TEXT NOT NULL
);

A jelszó nyílt szövegként csak gyakorlás

Ebben a tanfolyamban egyszerűség kedvéért a jelszót szövegként tároljuk. Valódi programban a jelszót soha nem tárolják nyíltan: tárolás előtt egyirányú kódolással (hash) alakítják át. Használj kitalált, teszt jelszót, és ne írj be soha igazi jelszót a gyakorló adatbázisba.

Az első SQL utasítások: INSERT és SELECT

Váltsd át a DB Browsert az Execute SQL lapra. Ide írhatsz SQL utasításokat, és a lap tetején lévő lejátszás gombbal (vagy a Ctrl+Enter billentyűvel) futtathatod őket. Az eredmény alul jelenik meg.

SQLSQLite
-- adatok felvétele
INSERT INTO belepesi_adatok (felhnev, jelszo) VALUES ('tanulo', 'teszt123');
INSERT INTO belepesi_adatok (felhnev, jelszo) VALUES ('kata', 'almafa');
INSERT INTO belepesi_adatok (felhnev, jelszo) VALUES ('bence', 'korte99');

-- minden sor és oszlop
SELECT * FROM belepesi_adatok;

-- csak két oszlop
SELECT felhnev, jelszo FROM belepesi_adatok;

-- szűrés: csak a keresett felhasználó
SELECT * FROM belepesi_adatok WHERE felhnev = 'kata';

-- rendezés ábécébe
SELECT * FROM belepesi_adatok ORDER BY felhnev;

-- darabszám
SELECT COUNT(*) FROM belepesi_adatok;
INSERT INTO tábla (oszlopok) VALUES (értékek)Új sort vesz fel. Az id-t nem adjuk meg, mert az automatikus. A szöveget aposztróf (') közé tesszük.
SELECT * FROM táblaLekérdez. A csillag (*) azt jelenti: minden oszlopot.
WHERE feltételSzűrés: csak a feltételnek megfelelő sorok kerülnek az eredménybe.
ORDER BY oszlopRendezés. A DESC csökkenő sorrendet ad (például ORDER BY felhnev DESC).
COUNT(*)Megszámolja a sorokat.
-- megjegyzésAz SQL-ben a két kötőjel utáni szöveg megjegyzés.

Jósolj!

A három INSERT után mit ad vissza a SELECT COUNT(*) FROM belepesi_adatok? Mi lesz a SELECT * FROM belepesi_adatok WHERE felhnev = 'peti' eredménye?

Jóslat ellenőrzése

A COUNT(*) eredménye 3. A „peti” nevű felhasználó nincs a táblában, ezért a második lekérdezés üres eredményt ad (nulla sor). Ez nem hiba. A bejelentkezés (3.3 lecke) pontosan erre épül: ha a lekérdezés üres, a felhasználó nem létezik.

📷 Képernyőkép helye

Mit tegyél ide: az Execute SQL lap egy SELECT utasítással, a lejátszás gombbal, és alul az eredménytáblával (három felhasználó).Javasolt fájlnév: winforms-3-1-execute-sql.webp · Alt szöveg: Az Execute SQL lap egy SELECT lekérdezéssel és az eredménnyel

Írd ki a változtatásokat!

A DB Browser a módosításokat először csak átmenetileg tartja számon. Az adatbázis fájlba csak akkor kerülnek, ha a Write Changes (Változtatások írása) gombra kattintasz, vagy megnyomod a Ctrl+S billentyűt. Ha ezt kihagyod, és bezárod a programot, az új táblák és sorok elvesznek.

A leggyakoribb kezdő hiba

Beírod az adatokat, a lekérdezés mutatja is őket, majd bezárod a programot, és újranyitáskor üres a tábla. Ilyenkor kimaradt a Write Changes. Szokd meg: minden módosítás után Ctrl+S.

Hibakeresés: te vagy a hibadetektív

Mi a baj, és hogyan javítod?

Gondold végig az okot, és csak utána nyisd le a megoldást.

1. Eltűntek az adatok

Felvetted az adatokat, bezártad a programot, és újranyitáskor üres a tábla.

Ok és javítás

Kimaradt a Write Changes (Ctrl+S). Vagy másik .db fájlt nyitottál meg. Minden módosítás után írd ki a változtatásokat, és ellenőrizd a megnyitott fájl nevét.

2. no such column

SELECT felhasznalonev FROM belepesi_adatok;
-- Error: no such column: felhasznalonev
Hiba és javítás

Az oszlop neve felhnev, nem felhasznalonev. Az SQL az oszlopneveket szigorúan nézi. Ellenőrizd a Database Structure lapon a tábla pontos oszlopneveit.

3. A tábla már létezik

CREATE TABLE belepesi_adatok (...);
-- Error: table belepesi_adatok already exists
Hiba és javítás

Ugyanazt a táblát másodszor próbálod létrehozni. Ha a táblát módosítani szeretnéd, használd a Database Structure lap Modify Table gombját, vagy törölj előbb a Drop Table paranccsal (de csak gyakorló adatbázisban!).

4. UNIQUE constraint failed

INSERT INTO belepesi_adatok (felhnev, jelszo) VALUES ('kata', 'masikjelszo');
-- Error: UNIQUE constraint failed: belepesi_adatok.felhnev
Hiba és javítás

Ez nem rossz működés, hanem a védelem: a felhnev oszlop egyedi (UNIQUE), és a „kata” név már szerepel. Ezzel az adatbázis megakadályozza, hogy két felhasználónak azonos neve legyen. A regisztrációnál (3.4 lecke) ezt a hibát fogjuk kezelni.

5. Hiányzó aposztróf

SELECT * FROM belepesi_adatok WHERE felhnev = kata;
-- Error: no such column: kata
Hiba és javítás

A szöveget aposztrófok közé kell tenni: WHERE felhnev = 'kata'. Nélkülük az SQL a „kata” szót oszlopnévnek hiszi. (A C# idézőjele ", az SQL szöveg határolója az aposztróf '.)

6. Kevesebb érték, mint oszlop

INSERT INTO belepesi_adatok (felhnev, jelszo) VALUES ('anna');
-- Error: 1 values for 2 columns
Hiba és javítás

Az oszlopok száma (2) és az értékek száma (1) nem egyezik. Minden oszlophoz meg kell adni egy értéket: VALUES ('anna', 'titok').

Mini projekt: saját adatbázis két táblával

Készítsd el a következő tanfolyami részek adatbázisát:

  1. Hozd létre a belepes.db adatbázist a belepesi_adatok táblával (id, felhnev, jelszo), az 3. szakasz szerint. Vegyél fel három próbafelhasználót.
  2. Hozz létre egy második táblát a dolgozók adataival (id, vnev, knev, fizetes, cim), és vegyél fel négy sort. Először próbáld meg önállóan.
    Megoldás megnyitása
    SQLSQLite
    CREATE TABLE adatok (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    vnev TEXT NOT NULL,
    knev TEXT NOT NULL,
    fizetes INTEGER,
    cim TEXT
    );

    INSERT INTO adatok (vnev, knev, fizetes, cim) VALUES ('Kovács', 'Anna', 420000, 'Veszprém');
    INSERT INTO adatok (vnev, knev, fizetes, cim) VALUES ('Nagy', 'Péter', 350000, 'Pécs');
    INSERT INTO adatok (vnev, knev, fizetes, cim) VALUES ('Szabó', 'Kata', 510000, 'Győr');
    INSERT INTO adatok (vnev, knev, fizetes, cim) VALUES ('Tóth', 'Bence', 290000, 'Veszprém');
  3. Írj lekérdezéseket: az összes sor, a veszprémi dolgozók, a fizetés szerint csökkenően rendezve.
  4. Írd ki a változtatásokat (Ctrl+S), zárd be és nyisd meg újra a DB Browsert: megvannak-e az adatok?
📷 Képernyőkép helye

Mit tegyél ide: a Database Structure lap a két táblával (belepesi_adatok és adatok), és a Browse Data lap az adatok tábla négy sorával.Javasolt fájlnév: winforms-3-1-ket-tabla.webp · Alt szöveg: A belepes.db két táblája a DB Browserben

Három önálló gyakorlófeladat

Egyszerre csak egyet csinálj: írd meg, futtasd, ellenőrizd az eredményt, és csak utána nyisd ki a megoldást.

1. Magas fizetések

Kérdezd le azokat a dolgozókat, akiknek a fizetése 400 000 forintnál több. Csak a vezeték- és keresztnevüket és a fizetésüket mutasd.

Egy lehetséges megoldás
SELECT vnev, knev, fizetes FROM adatok WHERE fizetes > 400000;

A >, <, = és <> (nem egyenlő) jelekkel számok között is szűrhetsz.

2. Átlagfizetés

Számold ki az átlagfizetést és a legnagyobb fizetést egy lekérdezéssel.

Egy lehetséges megoldás
SELECT AVG(fizetes), MAX(fizetes) FROM adatok;

Az AVG az átlag, a MAX a legnagyobb, a MIN a legkisebb érték, az SUM pedig az összeg. A COUNT-tal együtt ezek az összesítő függvények.

3. Keresés névrészletre

Keresd meg azokat a dolgozókat, akiknek a vezetékneve K betűvel kezdődik.

Egy lehetséges megoldás
SELECT * FROM adatok WHERE vnev LIKE 'K%';

A LIKE mintát illeszt. A % bármennyi karaktert jelent: a 'K%' a K-val kezdődő szavakat, a '%a' az a-ra végződőket, a '%at%' az „at” részletet tartalmazókat keresi.

Gyakorlótár: 6 további feladat

Három szinten gyakorolhatsz: alap, közepes és kihívás. A feladatok a DB Browser Execute SQL lapján oldhatók meg, C# kód nélkül. Használj új, gyakorló adatbázist (például gyakorlo.db). Mindegyik megoldás után írd ki a változtatásokat (Ctrl+S). Csak a próbálkozás után nyisd le a megoldást.

Alap szint

1. Tábla létrehozása

Hozz létre egy tanulok táblát: id (egész szám, elsődleges kulcs, automatikus), nev (szöveg, kötelező), osztaly (szöveg) és atlag (tizedes szám).

Megoldás megnyitása

A tizedes számok típusa REAL. A NOT NULL kötelezővé teszi az oszlopot, a PRIMARY KEY AUTOINCREMENT automatikus azonosítót ad.

SQLSQLite
CREATE TABLE tanulok (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nev TEXT NOT NULL,
osztaly TEXT,
atlag REAL
);

2. Adatok felvétele és lekérdezése

Vegyél fel négy tanulót különböző osztályokból és átlagokkal, majd kérdezd le az összes adatot.

Megoldás megnyitása

A szöveget aposztróf közé kell tenni, a tizedes számokat ponttal kell írni az SQL-ben (4.5, nem 4,5).

SQLSQLite
INSERT INTO tanulok (nev, osztaly, atlag) VALUES ('Kovács Anna', '10.A', 4.8);
INSERT INTO tanulok (nev, osztaly, atlag) VALUES ('Nagy Péter', '10.A', 3.9);
INSERT INTO tanulok (nev, osztaly, atlag) VALUES ('Szabó Kata', '10.B', 4.5);
INSERT INTO tanulok (nev, osztaly, atlag) VALUES ('Tóth Bence', '10.B', 3.2);

SELECT * FROM tanulok;

Közepes szint

3. Szűrés és rendezés

Kérdezd le azokat a tanulókat, akiknek az átlaga legalább 4,0, átlag szerint csökkenő sorrendben. Csak a nevet és az átlagot mutasd.

Megoldás megnyitása

A WHERE a szűrést végzi (>=: legalább), az ORDER BY ... DESC csökkenő sorrendbe rendez. A kért oszlopokat a SELECT után soroljuk fel.

SQLSQLite
SELECT nev, atlag
FROM tanulok
WHERE atlag >= 4.0
ORDER BY atlag DESC;

4. Összesítés

Számold ki egy lekérdezéssel a tanulók számát, az átlagok átlagát, a legjobb és a leggyengébb átlagot.

Megoldás megnyitása

Az összesítő függvények (COUNT, AVG, MAX, MIN) egyetlen eredménysort adnak. Az AS nevet ad az oszlopnak, így az eredmény olvashatóbb.

SQLSQLite
SELECT COUNT(*) AS darab,
AVG(atlag) AS atlagok_atlaga,
MAX(atlag) AS legjobb,
MIN(atlag) AS leggyengebb
FROM tanulok;

Kihívás szint

5. Csoportosítás osztályonként

Írd ki osztályonként a tanulók számát és az átlagok átlagát.

Megoldás megnyitása

A GROUP BY csoportokba rendezi a sorokat az adott oszlop értéke szerint, az összesítő függvények pedig csoportonként számolnak.

SQLSQLite
SELECT osztaly,
COUNT(*) AS letszam,
AVG(atlag) AS atlag
FROM tanulok
GROUP BY osztaly;

6. Három hibás utasítás

Keresd meg a hibát mindhárom utasításban, és javítsd őket:
(a) INSERT INTO tanulok (nev, osztaly, atlag) VALUES ('Fekete Dóra', 10.A, 4.1);
(b) SELECT nev, FROM tanulok;
(c) SELECT * FROM tanulok WHERE atlag = '4,5';

Megoldás megnyitása

(a) Az osztály szöveg, ezért aposztróf közé kell tenni: '10.A'. Nélküle az SQL a 10.A szöveget nem tudja értelmezni. (b) A felsorolás végén felesleges vessző áll: SELECT nev FROM tanulok;. (c) A tizedes szám az SQL-ben ponttal íródik, és nem szöveg: WHERE atlag = 4.5. A vesszős, aposztrófos érték szöveget jelentene, amely nem egyezik a számmal.

Gyors önellenőrzés

Válaszolj fejben, és csak utána nyisd le a választ.

1. Mit tárol egy .db fájl?

Az SQLite adatbázis összes tábláját és adatát, egyetlen fájlban.

2. Mi a különbség a tábla, az oszlop és a sor között?

A tábla egy téma adatainak gyűjteménye, az oszlop egy tulajdonság (például név), a sor egy konkrét elem összes adata.

3. Mire való a PRIMARY KEY és a UNIQUE?

A PRIMARY KEY minden sort egyedileg azonosít. A UNIQUE megakadályozza, hogy egy oszlopban két sor azonos értéket kapjon.

4. Mi a különbség a SELECT és az INSERT között?

A SELECT adatot kérdez le (nem módosít), az INSERT új sort vesz fel.

5. Mit csinál a WHERE?

Szűri a sorokat: csak a feltételnek megfelelők kerülnek az eredménybe.

6. Mi történik, ha kihagyod a Write Changes lépést?

A módosítások nem kerülnek a fájlba, és a program bezárása után elvesznek.

Mit tudsz már?

  • Érted az adatbázis, a tábla, az oszlop és a sor fogalmát.
  • Tudod, mi az SQLite, és hogyan használod a DB Browsert.
  • Létrehozol táblát kulccsal és egyedi oszloppal.
  • Használod az INSERT és a SELECT utasítást, a WHERE és az ORDER BY kulcsszóval.
  • Nem felejted el a Write Changes lépést.

Következő lecke: DB.cs és adatbázis-kapcsolat

Az adatbázis kész. A következő leckében a C# program is kapcsolódik hozzá.