Класс QSqlQuery
Класс QSqlQuery предоставляет средства для выполнения и управления операторами SQL. Подробнее...
| Заголовок: | #include <QSqlQuery> |
| CMake: | find_package(Qt6 COMPONENTS Sql REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake: | QT += sql |
Открытые типы
| enum | BatchExecutionMode { ValuesAsRows, ValuesAsColumns } |
Открытые функции
| QSqlQuery(const QSqlQuery &other) | |
| QSqlQuery(const QSqlDatabase &db) | |
| QSqlQuery(const QString &query = QString(), const 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 |
| QVariantList | 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);
} Для доступа к данным, возвращаемым запросом, используйте value(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().
Примечание: Не все SQL-операции поддерживают привязку значений. Обратитесь к документации вашей системы баз данных, чтобы проверить их доступность.
Подходы к привязке значений
Ниже представлен тот же пример, использующий каждый из четырёх различных подходов к привязке, а также один пример привязки значений к хранимой процедуре.
Привязка по имени, используя именованные плейсхолдеры:
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(const QSqlDatabase &db)
Создаёт объект QSqlQuery, используя базу данных db. Если db недействителен, используется базу данных по умолчанию приложения.
См. также QSqlDatabase.
QSqlQuery::QSqlQuery(const QString &query = QString(), const 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 типа null; например, используйте QVariant(QMetaType::QString) если вы привязываете строку.
См. также 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 типа null; например, используйте QVariant(QMetaType::QString) если вы привязываете строку.
См. также addBindValue(), prepare(), exec(), boundValue() и boundValues().
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
Устанавливает плейсхолдер на позиции pos, который будет связан со значением val в подготовленном операторе. Нумерация столбцов начинается с 0. Если paramType имеет значение QSql::Out или QSql::InOut, плейсхолдер будет перезаписан данными из базы данных после вызова exec().
QVariant QSqlQuery::boundValue(const QString &placeholder) const
Возвращает значение для placeholder.
См. также boundValues(), bindValue() и addBindValue().
QVariant QSqlQuery::boundValue(int pos) const
Возвращает значение для плейсхолдера на позиции pos.
[since 6.0] QVariantList QSqlQuery::boundValues() const
Возвращает список привязанных значений.
Порядок в списке соответствует порядку привязки, независимо от того, используется ли именованная или позиционная привязка.
Привязанные значения можно проверить следующим образом:
QVariantList list = query.boundValues();
for (int i = 0; i < list.size(); ++i)
cout << i << ": " << list.at(i).toString().toUtf8().data() << "\n"; Эта функция была введена в Qt 6.0.
См. также 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(QMetaType::QString);
q.addBindValue(names);
if (!q.execBatch())
qDebug() << q.lastError(); Приведенный выше пример вставляет четыре новые строки в myTable:
1 Harald 2 Boris 3 Trond 4 NULL
Для привязки NULL-значений необходимо добавить нулевой QVariant соответствующего типа в связанный QVariantList; например, QVariant(QMetaType::QString) должен использоваться, если вы используете строки.
Примечание: Каждый связанный 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;
См. также prepare(), bindValue(), и addBindValue().
QString QSqlQuery::executedQuery() const
Возвращает последний успешно выполненный запрос.
В большинстве случаев эта функция возвращает ту же строку, что и lastQuery(). Если подготовленный запрос с плейсхолдерами выполняется на СУБД, которая его не поддерживает, подготовка этого запроса эмулируется. Плейсхолдеры в исходном запросе заменяются связанными значениями для формирования нового запроса. Эта функция возвращает изменённый запрос. Она в основном полезна для отладки.
См. также lastQuery().
void QSqlQuery::finish()
Указывает драйверу базы данных, что больше данных из этого запроса извлекаться не будет, пока он не будет повторно выполнен. Обычно вызывать эту функцию не требуется, но она может быть полезна для освобождения ресурсов, таких как блокировки или курсоры, если вы планируете повторно использовать запрос в будущем.
Устанавливает запрос в неактивное состояние. Связанные значения сохраняют свои значения.
См. также 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() не сработают, поэтому перед подтверждением или откатом транзакции вы должны сделать ваш активный SELECT запрос неактивным одним из указанных выше способов.
См. также isSelect().
bool QSqlQuery::isForwardOnly() const
Возвращает true если вы можете прокручивать результат только вперёд; в противном случае возвращает false.
См. также setForwardOnly() и next().
bool QSqlQuery::isNull(int field) const
Возвращает true если запрос не активен, запрос не позиционирован на действительной записи, нет такого field, или field пусто; в противном случае 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, если запрос не вставил никакого значения или если база данных не возвращает id. Если нескольким строкам был изменён статус, поведение не определено.
Для баз данных MySQL возвращается поле автоинкремента строки.
Примечание: Для работы этой функции в PSQL таблица должна содержать OID, которые могут не быть созданы по умолчанию. Проверьте переменную конфигурации default_with_oids для уверенности.
См. также QSqlDriver::hasFeature().
QString QSqlQuery::lastQuery() const
Возвращает текст текущего запроса или пустую строку, если текущего текста запроса нет.
См. также executedQuery().
bool QSqlQuery::next()
Возвращает следующую запись в результате, если она доступна, и позиционирует запрос на полученной записи. Обратите внимание, что результат должен быть в состоянии активный и isSelect() должен возвращать true перед вызовом этой функции, иначе она ничего не сделает и вернёт false.
Применяются следующие правила:
- Если результат в данный момент находится перед первой записью, например, сразу после выполнения запроса, происходит попытка извлечения первой записи.
- Если результат в данный момент находится после последней записи, никаких изменений не происходит, и возвращается false.
- Если результат находится где-то посередине, происходит попытка извлечения следующей записи.
Если запись не может быть извлечена, результат позиционируется после последней записи, и возвращается false. Если запись успешно извлечена, возвращается true.
См. также previous(), first(), last(), seek(), at(), isActive() и isValid().
bool QSqlQuery::nextResult()
Отбрасывает текущий результат и переходит к следующему, если он доступен.
Некоторые базы данных могут возвращать несколько наборов результатов для хранимых процедур или SQL-пакетов (строки запросов, содержащие несколько операторов). Если после выполнения запроса доступны несколько наборов результатов, эта функция может использоваться для перехода к следующему набору результатов.
Если доступен новый набор результатов, эта функция вернёт true. Запрос будет перепозиционирован на недействительной записи в новом наборе результатов, и необходимо перейти к действительной записи, прежде чем можно будет извлечь значения данных. Если новый набор результатов недоступен, функция возвращает false и запрос устанавливается в неактивное состояние. В любом случае старый набор результатов будет отброшен.
Когда один из операторов — это оператор, не являющийся select, вместо набора результатов может быть доступно количество затронутых строк.
Обратите внимание, что некоторые базы данных, например, Microsoft SQL Server, требуют не прокручиваемых курсоров при работе с несколькими наборами результатов. Некоторые базы данных могут выполнять все операторы сразу, в то время как другие могут отложить выполнение до фактического доступа к набору результатов, и некоторые базы данных могут иметь ограничения на операторы, которые разрешены в SQL-пакете.
См. также QSqlDriver::hasFeature(), setForwardOnly(), next(), isSelect(), numRowsAffected(), isActive() и lastError().
int QSqlQuery::numRowsAffected() const
Возвращает количество строк, затронутых SQL-оператор результата, или -1, если его невозможно определить. Обратите внимание, что для SELECT операторов значение не определено; используйте size() вместо этого. Если запрос не активен, возвращается -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()
Извлекает предыдущую запись в результате, если она доступна, и позиционирует запрос на извлечённой записи. Обратите внимание, что результат должен быть в состоянии активный и 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. Обратите внимание, что запрос должен быть в состоянии активный и 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() перед подготовкой или выполнением запроса. Обратите внимание, что конструктор, принимающий запрос и базу данных, может выполнить запрос.
Режим только вперёд выключен по умолчанию.
Установка режима только вперёд в значение false — это рекомендация для движка базы данных, который имеет последнее слово в отношении того, является ли набор результатов прокручиваемым или только вперёд. isForwardOnly() всегда будет возвращать правильное состояние набора результатов.
Примечание: Вызов setForwardOnly после выполнения запроса приведёт, как минимум, к неожиданным результатам, а в худшем случае — к сбою.
Примечание: Для того, чтобы убедиться, что запрос, выполняемый только в прямом направлении, завершился успешно, приложение должно проверять lastError() на наличие ошибки не только после выполнения запроса, но и после навигации по результатам запроса.
Предупреждение: PostgreSQL: При навигации по результатам запроса в режиме только вперёд не выполняйте другие 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-6.1/qsqlquery.html