IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Založenie C ++ projektu v Qt Creator - Databázy v C ++ pomocou Qt SQL

Potom dostanete dialóg s výberom typu aplikácie:

Typ aplikácie alebo projektu - Databázy v C ++ pomocou Qt SQL

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:

projektový súbor - Databázy v C ++ pomocou Qt SQL

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.
Ďalej sme použili makro 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 .


 

Predchádzajúci článok
Úvod do databáz v C ++ a Qt
Všetky články v sekcii
Databázy v C ++ pomocou Qt SQL
Preskočiť článok
(neodporúčame)
Databázy v C ++ a Qt - Základy Qt SQL
Článok pre vás napísal Virlupus
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje webovým aplikacím, skladově-účetnímu softwaru, 3D grafice, lexiální analýze a parserování. Studuje fyziku na MFF UK. Učil IT na střední škole.
Aktivity