Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование БД.docx
Скачиваний:
74
Добавлен:
08.03.2016
Размер:
712.24 Кб
Скачать
        1. Выполнение запросов вставки, обновления и удаления

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

QSqlQuery query;

query.exec("INSERT INTO employee (id, name, salary) "

"VALUES (1001, 'Thad Beaumont', 65000)");

Вызов команд обновления и удаления записей в подобно добавлению записей. Пример обновления записей:

  1. QSqlQuery query;

  2. query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003");

Пример удаления записей:

  1. QSqlQuery query;

  2. query.exec("DELETE FROM employee WHERE id = 1007");

        1. Использование параметризованных запросов

Если вы хотите вставить много записей за один раз, часто более эффективно отделить запрос от конкретных значений, которые необходимо вставить. Это можно выполнить, используя параметры запроса. Qtподдерживает два варианта задания параметров запроса: связывание параметров с запросом по имени и по расположению параметра. Ниже представлен пример связывания по имени:

  1. QSqlQuery query;

  2. query.prepare("INSERT INTO employee (id, name, salary) "

  3. "VALUES (:id, :name, :salary)");

  4. query.bindValue(":id", 1001);

  5. query.bindValue(":name", "Thad Beaumont");

  6. query.bindValue(":salary", 65000);

  7. query.exec();

Ниже представлен пример связывания по расположению:

  1. QSqlQuery query;

  2. query.prepare("INSERT INTO employee (id, name, salary) "

  3. "VALUES (?, ?, ?)");

  4. query.addBindValue(1001);

  5. query.addBindValue("Thad Beaumont");

  6. query.addBindValue(65000);

  7. query.exec();

Когда добавляется множество записей, необходимо вызвать QSqlQuery::prepare() единожды. Затем вызвать bindValue(), после чегоexec() необходимое количество раз.

Результаты выполнения примеров одинаковы. Если параметризация запросов поддерживается на уровне СУБД, то Qtпросто перенаправляет запрос СУБД; иначеQtимитирует подстановку параметров с помощью обработки строки запросов.

        1. Выполнение транзакций

Если лежащая в основе БД поддерживает транзакции, QSqlDriver::hasFeature(QSqlDriver::Transactions) вернетtrue.

Транзакции могут использоваться для того, чтобы сделать составную операцию неделимой (например, поиск внешнего ключа и одновременное создание записи), или чтобы обеспечить возможность отмены комплексных изменений в процессе их проведения.

Для инициирования транзакции необходимо вызвать функцию

bool QSqlDatabase::transaction();

Следующие за этим команды SQLбудут исполняться в контексте транзакции. После этого можно подтвердить транзакцию вызовом метода:

boolQSqlDatabase::commit();

или отменить ее вызовом функции:

bool QSqlDatabase::rollback();

Начинать транзакцию необходимо до формирования запросов.

Пример:

  1. QSqlDatabase::database().transaction();

  2. QSqlQuery query;

  3. query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'");

  4. if (query.next())

  5. {

  6. int employeeId = query.value(0).toInt();

  7. query.exec(QString("INSERT INTO project (id, name, ownerid) "

  8. "VALUES (201, 'Manhattan Project', %1)").arg(employeeId));

  9. }

  10. QSqlDatabase::database().commit();