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

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

Шрифт:

Если нам необходимо вставлять много записей или если мы хотим избежать преобразования значений в строковые данные (и правильного преобразования специальных символов), мы можем использовать функцию prepare для указания полей в шаблоне запроса и затем присваивания им необходимых нам значений. Qt поддерживает как стиль Oracle, так и стиль ODBC для всех баз данных, применяя, где возможно, «родной» интерфейс базы данных или имитируя его в противном случае. Ниже приводится пример, в котором используется синтаксис Oracle для представления поименованных полей:

QSqlQuery query;

query.prepare("INSERT INTO cd (id, artistid, title, year) "

"VALUES (:id, :artistid, :title, :year)");

query.bindValue(":id", 203);

query.bindValue(":artistid", 102);

query.bindValue(":title", "Living in America");

query.bindValue(":year", 2002);

query.exec;

Ниже приводится тот же пример позиционного представления полей в стиле ODBC:

QSqlQuery query;

query.prepare("INSERT INTO cd (id, artistid, title, year) "

"VALUES (?, ?, ?, ?)");

query.addBindValue(203);

query.addBindValue(102);

query.addBindValue("Living in America");

query.addBindValue(2002);

query.exec;

После вызова функции exec мы можем вызвать bindValue или addBindValue для присваивания новых значений, затем снова вызвать exec для выполнения запроса уже с новыми значениями.

Такие шаблоны часто используются для задания двоичных строковых данных, содержащих символы не в коде ASCII или Latin-1. Незаметно для пользователя Qt использует Unicode в тех базах данных, которые поддерживают Unicode, а в тех, которые не делают этого, Qt также незаметно для пользователя преобразует строковые данные в соответствующую кодировку.

Qt поддерживает SQL—транзакции в тех базах данных, где они предусмотрены. Для запуска транзакции мы вызываем функцию transaction для объекта QSqlDatabase, представляющего соединение с базой данных. Для завершения транзакции мы вызываем либо функцию commit, либо функцию rollback. Например, ниже показано, как мы можем найти внешний ключ (foreign key) и выполнить команду INSERT внутри транзакции:

QSqlDatabase::database.transaction;

QSqlQuery query;

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

if (query.next) {

int artistId = query.value(0).tolnt;

query.exec("INSERT INTO cd (id, artistid, title, year) "

"VALUES (201, " + QString::number(artistId)

+ ", 'Riding the Tiger', 1997)");

}

QSqlDatabase::database.commit;

Функция 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");

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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