Класс QSqlQuery
Класс QSqlQuery предоставляет средства для выполнения и обработки SQL-запросов. Подробнее...
| Заголовок: | #include <QSqlQuery> |
| qmake: | QT += sql |
Типы public
| перечисление | BatchExecutionMode { ValuesAsRows, ValuesAsColumns } |
Public Функции
| QSqlQuery(QSqlResult *result) | |
| QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase()) | |
| QSqlQuery(QSqlDatabase db) | |
| QSqlQuery(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 & | operator=(const QSqlQuery &other) |
Подробное описание
Класс QSqlQuery предоставляет средства для выполнения и обработки SQL-запросов.
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().
Подходы к привязке значений
Ниже представлен тот же пример с использованием каждого из четырёх различных подходов к привязке, а также один пример привязки значений к хранимой процедуре.
Привязка по имени, используя именованные плейсхолдеры:
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(QSqlResult *result)
Создаёт объект QSqlQuery, который использует QSqlResult result для взаимодействия с базой данных.
QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
Создаёт объект QSqlQuery, используя SQL-запрос query и базу данных db. Если db не указана или недействительна, используется базу данных по умолчанию приложения. Если query не пустая строка, она будет выполнена.
См. также QSqlDatabase.
QSqlQuery::QSqlQuery(QSqlDatabase db)
Создаёт объект QSqlQuery, используя базу данных db. Если db недействительна, будет использована база данных по умолчанию приложения.
См. также QSqlDatabase.
QSqlQuery::QSqlQuery(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()'d, но ещё не завершён. Когда вы закончите с активным запросом, вы можете сделать запрос неактивным, вызвав 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() завершится ошибкой.
Для 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, следуя тем же правилам, что и для non-relative seek, выше.
- Если результат в настоящее время расположен после последней записи и:
- 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()
QSqlQuery &QSqlQuery::operator=(const QSqlQuery &other)
Присваивает other этому объекту.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qsqlquery.html