Жасмин Бланшет

Книги → QT 4: программирование GUI на С++ → Соединение с базой данных и выполнение запросов

Для выполнения запросов SQL мы должны сначала установить соединение с базой данных. Обычно настройка соединений с базой данных выполняется отдельной функцией, которую мы вызываем при запуске приложения. Например:

01 bool createConnection()

02 {

03 QSqlDatabase *db = QSqlDatabase::addDatabase("QOCI8");

04 db->setHostName("mozart.konkordia.edu");

05 db->setDatabaseName("musicdb");

06 db->setUserName("gbatstone");

07 db->setPassword("T17aV44");

08 if (!db->open()) {

09 db->lastError().showMessage();

10 return false;

11 }

12 return true;

13 }

Во-первых, мы вызываем функцию QSqlDatabase::addDatabase() для создания объекта QSqlDatabase. Первый аргумент функции addDatabase() задает драйвер базы данных, который Qt должна использовать для доступа к базе данных. В данном случае мы используем MySQL (??? — в коде QOCI, Oracle Call Interface).

Затем мы устанавливаем имя хоста базы данных, имя базы данных, имя пользователя и пароль, и мы открываем соединение. Если функция open() завершается неудачей, мы выводим сообщение об ошибке, используя QSqlError::showMessage().

Обычно функцию createConnection() вызывают в main():

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 if (!createConnection())

05 return 1;

06 return app.exec();

07 }

После установки соединения мы можем применять QSqlQuery для выполнения любой инструкции SQL, поддерживаемой используемой базой данных. Ниже приводится пример выполнения команды SELECT:

QSqlQuery query;

query.exec("SELECT title, year FROM cd WHERE year >= 1998");

После вызова функции exec() мы можем просмотреть результат запроса:

while (query.next()) {

QString title = query.value(0).toString();

int year = query.value(1).toInt();

cerr << qPrintable(title) << ": " << year << endl;

}

Мы вызываем функцию next() один раз для позиционирования QSqlQuery на первую запись полученного набора. Последующие вызовы next() продвигают указатель записи на одну позицию дальше, пока не будет достигнут конец, когда функция next() возвращает false. Если результирующий набор (result set) пустой (или запрос завершается неудачей), первый вызов функции next() возвратит false.

Функция value() возвращает значение поля, как QVariant. Поля пронумерованы начиная с 0 в порядке их указания в команде SELECT. Класс QVariant может содержать многие типы С++ и Qt, включая int и QString. Другие типы данных, которые могут храниться в базе данных, преобразуются в соответствующие типы С++ и Qt и хранятся в QVariant. Например, VARCHAR представляется в виде QString, a DATETIME — в виде QDateTime.

Класс QSqlQuery содержит некоторые другие функции для просмотра результирующего набора: first(), last(), previous() и seek(). Эти функции удобны, но для некоторых баз данных они могут выполняться медленнее и расходовать памяти больше, чем функция next(). При работе с большими наборами данных мы можем осуществить простую оптимизацию, вызывая функцию QSqlQuery::setForwardOnly(true) перед вызовом exec(), и только затем использовать next() для просмотра результирующего набора.

← предущий раздел следующая →

Страницы раздела: 1 2 3 4 5

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.