Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

Если вы хотите вставить много записей за один раз, часто более эффективно отделить запрос от конкретных значений, которые необходимо вставить. Это можно выполнить, используя параметры запроса. 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 имитирует подстановку параметров с помощью обработки строки запросов. ·

 

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

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

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

bool QSqlDatabase::transaction();

 

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

bool QSqlDatabase::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();

·

2.4.4 Связь данных с пользовательским интерфейсом·

2.4.4.1. Использование классов – моделей данных SQL.

В дополнение к QSqlQuery в Qt определены высокоуровневые классы для доступа к данным:

1) QSqlQueryModel – модель, базирующаяся на произвольном SQL-запросе (выборки), работающая в режиме «только чтение»;

2) QSqlTableModel – модель, работающая с одной таблицей БД в режиме чтения и записи;

3) QSqlRelationalTableModel – подкласс QSqlTableModel с поддержкой внешних ключей.

·Данные классы предоставляют удобный способ представления данных БД в графических представлениях, таких как ·QListView и ·QTableView (примеры соответствующих виджетов приведены на рисунке 12).

Рисунок 12 – Примеры использования QListView и QTableView

 

·Граф наследования классов QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel показан на рисунке 12.

Рисунок 12 – Граф наследования классов QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel

Далее будут рассмотрены примеры использования этих классов. ·




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 698; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.