QT 4: программирование GUI на С++
Шрифт:
Ниже приводится тот же пример позиционного представления полей в стиле ODBC:
После
Такие шаблоны часто используются для задания двоичных строковых данных, содержащих символы не в коде ASCII или Latin-1. Незаметно для пользователя Qt использует Unicode в тех базах данных, которые поддерживают Unicode, а в тех, которые не делают этого, Qt также незаметно для пользователя преобразует строковые данные в соответствующую кодировку.
Qt поддерживает SQL—транзакции в тех базах данных, где они предусмотрены. Для запуска транзакции мы вызываем функцию transaction для объекта QSqlDatabase, представляющего соединение с базой данных. Для завершения транзакции мы вызываем либо функцию commit, либо функцию rollback. Например, ниже показано, как мы можем найти внешний ключ (foreign key) и выполнить команду INSERT внутри транзакции:
Функция QSqlDatabase::database возвращает объект QSqlDatabase, представляющий соединение, созданное нами при вызове createConnection. Если транзакция не может запуститься, функция QSqlDatabase::transaction возвращает false. Некоторые базы данных не поддерживают транзакции. В этом случае функции transaction, commit и rollback ничего не делают. Мы можем проверить возможность поддержки базой данных транзакций путем вызова функции hasFeature для объекта QSqlDriver, связанного с базой данных:
Можно
проверить наличие в базе данных ряда других возможностей, включая поддержку объектов BLOB (Binary Large Objects — большие двоичные объекты), Unicode и подготовленных запросов.В приводимых до сих пор примерах мы предполагали, что в приложении используется одно соединение с базой данных. Если мы хотим создать несколько соединений, мы можем передавать название соединения в качестве второго аргумента функции addDatabase. Например:
Мы можем затем получить указатель на объект QSqlDatabase, передавая название соединения функции QSqlDatabase::database:
Для выполнения запросов с другим соединением мы передаем объект QSqlDatabase конструктору QSqlQuery:
Несколько соединений полезны, если мы хотим выполнять одновременно несколько транзакций, поскольку каждое соединение может использоваться только для одной активной транзакции. Когда мы используем несколько соединений с базой данных, мы можем все-таки иметь одно непоименованное соединение и QSqlQuery будет использовать это соединение, если не указано поименованное соединение.
Кроме QSqlQuery Qt содержит класс QSqlTableModel — интерфейс высокого уровня, позволяя нам не использовать выражения SQL «в чистом виде» для выполнения наиболее распространенных SQL—команд (SELECT, INSERT, UPDATE и DELETE). Этот класс может использоваться автономно без какого-либо графического пользовательского интерфейса или в качестве источника данных для QListView или QTableView.
Ниже приводится пример использования QSqlTableModel для выполнения команды SELECT:
Это эквивалентно запросу
Просмотр результирующего набора выполняется путем получения заданной записи функцией QSqlTableModel::record и доступа к отдельным полям с помощью функции value:
Функция QSqlRecord::value принимает либо имя поля, либо индекс поля. При работе с большими наборами данных рекомендуется задавать поля с помощью их индексов. Например: