- •Аннотация к разделу
- •Теоритические принципы создания приложений бд
- •Основные задачи и сложности организации работы с бд
- •Программный (встроенный) sql
- •Статический sql
- •Динамический sql
- •Интерфейсы программирования приложений бд (api)
- •Интерфейс odbc
- •Механизм использования бд, применяемый в современных графических средствах разработки
- •Создание приложения, использующего бд Аннотация к подразделу
- •Настройка источников данных odbCвwindows
- •Базовые сведения о Qt
- •Введение
- •Модули Qt
- •Собственная система сборки Qt
- •Сигналы и слоты
- •Небольшой пример использования сигналов и слотов
- •Литература по Qt
- •Программный уровень
- •Уровень пользовательского интерфейса
- •Операции с бд
- •Соединение с бд
- •Выполнение запросов выборки и возврат результатов
- •Выполнение запросов вставки, обновления и удаления
- •Использование параметризованных запросов
- •Выполнение транзакций
- •Связь данных с пользовательским интерфейсом
- •Использование классов – моделей данных sql.
- •Отображение результата запроса выборки в таблице
- •Отображение и редактирование данных таблиц
- •Отображение и редактирование данных таблиц с использованием подстановки для внешних ключей
- •Связь элементов данных с обычными виджетами
- •Настройка собственной модели данных
Связь данных с пользовательским интерфейсом
Использование классов – моделей данных sql.
В дополнение к QSqlQueryвQtопределены высокоуровневые классы для доступа к данным:
QSqlQueryModel – модель, базирующаяся на произвольном SQL-запросе (выборки), работающая в режиме «только чтение»;
QSqlTableModel – модель, работающая с одной таблицей БД в режиме чтения и записи;
QSqlRelationalTableModel – подклассQSqlTableModel с поддержкойвнешних ключей.
Данные классы предоставляют удобный способ представления данных БД в графических представлениях, таких как QListViewиQTableView(примеры соответствующихвиджетовприведены на рисунке 0).
Рисунок 0 – Примеры использования QListViewиQTableView
Граф наследования классов QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel показан на рисунке 0.
Рисунок 0 – Граф наследования классов QSqlQueryModel, QSqlTableModel и QSqlRelationalTableModel
Далее будут рассмотрены примеры использования этих классов.
Отображение результата запроса выборки в таблице
Пример использования модели данных, основанной на запросе:
QSqlQueryModel model;
model.setQuery("SELECT * FROM employee where salary > 50000");
QTableView *view = new QTableView;
view->setModel(model);
view->show();
После установки запроса с использованием QSqlQueryModel::setQuery() вы можете использовать QSqlQueryModel::record(int) для доступа к отдельным аписям. Вы также можете использовать полиморфный методQSqlQueryModel::data() и любой из других функций, унаследованных от класса QAbstractItemModel.
Также для использования доступна перегруженнаяверсия функции setQuery(), принимающая объект типа QSqlQuery и оперирующая его результатом. Это позволяет использовать все возможности QSqlQuery для настройки запроса (например параметризованные запросы).
Отображение и редактирование данных таблиц
QSqlTableModelпредоставляет возможность чтения и записи для одной таблицы. Пример использования модели данных, работающей с таблицей:
QSqlTableModel model;
model.setTable("employee");
model.setFilter("salary > 50000");
model.setSort(2, Qt::DescendingOrder);
model.select();
QTableView *view = new QTableView;
view->setModel(model);
view->show();
В отличие от предыдущего примера, использующего модель запроса, данный пример позволяет редактировать данные загруженной таблицы с использовании пользовательского интерфейса.
QSqlTableModel– высокоуровневая альтернативаQSqlQueryдля навигации и изменения отдельных таблиц БД в коде. В результате ее применения получается меньше кода и не требуется знаний синтаксисаSQL.
Используйте QSqlTableModel::record() для получения строки таблицы иQSqlTableModel::setRecord() для изменения строки.
Например, код ниже увеличивает жалованье каждого сотрудника на 10 процентов:
for (int i = 0; i < model.rowCount(); ++i)
{
QSqlRecord record = model.record(i);
double salary = record.value("salary").toInt();
salary *= 1.1;
record.setValue("salary", salary);
model.setRecord(i, record);
}
model.submitAll();
Вы также можете для доступа к данным использовать стандартные для всех моделей данных методы QSqlTableModel::data(), QSqlTableModel::setData(), QSqlTableModel::removeRows() (так как они унаследованы QAbstractItemModel).
Пример добавления и изменения записей:
model.insertRows(row, 1);
model.setData(model.index(row, 0), 1013);
model.setData(model.index(row, 1), "Peter Gordon");
model.setData(model.index(row, 2), 68500);
model.submitAll();
Пример удаления пяти записей:
model.removeRows(row, 5);
model.submitAll();
Первый аргумент QSqlTableModel::removeRows() является номером первой строки, второй количеством удаляемых записей.
Обратите внимание: После окончания изменения записей необходимо вызвать QSqlTableModel::submitAll(), которая гарантирует, что изменения записались в БД. Необходимость и время, когда необходимо вызвать submitAll(), зависят от текущей стратегии редактирования табличной модели:
enum EditStrategy
{
OnFieldChange, // изм. применяются (сразу) при вводе значения
OnRowChange, // изм. применяются при обр. к другой строке (по умолч.)
OnManualSubmit // изм. применяются только после вызова submitAll()
};
EditStrategy editStrategy() const;
void setEditStrategy(EditStrategy strategy);