Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_GIIS.docx
Скачиваний:
7
Добавлен:
01.03.2025
Размер:
120 Кб
Скачать
☆

14. Библиотека qt. Работа с бд. Драйверы бд.

Модуль QtSQL позвоялет обеспечить независимый от платформы и типа БД интерфейс для доступа к БД при помощи языка SQL. Связь с БД обеспечивается объектом QSqlDatabase. Для соединения с БД применяются специальные драйверы.

Qt позволяет использовать следующие драйверы:

QDB2 — IBM DB2 7.1 и выше

QIBASE — InterBase

QMYSQL — MySql

QOCI — Oracle

QODBC — MsSql (ODBC)

QPSQL — PostgreSQL 3 и выше.

QSQLITE — SQLite 3

QSQLITE2 — SQLite 2

QTDS — Sybase Adaptive Server

Из-за лецинзионных ограничений в поставку Qt с исходным кодом входит только драйвер SQLite. Qt предоставляет 2 варианта работы с БД:

  1. Использование класса QSqlQueery — позволяет выполнять произвольные команды SQL.

  2. QSqlTableModel and QSqlRelationTableModel, реализующих высокоуровневый интерфейс для работы с БД.

Соединение с БД

bool createConnection()

{

QSqlData *db=QSqlDatabase::addDatabase(«QSQLITE»,»Other»);

db->setDatabaseName(«my.sqlyte»);

if(!dp->open())

{

db->lastError().showMessage();

return false;

}

return true;

}

15. Библиотека qt. Работа с бд. Выполнение запросов к бд (qSqlQuery).

После установления соединения, посредством QSqlQuery, можно выполнять SQL-запросы к базе данных. Например, следующий код выполняет 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 << title.ascii() << ": " << year << endl; }

Первый вызов next() позиционирует QSqlQuery на первую запись в наборе данных. Последующие вызовы next() передвигают указатель на следующую запись и так до тех пор, пока не будет достигнут конец набора. В этой точке next() вернет false.

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

Класс QSqlQuery предоставляет целый набор функций для навигации по набору данных: first(), last(), prev(), seek() и at(). Они очень удобны в использовании, но на некоторых базах данных могут оказаться довольно медлительными и ресурсоемкими. С целью оптимизациии, при работе с большими наборами данных, можно вызвать QSqlQuery::setForwardOnly(true), перед exec(), а затем выполнять просмотр набора данных с помощью next(), правда в этом случае мы получаем, так называемые, однонаправленные наборы данных, т.е. такие наборы, навигация по которым может осуществляться только вперед, с помощью next().Чуть выше говорилось о том, что SQL-запрос передается как аргумент функции exec(), но текст запроса может передаваться напрямую, конструктору QSqlQuery:

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

Проверка на наличие ошибок и выдача сообщения могут быть выполнены таким образом:

if (!query.isActive())

query.lastError().showMessage();

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

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

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

После выполнения такого запроса, QSqlQuery::numRowsAffected() возвращает количество записей, подвергшихся изменению (или -1, если база данных не предусматривает поставку такой информации).

В случае необходимости вставить в запрос значения переменных или когда нежелательно, или невозможно перевести аргументы предложения INSERT в строковый вид, можно построить параметризованный запрос, с помощью функции prepare(). Текст параметризованного запроса, вместо реальных значений содержит параметры, которые заполняются фактическими значениями после создания запроса. Qt поддерживает Oracle-подобный и ODBC-подобный стили именования параметров для всех типов баз данных. Использование Oracle-подобного стиля именования:

QSqlQuery query(db);

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", QString("Living in America"));

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

query.exec();

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]