Elemi adatbázis kezelés

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés elemi eszközökkel. A MySQL adatbázis-kezelő

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Adatbázis-kezelés elemi eszközökkel. Giachetta Roberto

Elemi alkalmazások fejlesztése IV.

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

Adatbáziskezelés M/V architektúrában

Eseményvezérelt alkalmazások fejlesztése I 10. előadás. Adatbázis-kezelés modell/nézet architektúrában. Giachetta Roberto

Adatbázisok webalkalmazásokban

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés modell/nézet architektúrában

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS. Adatbázis alapú alkalmazások készítése PHP-ben

Adatbázis Rendszerek II. 1. SQL programozási felületek 39/1B IT MAN

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Adatbáziskezelés php-ben MySQL adatbáziskezelı rendszert használva

Adatbázis Rendszerek II. 8. Gyakorló környezet

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Megtanuljuk, hogyan lehet egy web-alkalmazással adatbázishoz csatlakozni Pontosan megnézzük a PHP lehetőségeit o MySQL-hez o Oracle-höz

JAVA PROGRAMOZÁS 8.ELŐADÁS

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Java programozási nyelv 11. rész Adatbázis-programozás

Az SQL*Plus használata

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

B I T M A N B I v: T M A N

Adatbázis kezelés Delphiben. SQL lekérdezések

Elemi alkalmazások fejlesztése IV. Adatbáziskezelő alkalmazás készítése C++/Qt ben I.

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (ASP.NET)

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Webfejlesztés 4. alkalom

Adatbázis Rendszerek II. 2. Gyakorló környezet

Adatbázisok elleni fenyegetések rendszerezése. Fleiner Rita BMF/NIK Robothadviselés 2009

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Vizuális programozás gyakorlat

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Egyetemi könyvtári nyilvántartó rendszer

Excel ODBC-ADO API. Tevékenységpontok: - DBMS telepítés. - ODBC driver telepítése. - DSN létrehozatala. -Excel-ben ADO bevonása

Adatbázisok* tulajdonságai

Database Systems II. ZH összefoglaló

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Java és web programozás

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

Extrémen brutál, gyors talpaló PHP nyelvhez (database). v2.1

Elemi alkalmazások fejlesztése IV. Adatbáziskezel alkalmazás készítése QtDesignerben. Készítette: Szabóné Nacsa Rozália

Adatbázis-kezelés ODBC driverrel

Bevezetés: az SQL-be

3. Beadandó feladat dokumentáció

ANDROID ALKALMAZÁSFEJLESZTÉS

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Java és web programozás

Adatbázis rendszerek 7. előadás State of the art

Tranzakciókezelés PL/SQL-ben

Egyetemi könyvtári nyilvántartó rendszer

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

LBRA6i integrált rendszer

Készítette: Szabóné Nacsa Rozália

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Elemi alkalmazások fejlesztése III.

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

Adattípusok. Max. 2GByte

Adatbázis-kezelés. Harmadik előadás

Adatbázis Rendszerek I. 9. SQL alapok (DDL esettanulmány)

ADATBÁZIS-KEZELÉS - BEVEZETŐ - Tarcsi Ádám, ade@inf.elte.hu

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

API tervezése mobil környezetbe. gyakorlat


Informatikai képzés Információs rendszerek dr. Hajas Csilla (ELTE IK)

MDAC - Microsoft Data Access Components

IBM WebSphere Adapters 7. változat 5. alváltozat. IBM WebSphere Adapter for Oracle E-Business Suite felhasználói kézikönyv 7. változat 5.

BEVEZETÉS Az objektum fogalma

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Az SQL adatbázisnyelv: DML

SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok

Adattípusok. Max. 2GByte

Adatbáziskezelı-szerver SQL. Relációs adatbázis-kezelık. Relációs adatszerkezet. Házi feladat

Elemi alkalmazások fejlesztése IV.

Adatbázis tartalmának módosítása

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Választó lekérdezés létrehozása

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

Adatbázis használat I. 5. gyakorlat

Adatbáziskezelő-szerver. Relációs adatbázis-kezelők SQL. Házi feladat. Relációs adatszerkezet

SQL DDL-2 (aktív elemek) triggerek

BGF. 4. Mi tartozik az adatmodellek szerkezeti elemei

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté

Informatika terméktervezőknek

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

SQL. 1.rész. 1.elıadás // Adatbázisok-1 elıadás // Ullman-Widom (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE) október október 22. Adatbázisok 1 / 14

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

Téradatbázisok használata QGIS-ből A DB kezelő modul 2.2 verzió

Átírás:

Elemi adatbázis kezelés

Adatbázisok használata Qt alatt A Qt-ben a QtSql module támogatja az SQL elérésű adatbázisok platform- és adatbázis független használatát. Az adatbázis kapcsolat kiépítése során megadott driver-ek biztosítják a különböző adatbázisok API-jaival való kommunikációt. Az SQL szintaxist jól ismerők számára lehetőség van arra, hogy Qt-ben közvetlenül SQL utasítások segítségével végezzék az adatbázis-kezelést. A magasabb szintű adatbázis-kezelést kedvelők az adatbázis adatainak egy részét ún. SQL táblákban tudják betölteni, majd ezekben, mint adatmodellekben, az adatokat bejárhatják és szerkeszthetik, majd az adatbázisba visszaírhatják. Mivel ezek a modellek megfelelő megjelenítő widget-ekkel párosíthatóak, így végső soron három-rétegű adatbázismodell-nézet architektúrákat tudunk kialakítani. 2

A Qt adatbázis-kezelő modul A QtSql modul számos osztályt tartalmaz az SQL alapú adatbázisok kezeléséhez. Ezeket három csoportba sorolhatjuk. A modell osztályok biztosítják a logikai (memóriában felépített) adatbázist, és ehhez interfészt a felületi réteg számára: QSqlQueryModel, QSqlTableModel, QSqlRelationalModel. Az alkalmazásprogramozói (API) osztályok biztosítják az SQL elemek kezelését: QSqlDataBase, QSqlQuery, QSqlError, QSqlField, QSqlIndex, QSqlRecord. A meghajtó osztályok biztosítják az adatbázis elérését és a kommunikációt: QSqlDriver, QSqlDriverCreator<T>, QSqlDriverCreatorBase, QSqlDriverPlugin, QSqlResult. 3

A Qt adatbázis-kezelő modul QSqlTableModel QSqlIndex QSqlRecord QSqlDatabase QSqlQuery QSqlResult QSqlDriver adatbázis 4

A QtSql modul használatba vétele A modul osztályainak használatához a megfelelő osztályt kell meghivatkozni az aktuális fájlban, illetve lehetőség van a teljes modul betöltésére is: #include <QtSql> A modul alapból nem érhető el egy alap Qt alkalmazásban, használatát a projektfájlban jeleznünk kell a QT += sql utasítással a betöltendő modulok egy sorban is lehetnek, pl. QT += core gui widgets sql amennyiben konzol felületen szerkesztünk, a projektfájl létrehozásakor is hozzáadhatjuk a modult: qmake -project "QT += sql" 5

Adatbázis meghajtók A QtSQL modul több beépített meghajtót is tartalmaz a különböző adatbázis-motorok kezelésére, valamint felületet biztosít további meghajtók készítésére: QMYSQL ~ MySQL QOCI ~ Oracel (Oracel call interface driver) QODBC ~ ODBC (open database connectivity) pl. Microsoft SQL Server-hez QSQLLITE ~ SQLite Nincs minden meghajtó előre telepítve, bizonyos esetekben további csomagként (pl. libqt5sql5-mysql) kell hozzáadnunk őket. 6

Adatbáziskapcsolat létesítése Adatbázismotort betölteni, és kapcsolatot létesíteni a QSqlDatabase osztály segítségével tudunk, pl.: QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.sethostname("localhost"); // szerver db.setdatabasename("mydatabase"); // adatbázis db.setusername("root"); // felhasználónév db.setpassword("root"); // jelszó A betöltést az adddatabase() statikus metódussal végezzük a meghajtó megadásával, beállíthatjuk a szervert, az adatbázist, valamint a felhasználó adatait. A rendelkezésre álló meghajtókat a drivers() metódussal kérhetjük le. 7

Adatbáziskapcsolatok Lehetőségünk van több kapcsolatot is kezelni a programban: A kapcsolatok elnevezéssel rendelkeznek, ezen keresztül érhetjük el őket: adddatabase(<meghajtó>, <név>). Kapcsolatok listázhatóak (connectionnames()), lekérhetőek (database(<név>)), törölhetőek (removedatabase(<név>)). Kapcsolatot megnyitni az open(), bezárni a close() művelettel tudunk. Ha nem sikerül a megnyitás, hamissal tér vissza. A program bezárása nem zárja be a nyitott kapcsolatokat. 8

SQL utasítások végrehajtása SQL utasítást közvetlenül az QSqlQuery segítségével futtathatunk, pl.: QSqlQuery query; if (query.exec("select id, data from mytable")) // parancs futtatása // a query által visszaadott válasz soronkénti értelmezése else // sikertelen futtatás cout << query.lasterror().text(); A konstruktorban megadható paraméterként az adatbázis kapcsolat, ha nem adjuk meg, az alapértelmezettet használja. Az exec() művelettel tetszőleges utasítást végrehajthatunk, és igazzal tér vissza, amennyiben sikerült végrehajtania. A lasterror() segítségével lekérdezhetjük a hiba okát. 9

Lekérdezés olvasása Amennyiben lekérdezést hajtottunk végre, az eredményt soronként kezeljük, azaz egyszerre nem látjuk a teljes eredményt csak egy sorát. Lépegetni a first(), next(), previous(), last() utasításokkal lehet, a size() megadja a lekérdezett sorok számát. Kezdetben az eredmény első sora előtt állunk, tögtén léptetni kell. Amennyiben csak előre akarunk lépkedni, a setforwardonly() metódus optimalizálja a lekérdezést. Adott sorra ugrani a seek(<sorszám>) metódussal, mindegyik igazat ad, ha tudott lépni. Értéket lekérdezni a kijelölt sorból a value(<oszlopszám>) metódussal tudunk. Az érték QVariant típusú, így az tovább konvertálható alkalmas formára. while (query.next()){ cout << query.value(0).tostring(); // első oszlop szöveg cout << query.value(1).toint(); // második oszlop egész szám 10

1.Feladat Készítsünk egyszerű konzol alkalmazást, amely alkalmas az apartmanadatbázis (apartments) felhasználók (user) táblájának listázására, felhasználó törlésére, valamint új felhasználó beszúrására. A program csak megfelelő felhasználónév/jelszó megadásával engedi elvégezni a tevékenységeket. A program lekérdezés segítségével azonosít, beolvassa a táblatartalmat (azonosító, név, jelszó, szint), kilistázza, lehetőséget ad azonosító alapján törlésre, és beszúrásra. A programot vezéreljük menün keresztül (ehhez hozzunk létre egy menü osztályt). 11

1.Feladat: tervezés user «column» *PK user_name :VARCHAR(10) user_password :VARCHAR(40) full_name :VARCHAR(40) level :INTEGER «PK» + PK_user(VARCHAR(10)) 12

1.Feladat: tervezés DROP DATABASE IF EXISTS apartments; CREATE DATABASE apartments; USE apartments; CREATE TABLE user( user_name VARCHAR(10) PRIMARY KEY, user_password VARCHAR(40) NOT NULL, full_name VARCHAR(40) NOT NULL, level INTEGER NOT NULL ); insert into user(user_name, user_password, full_name, level) values('root', 'root', 'adminisztrátor', 0); insert into user(user_name, user_password, full_name, level) values('roberto', 'roberto', 'Roberto', 1); 13

1.Feladat: tervezés Hozzunk létre egy menü osztályt a menü kezelésére. Menu + Menu() + Run() :void - ShowAllUsers() :void - ShowCreateUser() :void - ShowRemoveUser() :void - validateuser() :bool 14

1.Feladat: megvalósítás int main(int argc, char *argv[]){ kapcsolat létrehozása QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); kapcsolat beállítása if (db.open()) { Menu m; m.run(); sikeres megnyitás esetén db.close(); kapcsolat bezárása else { return 0; sikertelen kapcsolódás 15

1.Feladat: megvalósítás void Menu::showAllUsers(){ fejléc írása a konzolra QSqlQuery selectquery; selectquery.exec("select user_name, user_password, full_name, level from user"); // lekérdezés futtatása while (selectquery.next()) { selectquery.value( ) konvertálása és kiírása a konzolra void Menu::ShowRemoveUser() { törlő utasítás végrehajtása getline(cin, usernamestring); QSqlQuery removequery; removequery.exec("delete from user where user_name = '" + QString::fromStdString(userNameString) + "'"); 16

1.Feladat: megvalósítás void Menu::showCreateUser(){ adatok beolvasása QSqlQuery insertquery; insertquery.exec("insert into user values(" + QString::fromStdString(userNameString) + ", " + QString::fromStdString(fullNameString) + ", " + QString::fromStdString(userPasswordString) + ", " + QString::fromStdString(levelString) + ")"); if (!insertquery.exec()) // ha sikertelen a végrehajtás cout << "Hiba történt: " << insertquery.lasterror().text().tostdstring()<<endl; 17

1.Feladat: megvalósítás bool Menu::validateUser(){ adatok beolvasása string username, userpassword; cout << "Felhasználónév: "; getline(cin, username); cout << "Jelszó: "; getline(cin, userpassword); QSqlQuery selectquery; selectquery.exec( "select user_name, user_password from user where user_name = " + QString::fromStdString(userName) + "' and user_password = " + QString::fromStdString(userPassword) + "'"); return selectquery.next(); ha van eredmény akkor sikerült a lekérdezés 18

SQL injekció Az adatbázisban tárolt adatokat meg kell óvni az illetéktelen felhasználók elől, biztonságossá kell tenni az adatokhoz való hozzáférést. A programok az adatbázis-szerveren SQL lekérdezéseket futtatnak, amelyeket szövegként állítanak össze. Az összeállítás során törekedni kell arra, hogy ne lehessen manipulálni az utasítást úgy, hogy az illetéktelen felhasználók hozzáférhessenek vagy kárt tegyenek a tárolt adatokhoz/ban. Az SQL parancsok manipulációját nevezzük SQL injekciónak (SQL injection) leggyakoribb webes környezetben 19

Példa // felhasználónév/jelszó bekérése QSqlQuery query; query.exec("select user_name from users where user_name = '" + username + "' and password = '" + password + "'"); // username = "", password = "' or '1' = '1" esetén ez a feltétel // minden sorra igazat ad, az egész táblát lekéri query.exec("select user_name from users where " + " user_name = '' and password = '' or '1' = '1'"); 20

SQL injekció kivédése 1. A felhasználótól kapott értékek ellenőrzésével, módosításával. username = username.remove("'"); 2. A felhasználó által megadható adatok korlátozásával. QLineEdit linedit; lineedit.setinputmask("aaaaaaaaaaaaaaa"); // csak alfabetikus karaktereket fogad el lineedit.setvalidator(qregexpvalidator("[a-za-z0-9]{1,8")); // 1-8 db alfanumerikus karaktert fogad el 3. Paraméteres utasítások használatával (pl. ORACLE stílusú helyőrző nevekkel) építjük fel az SQL parancsot). QSqlQuery query; query.prepare("select user_name from users where " + "user_name = :uname and password = :psw"); query.bindvalue(":uname", "akarki"); // paraméter beírása query.bindvalue(":psw", "admin"); query.exec(); 4. Az injekciót eleve kizáró megoldások (pl. adatmodell) használatával. 21

2.Feladat Készítsünk egyszerű konzol alkalmazást, amely alkalmas az apartmanadatbázis (apartments) felhasználók (user) táblájának listázására, felhasználó törlésére, valamint új felhasználó beszúrására. A program csak megfelelő felhasználónév/jelszó megadásával engedi elvégezni a tevékenységeket. A program paraméteres utasításokat fog használni, kikerülve az SQL injekció lehetőségét. Azonosít, beolvassa a táblatartalmat (azonosító, név, jelszó, szint), kilistázza, lehetőséget ad azonosító alapján törlésre, és beszúrásra. 22

2.Feladat: tervezés Menu - insertquery :QSqlQuery - removequery :QSqlQuery - selectquery :QSqlQuery - validatequery :QSqlQuery + Menu() + Run() :void - ShowAllUsers() :void - ShowCreateUser() :void - ShowRemoveUser() :void - validateuser() :bool 4 QSqlDatabase QSqlQuery 23

2.Feladat: megvalósítás bool Menu::validateUser(){ string username, userpassword; cout << "Felhasználónév: "; getline(cin, username); adatok beolvasása cout << "Jelszó: "; paraméterek behelyettesítése getline(cin, userpassword); validatequery.bindvalue(":name", QString::fromStdString(userName)); validatequery.bindvalue(":password", QString::fromStdString(userPassword)); validatequery.exec(); lekérdezés futtatása return validatequery.next(); ha van eredmény akkor sikerült a lekérdezés 24

3.Feladat Készítsünk egyszerű konzol alkalmazást, amely alkalmas az apartmanadatbázis (apartments) felhasználók (user) táblájának listázására, felhasználó törlésére, valamint új felhasználó beszúrására. Az alkalmazáshoz csak a korábbi menü osztályt kell módosítanunk, további saját új osztályra nem lesz szükségünk, a létező típusok felhasználásával megoldható a feladat. Az adatok kezelését egy tábla modellel végezzük (QSqlTableModel), amely a háttérben futtatja a megfelelő SQL műveleteket. 25

3.Feladat: tervezés Menu QSqlDatabase + Menu() + Run() :void - ShowAllUsers() :void - ShowCreateUser() :void - ShowRemoveUser() :void - validateuser() :bool -*model QSqlTableModel 26

3.Feladat: megvalósítás bool Menu::Menu(){ model = new QSqlTableModel(); tábla modell beállítása model->settable("user"); // lehetne szűrőt adni: model->setfilter("level = 0") void Menu::ShowAllUsers(){ model->select(); for(int i=0; i < model->rowcount(); ++i){ i-edik rekord QSqlRecord record = model->record(i); cout << record.value(user_name).tostring() << record.value(user_password).tostring() << endl; adatbázisbeli mezőnév 27

3.Feladat: megvalósítás void Menu::ShowCreateUser(){ int row = 0; 1 új sort szúr be a modellbe model->insertrows(row, 1); model->setdata(model->index(row, 0), "gt" ); model->setdata(model->index(row, 1), "secret" ); model->setdata(model->index(row, 2), "gregorics" ); model->setdata(model->index(row, 3), 0); model->submitall(); adatbázisba mentés 28

3.Feladat: megvalósítás void Menu::ShowRemoveUser(){ string name; cout << "Felhasználónév: "; getline(cin, name); Qstring filter = "user_name = " + QString::fromStdString(name); model->setfilter(filter); model->select(); szűrő beállítása a modell feltöltéséhez if(model->rowcount() > 0){ model->removerows(0, model->rowcount()); model->submitall(); adatbázisba mentés 29

3.Feladat: megvalósítás bool Menu::validateUser(){ string username, userpassword; cout << "Felhasználónév: "; getline(cin, username); cout << "Jelszó: "; getline(cin, userpassword); Qstring filter = "user_name = " + QString::fromStdString(name); model->setfilter(filter); model->select(); szűrő beállítása a modell feltöltéséhez return model->rowcount()>0; 30