Класс QSqlQuery
Класс QSqlQuery предоставляет средства для выполнения и обработки SQL-запросов. Подробнее...
| Заголовок: | #include <QSqlQuery> |
| CMake: | find_package(Qt6 COMPONENTS Sql REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake: | QT += sql |
Открытые типы
| Перечисление | BatchExecutionMode { ValuesAsRows, ValuesAsColumns } |
Открытые функции
| QSqlQuery(QSqlQuery &&other) | |
| QSqlQuery(const QSqlDatabase &db) | |
| QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase()) | |
| QSqlQuery(QSqlResult *result) | |
| QSqlQuery & | operator=(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 |
| void | swap(QSqlQuery &other) |
| 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(), выполнение commit или rollback завершится ошибкой. Подробнее см. isActive().
Навигация по записям выполняется с помощью следующих функций:
END_OF_DOCUMENT_MARKERЭти функции позволяют программисту перемещаться вперёд, назад или произвольно по записям, возвращённым запросом. Если вам нужно только перемещаться вперёд по результатам (например, используя 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 как одно значение типа массива. |
Документация по функциям-членам
[since 6.2] QSqlQuery::QSqlQuery(QSqlQuery &&other)
Перемещающее создание QSqlQuery из other.
Эта функция была представлена в Qt 6.2.
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 для общения с базой данных.
[since 6.2] QSqlQuery &QSqlQuery::operator=(QSqlQuery &&other)
Перемещающее присваивание other этому объекту.
Эта функция была представлена в Qt 6.2.
QSqlQuery::~QSqlQuery()
Удаляет объект и освобождает выделенные ресурсы.
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
Добавляет значение val в список значений при использовании позиционной привязки значений. Порядок вызовов addBindValue() определяет, к какому плейсхолдеру будет привязано значение в подготовленном запросе. Если paramType равен QSql::Out или QSql::InOut, плейсхолдер будет перезаписан данными из базы данных после вызова exec().
Для привязки значения NULL используйте нулевой QVariant; например, используйте 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; например, используйте QVariant(QMetaType::QString) при привязке строки.
См. также 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.
[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 должен содержать одинаковое количество значений.
Примечание: Тип QVariant в списке не должен изменяться. Например, вы не можете смешивать целые числа и строковые значения в одном 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()'ed, но ещё не завершён. Когда вы закончите с активным запросом, вы можете сделать запрос неактивным, вызвав 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 пусто; в противном случае 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 таблица table должна содержать OID, которые могут не быть созданы по умолчанию. Убедитесь в этом, проверив переменную конфигурации 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 и запрос будет установлен в состояние неактивный. В любом случае старый набор результатов будет отброшен.
Когда один из операторов — это оператор, не являющийся оператором 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()
Извлекает предыдущую запись в результате, если она доступна, и позиционирует запрос на извлечённую запись. Обратите внимание, что результат должен быть в состоянии 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() перед подготовкой или выполнением запроса. Обратите внимание, что конструктор, принимающий запрос и базу данных, может выполнить запрос.
Режим только вперёд по умолчанию выключен.
Установка режима только вперёд в значение 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().
[since 6.2] void QSqlQuery::swap(QSqlQuery &other)
Меняет местами other с этим объектом. Эта операция очень быстрая и никогда не терпит неудачу.
Эта функция была введена в Qt 6.2.
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.2/qsqlquery.html