- •Аннотация к разделу
- •Теоритические принципы создания приложений бд
- •Основные задачи и сложности организации работы с бд
- •Программный (встроенный) sql
- •Статический sql
- •Динамический sql
- •Интерфейсы программирования приложений бд (api)
- •Интерфейс odbc
- •Механизм использования бд, применяемый в современных графических средствах разработки
- •Создание приложения, использующего бд Аннотация к подразделу
- •Настройка источников данных odbCвwindows
- •Базовые сведения о Qt
- •Введение
- •Модули Qt
- •Собственная система сборки Qt
- •Сигналы и слоты
- •Небольшой пример использования сигналов и слотов
- •Литература по Qt
- •Программный уровень
- •Уровень пользовательского интерфейса
- •Операции с бд
- •Соединение с бд
- •Выполнение запросов выборки и возврат результатов
- •Выполнение запросов вставки, обновления и удаления
- •Использование параметризованных запросов
- •Выполнение транзакций
- •Связь данных с пользовательским интерфейсом
- •Использование классов – моделей данных sql.
- •Отображение результата запроса выборки в таблице
- •Отображение и редактирование данных таблиц
- •Отображение и редактирование данных таблиц с использованием подстановки для внешних ключей
- •Связь элементов данных с обычными виджетами
- •Настройка собственной модели данных
Выполнение запросов вставки, обновления и удаления
QSqlQueryпозволяет выполнять произвольные предложенияSQL, а не толькоSELECT. Следующий пример вставляет запись в таблицу, используя предложениеINSERT:
QSqlQuery query;
query.exec("INSERT INTO employee (id, name, salary) "
"VALUES (1001, 'Thad Beaumont', 65000)");
Вызов команд обновления и удаления записей в подобно добавлению записей. Пример обновления записей:
QSqlQuery query;
query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003");
Пример удаления записей:
QSqlQuery query;
query.exec("DELETE FROM employee WHERE id = 1007");
Использование параметризованных запросов
Если вы хотите вставить много записей за один раз, часто более эффективно отделить запрос от конкретных значений, которые необходимо вставить. Это можно выполнить, используя параметры запроса. Qtподдерживает два варианта задания параметров запроса: связывание параметров с запросом по имени и по расположению параметра. Ниже представлен пример связывания по имени:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (:id, :name, :salary)");
query.bindValue(":id", 1001);
query.bindValue(":name", "Thad Beaumont");
query.bindValue(":salary", 65000);
query.exec();
Ниже представлен пример связывания по расположению:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Thad Beaumont");
query.addBindValue(65000);
query.exec();
Когда добавляется множество записей, необходимо вызвать QSqlQuery::prepare() единожды. Затем вызвать bindValue(), после чегоexec() необходимое количество раз.
Результаты выполнения примеров одинаковы. Если параметризация запросов поддерживается на уровне СУБД, то Qtпросто перенаправляет запрос СУБД; иначеQtимитирует подстановку параметров с помощью обработки строки запросов.
Выполнение транзакций
Если лежащая в основе БД поддерживает транзакции, QSqlDriver::hasFeature(QSqlDriver::Transactions) вернетtrue.
Транзакции могут использоваться для того, чтобы сделать составную операцию неделимой (например, поиск внешнего ключа и одновременное создание записи), или чтобы обеспечить возможность отмены комплексных изменений в процессе их проведения.
Для инициирования транзакции необходимо вызвать функцию
bool QSqlDatabase::transaction();
Следующие за этим команды SQLбудут исполняться в контексте транзакции. После этого можно подтвердить транзакцию вызовом метода:
boolQSqlDatabase::commit();
или отменить ее вызовом функции:
bool QSqlDatabase::rollback();
Начинать транзакцию необходимо до формирования запросов.
Пример:
QSqlDatabase::database().transaction();
QSqlQuery query;
query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'");
if (query.next())
{
int employeeId = query.value(0).toInt();
query.exec(QString("INSERT INTO project (id, name, ownerid) "
"VALUES (201, 'Manhattan Project', %1)").arg(employeeId));
}
QSqlDatabase::database().commit();