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 .
