Класс QSqlQuery
Класс QSqlQuery предоставляет средства для выполнения и обработки SQL-запросов. Подробнее...
| Заголовок: | #include <QSqlQuery> |
| qmake: | QT += sql |
Открытые типы
| перечисление | BatchExecutionMode { ValuesAsRows, ValuesAsColumns } |
Открытые функции
| QSqlQuery(const QSqlQuery &other) | |
| QSqlQuery(QSqlDatabase db) | |
| QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase()) | |
| QSqlQuery(QSqlResult *result) | |
| QSqlQuery & | operator=(const QSqlQuery &other) |
| ~QSqlQuery() | |
| void | addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In) |
| int | at() const |
| void | bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In) |
| void | bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In) |
| QVariant | boundValue(const QString &placeholder) const |
| QVariant | boundValue(int pos) const |
| QMap<QString, QVariant> | boundValues() const |
| void | clear() |
| const QSqlDriver * | driver() const |
| bool | exec(const QString &query) |
| bool | exec() |
| bool | execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows) |
| QString | executedQuery() const |
| void | finish() |
| bool | first() |
| bool | isActive() const |
| bool | isForwardOnly() const |
| bool | isNull(int field) const |
| bool | isNull(const QString &name) const |
| bool | isSelect() const |
| bool | isValid() const |
| bool | last() |
| QSqlError | lastError() const |
| QVariant | lastInsertId() const |
| QString | lastQuery() const |
| bool | next() |
| bool | nextResult() |
| int | numRowsAffected() const |
| QSql::NumericalPrecisionPolicy | numericalPrecisionPolicy() const |
| bool | prepare(const QString &query) |
| bool | previous() |
| QSqlRecord | record() const |
| const QSqlResult * | result() const |
| bool | seek(int index, bool relative = false) |
| void | setForwardOnly(bool forward) |
| void | setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy) |
| int | size() const |
| QVariant | value(int index) const |
| QVariant | value(const QString &name) const |
Подробное описание
QSqlQuery инкапсулирует функциональность, связанную с созданием, навигацией и извлечением данных из SQL-запросов, которые выполняются на QSqlDatabase. Она может использоваться для выполнения операторов DML (язык манипулирования данными), таких как SELECT, INSERT, UPDATE и DELETE, а также операторов DDL (язык определения данных), таких как CREATE TABLE. Она также может использоваться для выполнения баз данных-специфических команд, которые не являются стандартным SQL (например, SET DATESTYLE=ISO для PostgreSQL).
Успешно выполненные SQL-запросы устанавливают состояние запроса в активное, так что isActive() возвращает true. В противном случае состояние запроса устанавливается в неактивное. В любом случае при выполнении нового SQL-запроса запрос позиционируется на недействительной записи. Активный запрос должен быть перемещен на действительную запись (так что isValid() возвращает true) перед тем, как можно будет извлечь значения.
Для некоторых баз данных, если активный запрос, который является SELECT запросом, существует при вызове commit() или rollback(), коммит или откат завершатся с ошибкой. См. isActive() для получения подробностей.
Перемещение по записям выполняется с помощью следующих функций:
Эти функции позволяют программисту перемещаться вперед, назад или произвольно по записям, возвращаемым запросом. Если вам нужно только перемещаться вперед по результатам (например, с помощью next()), вы можете использовать setForwardOnly(), что сэкономит значительный объем памяти и повысит производительность на некоторых базах данных. После того, как активный запрос будет размещен на действительной записи, данные могут быть извлечены с помощью value(). Все данные передаются из SQL-бэкенда с использованием QVariants.
Например:
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
} END_OF_DOCUMENT_MARKER Для доступа к данным, возвращаемым запросом, используйте значение(int). Каждый столбец в данных, возвращаемых оператором SELECT, доступен путём передачи позиции столбца в операторе, начиная с 0. Это делает использование запросов SELECT * нежелательным, поскольку порядок возвращаемых столбцов неопределён.
Для повышения эффективности нет функций для доступа к полю по имени (если вы не используете подготовленные запросы с именами, как описано ниже). Для преобразования имени поля в индекс используйте record().indexOf(), например:
QSqlQuery query("SELECT * FROM artist");
int fieldNo = query.record().indexOf("country");
while (query.next()) {
QString country = query.value(fieldNo).toString();
doSomething(country);
} QSqlQuery поддерживает выполнение подготовленных запросов и привязку значений параметров к плейсхолдерам. Некоторые базы данных не поддерживают эти функции, поэтому Qt эмулирует необходимые возможности. Например, драйверы Oracle и ODBC имеют надлежащую поддержку подготовленных запросов, и Qt использует её; но для баз данных, не поддерживающих эту функцию, Qt реализует её самостоятельно, например, замещая плейсхолдеры фактическими значениями при выполнении запроса. Используйте numRowsAffected() для определения количества строк, затронутых не-SELECT запросом, и size() для определения количества полученных строк SELECT.
Базы данных Oracle идентифицируют плейсхолдеры с помощью синтаксиса с двоеточием и именем, например :name. ODBC просто использует символы ?. Qt поддерживает оба синтаксиса, с ограничением, что вы не можете смешивать их в одном запросе.
Вы можете получить значения всех полей в одной переменной (мапе) с помощью boundValues().
Подходы к привязке значений
Ниже представлены те же примеры, используя каждый из четырёх различных подходов к привязке, а также один пример привязки значений к хранимой процедуре.
Привязка по имени, используя именованные плейсхолдеры:
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (:id, :forename, :surname)");
query.bindValue(":id", 1001);
query.bindValue(":forename", "Bart");
query.bindValue(":surname", "Simpson");
query.exec(); Привязка по позиции, используя именованные плейсхолдеры:
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (:id, :forename, :surname)");
query.bindValue(0, 1001);
query.bindValue(1, "Bart");
query.bindValue(2, "Simpson");
query.exec(); Привязка значений, используя позиционные плейсхолдеры (версия 1):
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (?, ?, ?)");
query.bindValue(0, 1001);
query.bindValue(1, "Bart");
query.bindValue(2, "Simpson");
query.exec(); Привязка значений, используя позиционные плейсхолдеры (версия 2):
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Bart");
query.addBindValue("Simpson");
query.exec(); Привязка значений к хранимой процедуре:
Этот код вызывает хранимую процедуру под названием AsciiToInt(), передавая ей символ через входной параметр и получая её результат в выходном параметре.
QSqlQuery query;
query.prepare("CALL AsciiToInt(?, ?)");
query.bindValue(0, "A");
query.bindValue(1, 0, QSql::Out);
query.exec();
int i = query.boundValue(1).toInt(); // i is 65 Обратите внимание, что незакреплённые параметры сохранят свои значения.
Хранимые процедуры, использующие оператор return для возврата значений или возвращающие несколько наборов результатов, не полностью поддерживаются. Для получения подробной информации см. Драйверы баз данных SQL.
Предупреждение: Вы должны загрузить драйвер SQL и открыть подключение перед созданием QSqlQuery. Кроме того, подключение должно оставаться открытым во время существования запроса; в противном случае поведение QSqlQuery не определено.
См. также QSqlDatabase, QSqlQueryModel, QSqlTableModel и QVariant.
Документация по типам членов
перечисление QSqlQuery::BatchExecutionMode
| Константа | Значение | Описание |
|---|---|---|
QSqlQuery::ValuesAsRows |
0 |
- Обновляет несколько строк. Обрабатывает каждую запись в QVariantList как значение для обновления следующей строки. |
QSqlQuery::ValuesAsColumns |
1 |
- Обновляет одну строку. Обрабатывает каждую запись в QVariantList как одно значение типа массива. |
Документация по функциям членов
QSqlQuery::QSqlQuery(const QSqlQuery &other)
Создаёт копию other.
QSqlQuery::QSqlQuery(QSqlDatabase db)
Создаёт объект QSqlQuery, используя базу данных db. Если db недействительна, будет использована базу данных по умолчанию.
См. также QSqlDatabase.
QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
Создаёт объект QSqlQuery, используя SQL-запрос query и базу данных db. Если db не указана или недействительна, используется базу данных по умолчанию. Если query не пустая строка, она будет выполнена.
См. также QSqlDatabase.
QSqlQuery::QSqlQuery(QSqlResult *result)
Создаёт объект QSqlQuery, который использует QSqlResult result для взаимодействия с базой данных.
QSqlQuery &QSqlQuery::operator=(const QSqlQuery &other)
Присваивает other этому объекту.
QSqlQuery::~QSqlQuery()
Уничтожает объект и освобождает выделенные ресурсы.
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
Добавляет значение val в список значений при использовании позиционной привязки значений. Порядок вызовов addBindValue() определяет, к какому плейсхолдеру будет привязано значение в подготовленном запросе. Если paramType равен QSql::Out или QSql::InOut, плейсхолдер будет перезаписан данными из базы данных после вызова exec().
Для привязки значения NULL используйте нулевую QVariant; например, используйте QVariant(QVariant::String) если вы привязываете строку.
См. также bindValue(), prepare(), exec(), boundValue() и boundValues().
int QSqlQuery::at() const
Возвращает текущую внутреннюю позицию запроса. Первая запись находится на позиции ноль. Если позиция недействительна, функция возвращает QSql::BeforeFirstRow или QSql::AfterLastRow, которые являются специальными отрицательными значениями.
См. также previous(), next(), first(), last(), seek(), isActive() и isValid().
void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
Устанавливает плейсхолдер placeholder для привязки к значению val в подготовленном операторе. Обратите внимание, что маркер плейсхолдера (например, :) должен быть включён при указании имени плейсхолдера. Если paramType равен QSql::Out или QSql::InOut, плейсхолдер будет перезаписан данными из базы данных после вызова exec(). В этом случае необходимо предварительно выделить достаточное место для хранения результата.
Для привязки значения NULL используйте нулевую QVariant; например, используйте QVariant(QVariant::String) если вы привязываете строку.
См. также addBindValue(), prepare(), exec(), boundValue() и boundValues().
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
Устанавливает плейсхолдер на позиции pos для привязки к значению val в подготовленном операторе. Нумерация полей начинается с 0.
QVariant QSqlQuery::boundValue(const QString &placeholder) const
Возвращает значение для placeholder.
См. также boundValues(), bindValue() и addBindValue().
QVariant QSqlQuery::boundValue(int pos) const
Возвращает значение для плейсхолдера на позиции pos.
QMap<QString, QVariant> QSqlQuery::boundValues() const
Возвращает карту привязанных значений.
При использовании именованной привязки, привязанные значения можно проверить следующим образом:
QMapIterator<QString, QVariant> i(query.boundValues());
while (i.hasNext()) {
i.next();
cout << i.key().toUtf8().data() << ": "
<< i.value().toString().toUtf8().data() << endl;
} При использовании позиционной привязки, код становится:
QList<QVariant> list = query.boundValues().values();
for (int i = 0; i < list.size(); ++i)
cout << i << ": " << list.at(i).toString().toUtf8().data() << endl; См. также boundValue(), bindValue() и addBindValue().
void QSqlQuery::clear()
Очищает набор результатов и освобождает ресурсы, удерживаемые запросом. Устанавливает состояние запроса в неактивное. Вам редко, если вообще, потребуется вызывать эту функцию.
const QSqlDriver *QSqlQuery::driver() const
Возвращает драйвер базы данных, связанный с запросом.
bool QSqlQuery::exec(const QString &query)
Выполняет SQL-запрос из query. Возвращает true и устанавливает состояние запроса в активное, если запрос был выполнен успешно; в противном случае возвращает false. Строка query должна использовать синтаксис, соответствующий запрашиваемой SQL-базе данных (например, стандартный SQL).
После выполнения запроса запрос позиционируется на недействительной записи, и необходимо перейти к действительной записи, прежде чем можно будет получить значения данных (например, с помощью next()).
Обратите внимание, что последняя ошибка для этого запроса сбрасывается при вызове exec().
Для SQLite строка запроса может содержать только одно оператор в данный момент. Если задано более одного оператора, функция возвращает false.
Пример:
QSqlQuery query;
query.exec("INSERT INTO employee (id, name, salary) "
"VALUES (1001, 'Thad Beaumont', 65000)"); См. также isActive(), isValid(), next(), previous(), first(), last(), и seek().
bool QSqlQuery::exec()
Выполняет ранее подготовленный SQL-запрос. Возвращает true если запрос был выполнен успешно; в противном случае возвращает false.
Обратите внимание, что последняя ошибка для этого запроса сбрасывается при вызове exec().
См. также prepare(), bindValue(), addBindValue(), boundValue(), и boundValues().
bool QSqlQuery::execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows)
Выполняет ранее подготовленный SQL-запрос в пакетном режиме. Все привязанные параметры должны быть списками вариантов. Если база данных не поддерживает пакетные выполнения, драйвер будет имитировать его с помощью обычных вызовов exec().
Возвращает true если запрос выполнен успешно; в противном случае возвращает false.
Пример:
QSqlQuery q;
q.prepare("insert into myTable values (?, ?)");
QVariantList ints;
ints << 1 << 2 << 3 << 4;
q.addBindValue(ints);
QVariantList names;
names << "Harald" << "Boris" << "Trond" << QVariant(QVariant::String);
q.addBindValue(names);
if (!q.execBatch())
qDebug() << q.lastError(); В приведенном выше примере вставляются четыре новые строки в myTable.
1 Harald 2 Boris 3 Trond 4 NULL
Для привязки значений NULL необходимо добавить нулевой QVariant соответствующего типа в привязанный QVariantList; например, QVariant(QVariant::String) следует использовать, если вы используете строки.
Примечание: Каждый привязанный QVariantList должен содержать одинаковое количество вариантов.
Примечание: Тип QVariants в списке не должен изменяться. Например, нельзя смешивать целочисленные и строковые варианты в пределах QVariantList.
Параметр mode указывает, как будет интерпретироваться привязанный QVariantList. Если mode равен ValuesAsRows, каждый вариант в QVariantList будет интерпретирован как значение для новой строки. ValuesAsColumns — это специальный случай для драйвера Oracle. В этом режиме каждый элемент в QVariantList будет интерпретирован как значение массива для значения IN или OUT в хранимой процедуре. Обратите внимание, что это будет работать только если значение IN или OUT является типом таблицы, состоящей только из одного столбца базового типа, например TYPE myType IS TABLE OF VARCHAR(64) INDEX BY BINARY_INTEGER;
Эта функция была введена в Qt 4.2.
См. также prepare(), bindValue(), и addBindValue().
QString QSqlQuery::executedQuery() const
Возвращает последний успешно выполненный запрос.
В большинстве случаев эта функция возвращает ту же строку, что и lastQuery(). Если подготовленный запрос с плейсхолдерами выполняется на СУБД, которая их не поддерживает, подготовка этого запроса эмулируется. Плейсхолдеры в исходном запросе заменяются их привязанными значениями для формирования нового запроса. Эта функция возвращает изменённый запрос. Она в основном полезна для отладки.
См. также lastQuery().
void QSqlQuery::finish()
Указывает драйверу базы данных, что больше данных из этого запроса извлекаться не будет, пока он не будет повторно выполнен. Обычно нет необходимости вызывать эту функцию, но она может быть полезна для освобождения ресурсов, таких как блокировки или курсоры, если вы намерены повторно использовать запрос в будущем.
Устанавливает запрос в неактивное состояние. Привязанные значения сохраняются.
Эта функция была введена в Qt 4.3.2.
См. также prepare(), exec(), и isActive().
bool QSqlQuery::first()
Извлекает первую запись в результате, если она доступна, и позиционирует запрос на извлечённую запись. Обратите внимание, что результат должен быть в активном состоянии и isSelect() должен возвращать true перед вызовом этой функции, иначе она ничего не сделает и вернёт false. Возвращает true в случае успеха. В случае неудачи позиция запроса устанавливается в недопустимую позицию и возвращается false.
См. также next(), previous(), last(), seek(), at(), isActive(), и isValid().
bool QSqlQuery::isActive() const
Возвращает true если запрос активный. Активный QSqlQuery — это запрос, который был успешно выполнен exec(), но еще не завершен. Когда вы закончите с активным запросом, вы можете сделать запрос неактивным, вызвав finish() или clear(), или вы можете удалить экземпляр QSqlQuery.
Примечание: Особо следует обратить внимание на активный запрос, являющийся SELECT оператором. Для некоторых баз данных, поддерживающих транзакции, активный запрос, являющийся SELECT оператором, может привести к ошибке при вызове commit() или rollback(). Поэтому перед выполнением commit или rollback вы должны сделать активный SELECT запрос неактивным, используя один из перечисленных выше способов.
См. также isSelect().
bool QSqlQuery::isForwardOnly() const
Возвращает true если можно прокручивать результат только вперёд; в противном случае возвращает false.
См. также setForwardOnly() и next().
bool QSqlQuery::isNull(int field) const
Возвращает true если запрос не активен, запрос не позиционирован на действительной записи, такого поля field не существует или поле field имеет значение NULL; в противном случае false. Обратите внимание, что для некоторых драйверов isNull() не вернёт точную информацию, пока не будет сделана попытка извлечь данные.
См. также isActive(), isValid(), и value().
bool QSqlQuery::isNull(const QString &name) const
Это перегруженная функция.
Возвращает true если поля с таким именем name нет; в противном случае возвращает isNull(int index) для соответствующего индекса поля.
Эта перегрузка менее эффективна, чем isNull()
bool QSqlQuery::isSelect() const
Возвращает true если текущий запрос — это SELECT оператор; в противном случае возвращает false.
bool QSqlQuery::isValid() const
Возвращает true если запрос в данный момент позиционирован на действительной записи; в противном случае возвращает false.
bool QSqlQuery::last()
Извлекает последнюю запись в результате, если она доступна, и позиционирует запрос на извлечённую запись. Обратите внимание, что результат должен быть в активном состоянии и isSelect() должен возвращать true перед вызовом этой функции, иначе она ничего не сделает и вернёт false. Возвращает true в случае успеха. В случае неудачи позиция запроса устанавливается в недопустимую позицию и возвращается false.
См. также next(), previous(), first(), seek(), at(), isActive(), и isValid().
QSqlError QSqlQuery::lastError() const
Возвращает информацию об ошибке (если она произошла) последней ошибки, произошедшей с этим запросом.
См. также QSqlError и QSqlDatabase::lastError().
QVariant QSqlQuery::lastInsertId() const
Возвращает идентификатор объекта последней вставленной строки, если база данных его поддерживает. Недействительный QVariant будет возвращён, если запрос не вставил никакого значения или база данных не сообщает об идентификаторе. Если было затронуто более одной строки при вставке, поведение не определено.
Для баз данных MySQL будет возвращено поле автоинкремента строки.
Примечание: Для работы этой функции в PSQL таблица должна содержать OIDs, которые могут не быть созданы по умолчанию. Проверьте переменную конфигурации default_with_oids для подтверждения.
См. также QSqlDriver::hasFeature().
QString QSqlQuery::lastQuery() const
Возвращает текст текущего выполняемого запроса или пустую строку, если текущего текста запроса нет.
См. также executedQuery().
bool QSqlQuery::next()
Извлекает следующую запись в результате, если она доступна, и позиционирует запрос на извлечённую запись. Обратите внимание, что результат должен находиться в состоянии active и функция isSelect() должна возвращать true перед вызовом этой функции; иначе она ничего не сделает и вернёт false.
Применяются следующие правила:
- Если результат находится перед первой записью, например, сразу после выполнения запроса, происходит попытка извлечения первой записи.
- Если результат находится после последней записи, никаких изменений не происходит, и возвращается false.
- Если результат находится где-то посередине, происходит попытка извлечения следующей записи.
Если запись не может быть извлечена, результат позиционируется после последней записи, и возвращается false. Если запись успешно извлечена, возвращается true.
См. также previous(), first(), last(), seek(), at(), isActive(), и isValid().
bool QSqlQuery::nextResult()
Отбрасывает текущий результат и переходит к следующему, если он доступен.
Некоторые базы данных могут возвращать несколько наборов результатов для хранимых процедур или SQL-пакетов (строка запроса, содержащая несколько инструкций). Если после выполнения запроса доступны несколько наборов результатов, эта функция может использоваться для перехода к следующему набору результатов.
Если новый набор результатов доступен, функция вернёт true. Запрос будет перепозиционирован на недействительной записи в новом наборе результатов, и его необходимо переместить на действительную запись перед извлечением значений данных. Если новый набор результатов недоступен, функция вернёт false и запрос будет установлен в состояние inactive. В любом случае старый набор результатов будет отброшен.
Когда одна из инструкций является не-SELECT-инструкцией, может быть доступно число затронутых строк вместо набора результатов.
Обратите внимание, что некоторые базы данных, например, Microsoft SQL Server, требуют неподвижных курсоров при работе с несколькими наборами результатов. Некоторые базы данных могут выполнять все инструкции сразу, в то время как другие могут отложить выполнение до фактического доступа к набору результатов, и некоторые базы данных могут иметь ограничения на типы инструкций, которые могут использоваться в SQL-пакете.
Эта функция была добавлена в Qt 4.4.
См. также QSqlDriver::hasFeature(), setForwardOnly(), next(), isSelect(), numRowsAffected(), isActive(), и lastError().
int QSqlQuery::numRowsAffected() const
Возвращает число строк, затронутых SQL-инструкцией результата, или -1, если его невозможно определить. Обратите внимание, что для SELECT инструкций значение не определено; используйте size() вместо этого. Если запрос не active, возвращается -1.
См. также size() и QSqlDriver::hasFeature().
QSql::NumericalPrecisionPolicy QSqlQuery::numericalPrecisionPolicy() const
Возвращает текущую политику точности.
См. также QSql::NumericalPrecisionPolicy и setNumericalPrecisionPolicy().
bool QSqlQuery::prepare(const QString &query)
Подготавливает SQL-запрос query к выполнению. Возвращает true если запрос успешно подготовлен; в противном случае возвращает false.
Запрос может содержать заглушки для привязки значений. Поддерживаются заглушки в стиле Oracle (двоеточие-имя, например, :surname) и ODBC (?) стилях; но их нельзя смешивать в одном запросе. См. Подробное описание для примеров.
Примечания по переносимости: Некоторые базы данных выбирают отложить подготовку запроса до первого его выполнения. В этом случае подготовка синтаксически неправильного запроса проходит успешно, но каждое последующее exec() завершится неудачно. Когда база данных не поддерживает именованные заглушки напрямую, заглушка может содержать только символы в диапазоне [a-zA-Z0-9_].
Для SQLite строка запроса может содержать только одну инструкцию за раз. Если указано более одной инструкции, функция возвращает false.
Пример:
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (:id, :forename, :surname)");
query.bindValue(":id", 1001);
query.bindValue(":forename", "Bart");
query.bindValue(":surname", "Simpson");
query.exec(); См. также exec(), bindValue(), и addBindValue().
bool QSqlQuery::previous()
Извлекает предыдущую запись в результате, если она доступна, и позиционирует запрос на извлечённую запись. Обратите внимание, что результат должен находиться в состоянии active и функция isSelect() должна возвращать true перед вызовом этой функции; иначе она ничего не сделает и вернёт false.
Применяются следующие правила:
- Если результат находится перед первой записью, никаких изменений не происходит, и возвращается false.
- Если результат находится после последней записи, происходит попытка извлечения последней записи.
- Если результат находится где-то посередине, происходит попытка извлечения предыдущей записи.
Если запись не может быть извлечена, результат позиционируется перед первой записью, и возвращается false. Если запись успешно извлечена, возвращается true.
См. также next(), first(), last(), seek(), at(), isActive(), и isValid().
QSqlRecord QSqlQuery::record() const
Возвращает QSqlRecord, содержащую информацию о полях для текущего запроса. Если запрос указывает на действительную строку (isValid() возвращает true), запись заполняется значениями строки. Пустая запись возвращается, когда активного запроса нет (isActive() возвращает false).
Для извлечения значений из запроса следует использовать value(), так как поиск по индексу в нём быстрее.
В следующем примере выполняется запрос SELECT * FROM. Поскольку порядок столбцов не определён, используется QSqlRecord::indexOf() для получения индекса столбца.
QSqlQuery q("select * from employees");
QSqlRecord rec = q.record();
qDebug() << "Number of columns: " << rec.count();
int nameCol = rec.indexOf("name"); // index of the field "name"
while (q.next())
qDebug() << q.value(nameCol).toString(); // output all names См. также value().
const QSqlResult *QSqlQuery::result() const
Возвращает результат, связанный с запросом.
bool QSqlQuery::seek(int index, bool relative = false)
Извлекает запись в позиции index, если она доступна, и позиционирует запрос на извлечённую запись. Первая запись имеет позицию 0. Обратите внимание, что запрос должен быть в состоянии active и isSelect() должно возвращать true перед вызовом этой функции.
Если relative равно false (по умолчанию), применяются следующие правила:
- Если index отрицательный, результат позиционируется перед первой записью, и возвращается false.
- В противном случае, происходит попытка перейти к записи в позиции index. Если запись в позиции index не может быть извлечена, результат позиционируется после последней записи и возвращается false. Если запись успешно извлечена, возвращается true.
Если relative равно true, применяются следующие правила:
- Если результат находится перед первой записью и:
- index отрицательный или нулевой, никаких изменений не происходит, и возвращается false.
- index положительный, происходит попытка позиционировать результат в абсолютной позиции index - 1, следуя тем же правилам, что и для не-относительного поиска, описанным выше.
- Если результат находится после последней записи и:
- index положительный или нулевой, никаких изменений не происходит, и возвращается false.
- index отрицательный, происходит попытка позиционировать результат в позиции index + 1 относительно последней записи, следуя нижеприведённым правилам.
- Если результат находится где-то посередине, и относительный сдвиг index перемещает результат ниже нуля, результат позиционируется перед первой записью, и возвращается false.
- В противном случае, происходит попытка переместиться к записи на index записей вперёд от текущей записи (или index записей назад от текущей записи, если index отрицательный). Если запись на смещении index не может быть извлечена, результат позиционируется после последней записи, если index ≥ 0 (или перед первой записью, если index отрицательный), и возвращается false. Если запись успешно извлечена, возвращается true.
См. также next(), previous(), first(), last(), at(), isActive(), и isValid().
void QSqlQuery::setForwardOnly(bool forward)
Устанавливает режим только вперёд в forward. Если forward равно true, разрешены только next() и seek() с положительными значениями для перемещения по результатам.
Режим только вперёд может (в зависимости от драйвера) быть более эффективным по памяти, так как результаты не нужно кэшировать. Он также улучшит производительность в некоторых базах данных. Для этого необходимо вызвать setForwardOnly() до подготовки или выполнения запроса. Обратите внимание, что конструктор, принимающий запрос и базу данных, может выполнить запрос.
Режим только вперёд по умолчанию выключен.
Установка forward only в значение false — это предложение для движка базы данных, у которого последнее слово в вопросе о том, будет ли результат набора данных только forward-only или прокручиваемым. isForwardOnly() всегда вернёт правильный статус набора результатов.
Примечание: Вызов setForwardOnly после выполнения запроса в лучшем случае приведёт к неожиданным результатам, а в худшем — к аварийному завершению работы.
Примечание: Чтобы убедиться, что запрос forward-only был выполнен успешно, приложение должно проверять lastError() на наличие ошибки не только после выполнения запроса, но и после навигации по результатам запроса.
Предупреждение: PostgreSQL: Во время навигации по результатам запроса в режиме forward-only не выполняйте никаких других SQL-команд в той же базе данных. Это приведёт к потере результатов запроса.
См. также isForwardOnly(), next(), seek() и QSqlResult::setForwardOnly().
void QSqlQuery::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
Инструктирует драйвер базы данных возвращать числовые значения с точностью, заданной параметром precisionPolicy.
Например, драйвер Oracle может извлекать числовые значения в виде строк, чтобы предотвратить потерю точности. Если высокая точность не важна, используйте этот метод для увеличения скорости выполнения, минуя преобразования строк.
Примечание: Драйверы, которые не поддерживают извлечение числовых значений с низкой точностью, проигнорируют политику точности. Вы можете использовать QSqlDriver::hasFeature(), чтобы узнать, поддерживает ли драйвер эту функцию.
Примечание: Установка политики точности не влияет на активный запрос. Для активации политики вызовите exec(QString) или prepare().
См. также QSql::NumericalPrecisionPolicy и numericalPrecisionPolicy().
int QSqlQuery::size() const
Возвращает размер результата (количество строк), или -1, если размер определить нельзя или база данных не поддерживает отчёт о размере запроса. Обратите внимание, что для не-SELECT запросов (isSelect() возвращает false), size() вернёт -1. Если запрос не активен (isActive() возвращает false), возвращается -1.
Чтобы определить количество строк, затронутых не-SELECT операцией, используйте numRowsAffected().
См. также isActive(), numRowsAffected() и QSqlDriver::hasFeature().
QVariant QSqlQuery::value(int index) const
Возвращает значение поля index в текущей записи.
Поля нумеруются слева направо с помощью текста SELECT оператора, например, в
SELECT forename, surname FROM people;
поле 0 является forename, а поле 1 является surname. Использование SELECT * не рекомендуется, поскольку порядок полей в запросе не определён.
Возвращается недействительный QVariant, если поле index не существует, запрос неактивен или запрос расположен на недействительной записи.
См. также previous(), next(), first(), last(), seek(), isActive() и isValid().
QVariant QSqlQuery::value(const QString &name) const
Это перегруженный метод.
Возвращает значение поля с именем name в текущей записи. Если поле name не существует, возвращается недействительный объект.
Этот перегруз меньше эффективен, чем value()
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qsqlquery.html