Читаем QT 4: программирование GUI на С++ полностью

Функция QSqlDatabase::database возвращает объект QSqlDatabase, представляющий соединение, созданное нами при вызове createConnection. Если транзакция не может запуститься, функция QSqlDatabase::transaction возвращает false. Некоторые базы данных не поддерживают транзакции. В этом случае функции transaction, commit и rollback ничего не делают. Мы можем проверить возможность поддержки базой данных транзакций путем вызова функции hasFeature для объекта QSqlDriver, связанного с базой данных:

QSqlDriver *driver = QSqlDatabase::database.driver;

if (driver->hasFeature(QSqlDriver::Transactions))

Можно проверить наличие в базе данных ряда других возможностей, включая поддержку объектов BLOB (Binary Large Objects — большие двоичные объекты), Unicode и подготовленных запросов.

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

QSqlDatabase *db = QSqlDatabase::addDatabase("QPSQL", "OTHER");

db. setHostName("saturn.mcmanamy.edu");

db.setDatabaseName("starsdb");

db.setUserName("hilbert");

db.setPassword("ixtapa7");

Мы можем затем получить указатель на объект QSqlDatabase, передавая название соединения функции QSqlDatabase::database:

QSqlDatabase db = QSqlDatabase::database("OTHER");

Для выполнения запросов с другим соединением мы передаем объект 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;

}

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже