Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Обычно функцию 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 для просмотра результирующего набора.

Ранее мы задавали запрос SQL в аргументе функции QSqlQuery::exec, но, кроме того, мы можем передавать его непосредственно конструктору, который сразу же выполнит его:

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

Мы можем проверить наличие ошибки, вызывая функцию isActive для запроса:

if (!query.isActive)

QMessageBox::warning(this, tr("Database Error"),

query.lastError.text);

Если ошибки нет, запрос

становится «активным» и мы можем использовать next для перемещения по результирующему набору.

Выполнение команды INSERT осуществляется почти так же просто, как и команды SELECT:

QSqlQuery query("INSERT INTO cd (id, artistid, title, year) "

"VALUES (203, 102, 'Living in America', 2002)");

После этого функция numRowsAffected возвращает количество строк, которые были изменены инструкцией SQL (или —1, если возникла ошибка).

Если нам необходимо вставлять много записей или если мы хотим избежать преобразования значений в строковые данные (и правильного преобразования специальных символов), мы можем использовать функцию prepare для указания полей в шаблоне запроса и затем присваивания им необходимых нам значений. Qt поддерживает как стиль Oracle, так и стиль ODBC для всех баз данных, применяя, где возможно, «родной» интерфейс базы данных или имитируя его в противном случае. Ниже приводится пример, в котором используется синтаксис Oracle для представления поименованных полей:

QSqlQuery query;

query.prepare("INSERT INTO cd (id, artistid, title, year) "

"VALUES (:id, :artistid, :title, :year)");

query.bindValue(":id", 203);

query.bindValue(":artistid", 102);

query.bindValue(":title", "Living in America");

query.bindValue(":year", 2002);

query.exec;

Ниже приводится тот же пример позиционного представления полей в стиле ODBC:

QSqlQuery query;

query.prepare("INSERT INTO cd (id, artistid, title, year) "

"VALUES (?, ?, ?, ?)");

query.addBindValue(203);

query.addBindValue(102);

query.addBindValue("Living in America");

query.addBindValue(2002);

query.exec;

После вызова функции exec мы можем вызвать bindValue или addBindValue для присваивания новых значений, затем снова вызвать exec для выполнения запроса уже с новыми значениями.

Такие шаблоны часто используются для задания двоичных строковых данных, содержащих символы не в коде ASCII или Latin-1. Незаметно для пользователя Qt использует Unicode в тех базах данных, которые поддерживают Unicode, а в тех, которые не делают этого, Qt также незаметно для пользователя преобразует строковые данные в соответствующую кодировку.

Qt поддерживает SQL—транзакции в тех базах данных, где они предусмотрены. Для запуска транзакции мы вызываем функцию transaction для объекта QSqlDatabase, представляющего соединение с базой данных. Для завершения транзакции мы вызываем либо функцию commit, либо функцию rollback. Например, ниже показано, как мы можем найти внешний ключ (foreign key) и выполнить команду INSERT внутри транзакции:

Поделиться:
Популярные книги

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Мастер Разума IV

Кронос Александр
4. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума IV

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Кадры решают все

Злотников Роман Валерьевич
2. Элита элит
Фантастика:
боевая фантастика
попаданцы
альтернативная история
8.09
рейтинг книги
Кадры решают все

Плеяда

Суконкин Алексей
Проза:
военная проза
русская классическая проза
5.00
рейтинг книги
Плеяда

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Ученик. Книга 4

Первухин Андрей Евгеньевич
4. Ученик
Фантастика:
фэнтези
5.67
рейтинг книги
Ученик. Книга 4

Законник Российской Империи. Том 3

Ткачев Андрей Юрьевич
3. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
5.00
рейтинг книги
Законник Российской Империи. Том 3

Ваше Сиятельство 7

Моури Эрли
7. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Ваше Сиятельство 7

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Младший сын князя. Том 4

Ткачев Андрей Юрьевич
4. Аналитик
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Младший сын князя. Том 4