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

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

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

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

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

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

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

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

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

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

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

        1. Отображение результата запроса выборки в таблице

Пример использования модели данных, основанной на запросе:

  1. QSqlQueryModel model;

  2. model.setQuery("SELECT * FROM employee where salary > 50000");

  3. QTableView *view = new QTableView;

  4. view->setModel(model);

  5. view->show();

После установки запроса с использованием QSqlQueryModel::setQuery() вы можете использовать QSqlQueryModel::record(int) для доступа к отдельным аписям. Вы также можете использовать полиморфный методQSqlQueryModel::data() и любой из других функций, унаследованных от класса QAbstractItemModel.

Также для использования доступна перегруженнаяверсия функции setQuery(), принимающая объект типа QSqlQuery и оперирующая его результатом. Это позволяет использовать все возможности QSqlQuery для настройки запроса (например параметризованные запросы).

        1. Отображение и редактирование данных таблиц

QSqlTableModelпредоставляет возможность чтения и записи для одной таблицы. Пример использования модели данных, работающей с таблицей:

  1. QSqlTableModel model;

  2. model.setTable("employee");

  3. model.setFilter("salary > 50000");

  4. model.setSort(2, Qt::DescendingOrder);

  5. model.select();

  6. QTableView *view = new QTableView;

  7. view->setModel(model);

  8. view->show();

В отличие от предыдущего примера, использующего модель запроса, данный пример позволяет редактировать данные загруженной таблицы с использовании пользовательского интерфейса. 

QSqlTableModel– высокоуровневая альтернативаQSqlQueryдля навигации и изменения отдельных таблиц БД в коде. В результате ее применения получается меньше кода и не требуется знаний синтаксисаSQL.

Используйте QSqlTableModel::record() для получения строки таблицы иQSqlTableModel::setRecord() для изменения строки.

Например, код ниже увеличивает жалованье каждого сотрудника на 10 процентов:

  1. for (int i = 0; i < model.rowCount(); ++i)

  2. {

  3. QSqlRecord record = model.record(i);

  4. double salary = record.value("salary").toInt();

  5. salary *= 1.1;

  6. record.setValue("salary", salary);

  7. model.setRecord(i, record);

  8. }

  9. model.submitAll();

Вы также можете для доступа к данным использовать стандартные для всех моделей данных методы QSqlTableModel::data(), QSqlTableModel::setData(), QSqlTableModel::removeRows() (так как они унаследованы QAbstractItemModel).

 Пример добавления и изменения записей:

  1. model.insertRows(row, 1);

  2. model.setData(model.index(row, 0), 1013);

  3. model.setData(model.index(row, 1), "Peter Gordon");

  4. model.setData(model.index(row, 2), 68500);

  5. model.submitAll();

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

  1. model.removeRows(row, 5);

  2. model.submitAll();

Первый аргумент QSqlTableModel::removeRows() является номером первой строки, второй количеством удаляемых записей.

Обратите внимание: После окончания изменения записей необходимо вызвать QSqlTableModel::submitAll(), которая гарантирует, что изменения записались в БД. Необходимость и время, когда необходимо вызвать submitAll(), зависят от текущей стратегии редактирования табличной модели:

  1. enum EditStrategy

  2. {

  3. OnFieldChange, // изм. применяются (сразу) при вводе значения

  4. OnRowChange, // изм. применяются при обр. к другой строке (по умолч.)

  5. OnManualSubmit // изм. применяются только после вызова submitAll()

  6. };

  7. EditStrategy editStrategy() const;

  8. void setEditStrategy(EditStrategy strategy);