2. diel - Databázy v C ++ a Qt - Pripojenie k databáze a nová tabuľka
V minulej lekcii, Úvod do databáz v C ++ a Qt , sme sa uviedli do problematiky databáz v C ++. Než sa pustíme do niečoho okenného, zoznámime sa so základnými princípmi SQL v Qt v konzolovom prostredí. Postupne si v tutoriálu ukážeme, ako zistíme, či vôbec máme k dispozícii ovládač pre zvolený databázový stroj a ako sa pomocou neho k databáze pripojíme. Ďalej postúpime na vytvorenie databázy a tabuľky v nej.
Prvý databázový projekt v C ++
Založíme si konzolový projekt v Qt Creator, ako si ho nazvete je len na vás. Ak ste si neprešli kurz o Qt, tak ako stvoriť nový projekt v Creatora zhrniem do niekoľkých obrázkov:
Potom dostanete dialóg s výberom typu aplikácie:
Následne si môžete zvoliť umiestnenie projektu.
Project.pro
Prvé, čo budeme musieť pre sprevádzkovanie databázy urobiť, je otvoriť
si projektový súbor *.pro
, ktorý nájdete priamo v Creatora:
Nájdete v ňom niečo takéto:
QT -= gui CONFIG += c++11 console CONFIG -= app_bundle ...
Bohužiaľ Qt nevie, že chceme používať SQL a musíme mu to povedať. Pridáme teda jeden riadok:
QT -= gui QT += sql ...
Main.cpp
Teraz prejdeme do východzieho súboru, ktorý si osekáme do absolútne základného tvaru:
#include <QCoreApplication> #include <QDebug> #include <QSqlDatabase> #include <QSqlDriver> #include <QSqlError> #include <QSqlQuery> int main(int argc, char *argv[]) { Q_UNUSED(argc); Q_UNUSED(argv); }
Máme tu niekoľko nových importov, poďme si ich opísať:
<QDebug>
- Táto knižnica nám uľahčia výstup na konzolu. Nebudeme používať štandardnéQTextOut
, ale ladiace informácie.<QSqlDatabase>
- Trieda pre pripojenie a vytvorenie databázy.<QSqlDriver>
- Abstraktné trieda ovládačov - umožní prístup k špecifickej databáze.<QSqlError>
- Trieda chybových výstupov v SQL databáze.<QSqlQuery>
- Trieda pre SQL dotazy.
Q_UNUSED()
, čím označíme, že
argumenty aplikácie nebudeme využívať. Zatiaľ nič zložité.
Konštanta s názvom ovládače
Týmto máme pripravenú hlavnú funkciu pre experimenty s databázou. Ako prvú vec si pridáme konštantu s názvom ovládače pre databázu SQLite:
//... const QString DRIVER = "QSQLITE"; //...
Pripojenie databázy
Následne sa skúsime pripojiť k databáze a zároveň otestovať niekoľko chybových stavov. Databázu si vytvoríme zatiaľ iba v pamäti, aby sme sa pri experimentovaní nezaťažovali so súbormi. Kód bude nasledujúci:
// ... QSqlDatabase db; if (QSqlDatabase::isDriverAvailable(DRIVER)) { db = QSqlDatabase::addDatabase(DRIVER); db.setDatabaseName(":memory:"); qDebug() << "SQLite is ok"; // Sem budeme vkládat další kód... } else { qFatal("SQLite driver not available"); } // ...
Na začiatku vytvárame inštanciu databázy. Ak je driver k dispozícii, budeme pokračovať. Ak nemáme ovládač, je zbytočné pokračovať a ukončíme program s touto informáciou.
Vnútri podmienky používame statickú metódu, ktorá pridá ovládač k
SQLite databáze. Ďalej nastavíme meno databázy. Teraz nám bude databáza
stačiť v pamäti. Nezabudnite aj dvojbodky. Ak by ste chceli vytvoriť
súborovú databázu, uvediete názov súboru, napr .: data.db
. To
si však ukážeme ďalej v kurze.
Všimnite si, že funkcia qDebug()
používa normálny
výstupný prúd, avšak môžete použiť aj formátový reťazec ako argument
funkcie.
Dostaneme nasledujúci výstup:
Konzolová aplikácia
SQLite is ok
Zavřete toto okno stisknutím tlačítka <RETURN>...
Teraz môžeme databázu otvoriť. Keď sa to nepodarí, opäť nemá význam pokračovať a program ukončíme. Pokračujeme samozrejme vo vetve programe v podmienke:
//... // Otevíráme databázi if (db.open()) { qDebug("Databázi se zdařilo otevřít"); } else { qWarning() << "ERROR: " << db.lastError().text(); return 1; } //...
výstup:
Konzolová aplikácia
SQLite is ok
Databázi se zdařilo otevřít
Zámerne som nepoužil funkciu qFatal(char *)
, pretože sa mi
nechcelo vytvárať formátový reťazec a ešte prevádzať na ASCII kód.
qWarning()
používa výstupný prúd a ľahšie pracuje s textom
typu QString
. Program v prípade chyby jednoducho ukončíme
príkazom return 1;
Za povšimnutie určite stojí funkcia db.lastError().text()
,
ktorá skutočne vracia textovú reprezentáciu posledný chyby, ktorá
nastala.
Vytvorenie databázovej tabuľky
Ďalším krokom v databáze vytvoríme nejakú jednoduchú tabuľku. Napr. zoznam ľudí s ich ID a menom:
QSqlQuery query("CREATE TABLE people (id INTEGER PRIMARY KEY, name TEXT)");
CREAM TABLE
Pre vytvorenie novej tabuľky používame SQL príkaz
CREATE TABLE
nasledovaný názvom tabuľky, v našom prípade
people
, a ďalej zátvorkou. V tej uvádzame aké má tabuľka
stĺpce ako názov stĺpca a jeho dátový typ. Jednotlivé stĺpce oddeľujeme
čiarkou. Typ INTEGER
označuje celé čísla a TEXT
text. PRIMARY KEY
u stĺpce id
udáva, že sa jedná o
unikátny identifikátor záznamov. Toto id
sa bude tiež
automaticky navyšovať s každou novo vloženou osobou.
QSqlQuery
Vytvorili sme inštanciu QSqlQuery
. Na
tomto je pozoruhodné, že príkaz v argumentu sa okamžite vykoná, bez toho
aby sme museli volať query.exec()
. Je to síce príjemná
vlastnosť, ale predsa len by sme možno radi vedeli, či operácia prebehla
úspešne. Qt myslí aj na toto a dalo k dispozícii funkciu
bool query.isActive()
, ktorá vracia true
pri
úspechu. Môžeme ju teda rovno aplikovať:
//... if (query.isActive()) { qDebug() << "Tabulka vytvořena"; } else { qWarning() << "ERROR: " << query.lastError().text(); return 1; } //...
Výstup nášho programu je teraz nasledujúce:
Konzolová aplikácia
SQLite is ok
Databázi se zdařilo otevřít
Tabulka vytvořena
Tu by opäť v prípade chyby v programe nemalo zmysel pokračovať, pretože keď tabuľka nie je, nemožno do nej nič uložiť.
Tabuľku máme pripravenú a dáta si do nej vložíme zas nabudúce, v lekcii Databázy v C ++ a Qt - Základy Qt SQL .