Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

Для выполнения запросов с другим соединением мы передаем объект QSqlDatabase конструктору QSqlQuery:

QSqlQuery query(db);

query.exec("SELECT id FROM artist WHERE name = 'Mando Diao'");

Несколько соединений полезны, если мы хотим выполнять одновременно несколько транзакций, поскольку каждое соединение может использоваться только для одной активной транзакции. Когда мы используем несколько соединений с базой данных, мы можем все-таки иметь одно непоименованное соединение и QSqlQuery будет использовать это соединение, если не указано поименованное соединение.

Кроме QSqlQuery Qt содержит класс QSqlTableModel — интерфейс высокого уровня, позволяя нам не использовать выражения SQL «в чистом виде» для выполнения наиболее распространенных SQL—команд (SELECT, INSERT, UPDATE и DELETE). Этот класс может использоваться автономно без какого-либо графического пользовательского интерфейса или в качестве источника данных для QListView или QTableView.

Ниже приводится пример использования QSqlTableModel для выполнения команды SELECT:

QSqlTableModel model;

model.setTable("cd");

model.setFilter("year >= 1998");

model.select;

Это эквивалентно запросу

SELECT * FROM cd WHERE year >= 1998

Просмотр результирующего набора выполняется путем получения заданной записи функцией QSqlTableModel::record и доступа к отдельным полям с помощью функции value:

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

QSqlRecord record = model.record(i);

QString title = record.value("title").toString;

int year = record.value("year").toInt;

cerr << qPrintable(title) << ": " << year << endl;

}

Функция QSqlRecord::value принимает либо имя поля, либо индекс поля. При работе с большими наборами данных рекомендуется задавать поля с помощью их индексов. Например:

int titleIndex = model.record.indexOf("title");

int yearIndex = model.record.indexOf("year");

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

QSqlRecord record = model.record(i);

QString title = record.value(titleIndex).toString;

int year = record.value(yearIndex).toInt;

cerr << qPrintable(title) << ": " << year << endl;

}

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

QSqlTableModel model;

model.setTable("cd");

int row = 0;

model.insertRows(row, 1);

model.setData(model.index(row, 0), 113);

model.setData(model.index(row, 1), "Shanghai My Heart");

model.setData(model.index(row, 2), 224);

model.setData(model.index(row, 3), 2003);

model.submitAll;

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

Важным отличием модели SQL от стандартной модели является необходимость вызова в модели SQL функции submitAll для записи всех изменений в базу данных

Для обновления записи мы должны сначала установить QSqlTableModel на запись, которую мы хотим модифицировать (например, используя функции select). Затем мы извлекаем запись, обновляем соответствующие поля и записываем наши изменения обратно в базу данных:

QSqlTableModel model;

model.setTable("cd");

model.setFilter("id = 125");

model.select;

if (model.rowCount == 1) {

  • Читать дальше
  • 1
  • ...
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: