Spec-Zone.ru › Qt 5.15

Класс QSqlQuery

Класс QSqlQuery предоставляет средства для выполнения и обработки SQL-запросов. Подробнее...

Заголовок: #include <QSqlQuery>
qmake: QT += sql
  • Список всех членов, включая наследуемые

Типы публичного доступа

перечисление BatchExecutionMode { ValuesAsRows, ValuesAsColumns }

Функции публичного доступа

QSqlQuery(const QSqlQuery &other)
QSqlQuery(QSqlDatabase db)
QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
QSqlQuery(QSqlResult *result)
QSqlQuery & operator=(const QSqlQuery &other)
~QSqlQuery()
void addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
int at() const
void bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)
void bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
QVariant boundValue(const QString &placeholder) const
QVariant boundValue(int pos) const
QMap<QString, QVariant> boundValues() const
void clear()
const QSqlDriver * driver() const
bool exec(const QString &query)
bool exec()
bool execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows)
QString executedQuery() const
void finish()
bool first()
bool isActive() const
bool isForwardOnly() const
bool isNull(int field) const
bool isNull(const QString &name) const
bool isSelect() const
bool isValid() const
bool last()
QSqlError lastError() const
QVariant lastInsertId() const
QString lastQuery() const
bool next()
bool nextResult()
int numRowsAffected() const
QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const
bool prepare(const QString &query)
bool previous()
QSqlRecord record() const
const QSqlResult * result() const
bool seek(int index, bool relative = false)
void setForwardOnly(bool forward)
void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
int size() const
QVariant value(int index) const
QVariant value(const QString &name) const

Подробное описание

QSqlQuery инкапсулирует функциональность, связанную с созданием, навигацией и извлечением данных из SQL-запросов, которые выполняются на QSqlDatabase. Она может использоваться для выполнения операторов DML (язык манипулирования данными), таких как SELECT, INSERT, UPDATE и DELETE, а также операторов DDL (язык определения данных), таких как CREATE TABLE. Она также может использоваться для выполнения баз данных-специфических команд, которые не являются стандартным SQL (например, SET DATESTYLE=ISO для PostgreSQL).

Успешно выполненные SQL-запросы устанавливают состояние запроса в активное, так что isActive() возвращает true. В противном случае состояние запроса устанавливается в неактивное. В любом случае, при выполнении нового SQL-запроса запрос позиционируется на недействительной записи. Активный запрос должен быть перемещён на действительную запись (чтобы isValid() возвращало true) перед тем, как значения могут быть извлечены.

Для некоторых баз данных, если активный запрос, который является SELECT запросом, существует, когда вы вызываете commit() или rollback(), то выполнение commit или rollback завершится ошибкой. См. isActive() для получения подробной информации.

Перемещение по записям выполняется с помощью следующих функций:

  • next()
  • previous()
  • first()
  • last()
  • seek()

Эти функции позволяют программисту перемещаться вперёд, назад или произвольно по записям, возвращённым запросом. Если вам нужно только перемещаться вперёд по результатам (например, используя next()), вы можете использовать setForwardOnly(), что сэкономит значительный объём памяти и повысит производительность на некоторых базах данных. После того, как активный запрос будет размещён на действительной записи, данные могут быть извлечены с помощью value(). Все данные передаются из SQL-бекенда с помощью QVariant.

Например:

    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

Обратите внимание, что значения незавязанных параметров сохраняются.

Хранимые процедуры, которые используют оператор возврата для возврата значений или возвращают несколько наборов результатов, не полностью поддерживаются. Для получения подробной информации см. Драйверы баз данных SQL.

Предупреждение: Вы должны загрузить драйвер SQL и открыть соединение перед созданием QSqlQuery. Кроме того, соединение должно оставаться открытым во время существования запроса; в противном случае поведение QSqlQuery неопределено.

См. также QSqlDatabase, QSqlQueryModel, QSqlTableModel и QVariant.

Документация по типам членов

перечисление QSqlQuery::BatchExecutionMode

Константа Значение Описание
QSqlQuery::ValuesAsRows 0 - Обновляет несколько строк. Обрабатывает каждую запись в QVariantList как значение для обновления следующей строки.
QSqlQuery::ValuesAsColumns 1 - Обновляет одну строку. Обрабатывает каждую запись в QVariantList как единственное значение типа массива.

Документация по функциям-членам

QSqlQuery::QSqlQuery(const QSqlQuery &other)

Создает копию other.

QSqlQuery::QSqlQuery(QSqlDatabase db)

Создает объект QSqlQuery, используя базу данных db. Если db недействителен, используется базу данных по умолчанию.

См. также QSqlDatabase.

QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())

Создает объект QSqlQuery, используя SQL-запрос query и базу данных db. Если db не указан или недействителен, используется базу данных по умолчанию. Если query не пустая строка, она будет выполнена.

См. также QSqlDatabase.

QSqlQuery::QSqlQuery(QSqlResult *result)

Создает объект QSqlQuery, который использует QSqlResult result для взаимодействия с базой данных.

QSqlQuery &QSqlQuery::operator=(const QSqlQuery &other)

Присваивает other этому объекту.

QSqlQuery::~QSqlQuery()

Удаляет объект и освобождает все выделенные ресурсы.

void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)

Добавляет значение val в список значений при использовании позиционной привязки значений. Порядок вызовов addBindValue() определяет, к какой закладке будет привязано значение в подготовленном запросе. Если paramType — QSql::Out или QSql::InOut, закладная будет перезаписана данными из базы данных после вызова exec().

Для привязки NULL-значения используйте нулевую QVariant; например, используйте QVariant(QVariant::String) при привязке строки.

См. также bindValue(), prepare(), exec(), boundValue() и boundValues().

int QSqlQuery::at() const

Возвращает текущую внутреннюю позицию запроса. Первая запись находится на позиции ноль. Если позиция недействительна, функция возвращает QSql::BeforeFirstRow или QSql::AfterLastRow, которые являются специальными отрицательными значениями.

См. также previous(), next(), first(), last(), seek(), isActive() и isValid().

void QSqlQuery::bindValue(const QString &placeholder, const QVariant &val, QSql::ParamType paramType = QSql::In)

Устанавливает закладку placeholder, которая будет привязана к значению val в подготовленном операторе. Обратите внимание, что маркер закладной (например, :) должен быть включен при указании имени закладной. Если paramType — QSql::Out или QSql::InOut, закладная будет перезаписана данными из базы данных после вызова exec(). В этом случае необходимо предварительно выделить достаточно места для хранения результата.

Для привязки NULL-значения используйте нулевую QVariant; например, используйте QVariant(QVariant::String) при привязке строки.

См. также addBindValue(), prepare(), exec(), boundValue() и boundValues().

void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)

Устанавливает закладку на позиции pos, которая будет привязана к значению val в подготовленном операторе. Нумерация столбцов начинается с 0. Если paramType — QSql::Out или QSql::InOut, закладная будет перезаписана данными из базы данных после вызова exec().

QVariant QSqlQuery::boundValue(const QString &placeholder) const

Возвращает значение для placeholder.

См. также boundValues(), bindValue() и addBindValue().

QVariant QSqlQuery::boundValue(int pos) const

Возвращает значение для закладной на позиции pos.

QMap<QString, QVariant> QSqlQuery::boundValues() const

Возвращает карту связанных значений.

При использовании именованной привязки связанные значения можно проверить следующим образом:

    QMap<QString, QVariant> sqlIterator(query.boundValues());
    for (auto i = sqlIterator.begin(); i != sqlIterator.end(); ++i) {
        cout << i.key().toUtf8().data() << ": "
             << i.value().toString().toUtf8().data() << "\n";
    }

При использовании позиционной привязки код становится:

    QList<QVariant> list = query.boundValues().values();
    for (int i = 0; i < list.size(); ++i)
        cout << i << ": " << list.at(i).toString().toUtf8().data() << "\n";

См. также 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 должен содержать одинаковое количество вариантов.

Примечание: Тип 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;

Функция была добавлена в 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 таблица должна содержать OID, которые могут не быть созданы по умолчанию. Проверьте переменную конфигурации default_with_oids , чтобы убедиться.

См. также QSqlDriver::hasFeature().

END_OF_DOCUMENT_MARKER

QString QSqlQuery::lastQuery() const

Возвращает текст текущего выполняемого запроса или пустую строку, если текущего запроса нет.

См. также executedQuery().

bool QSqlQuery::next()

Извлекает следующую запись в результате, если она доступна, и позиционирует запрос на извлеченной записи. Обратите внимание, что результат должен быть в активном состоянии (isActive()) и isSelect() должно возвращать true перед вызовом этой функции, иначе она ничего не сделает и вернёт false.

Применяются следующие правила:

  • Если результат в настоящее время находится перед первой записью, например, сразу после выполнения запроса, происходит попытка извлечения первой записи.
  • Если результат в настоящее время находится после последней записи, изменений нет, и возвращается false.
  • Если результат находится где-то посередине, происходит попытка извлечения следующей записи.

Если запись не может быть извлечена, результат позиционируется после последней записи, и возвращается false. Если запись успешно извлечена, возвращается true.

См. также previous(), first(), last(), seek(), at(), isActive() и isValid().

bool QSqlQuery::nextResult()

Отбрасывает текущий набор результатов и переходит к следующему, если он доступен.

Некоторые базы данных способны возвращать несколько наборов результатов для хранимых процедур или SQL-пакетов (строки запросов, содержащие несколько операторов). Если после выполнения запроса доступно несколько наборов результатов, эта функция может использоваться для перехода к следующему набору результатов.

Если новый набор результатов доступен, функция вернёт true. Запрос будет перепозиционирован на недействительной записи в новом наборе результатов, и необходимо перейти к действительной записи, прежде чем можно будет получить значения данных. Если новый набор результатов недоступен, функция возвращает false и запрос устанавливается в неактивное состояние. В любом случае старый набор результатов будет отброшен.

Когда один из операторов — это оператор, не являющийся select, возможно, вместо набора результатов будет доступно количество затронутых строк.

Обратите внимание, что некоторые базы данных, например, Microsoft SQL Server, требуют не прокручиваемых курсоров при работе с несколькими наборами результатов. Некоторые базы данных могут выполнять все операторы сразу, в то время как другие могут откладывать выполнение до фактического доступа к набору результатов, а некоторые базы данных могут иметь ограничения на операторы, которые разрешено использовать в SQL-пакете.

Эта функция была введена в Qt 4.4.

См. также QSqlDriver::hasFeature(), setForwardOnly(), next(), isSelect(), numRowsAffected(), isActive() и lastError().

int QSqlQuery::numRowsAffected() const

Возвращает количество строк, затронутых SQL-оператором результата, или -1, если это невозможно определить. Обратите внимание, что для SELECT операторов значение не определено; вместо этого используйте size(). Если запрос не активен (isActive()), возвращается -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()

Извлекает предыдущую запись в результате, если она доступна, и позиционирует запрос на извлеченной записи. Обратите внимание, что результат должен быть в активном состоянии (isActive()) и 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. Обратите внимание, что запрос должен быть в активном состоянии (isActive()) и isSelect() должно возвращать true перед вызовом этой функции.

Если relative равно false (по умолчанию), применяются следующие правила:

  • Если index отрицательный, результат позиционируется перед первой записью, и возвращается false.
  • В противном случае происходит попытка перейти к записи по позиции index. Если запись по позиции index не может быть извлечена, результат позиционируется после последней записи, и возвращается false. Если запись успешно извлечена, возвращается true.

Если relative равно true, применяются следующие правила:

  • Если результат в настоящее время расположен перед первой записью и:
    • index отрицательный или нулевой, изменений нет, и возвращается false.
    • index положительный, происходит попытка позиционировать результат по абсолютной позиции index - 1, следуя тем же правилам, что и для неотносительного поиска, указанным выше.
  • Если результат в настоящее время расположен после последней записи и:
    • index положительный или нулевой, изменений нет, и возвращается false.
    • index отрицательный, происходит попытка позиционировать результат по смещению index + 1 относительно последней записи, следуя правилам ниже.
  • Если результат в настоящее время расположен где-то посередине, и смещение index перемещает результат ниже нуля, результат позиционируется перед первой записью, и возвращается false.
  • В противном случае, происходит попытка перейти к записи, на index записей вперёд от текущей записи (или на index записей назад, если index отрицательный). Если запись по смещению index не может быть извлечена, результат позиционируется после последней записи, если index ≥ 0, (или перед первой записью, если index отрицательный), и возвращается false. Если запись успешно извлечена, возвращается true.

См. также next(), previous(), first(), last(), at(), isActive() и isValid().

void QSqlQuery::setForwardOnly(bool forward)

Устанавливает режим только вперёд в значение forward. Если forward равно true, разрешены только next() и seek() с положительными значениями для навигации по результатам.

Режим только вперёд может быть (в зависимости от драйвера) более эффективным с точки зрения памяти, поскольку результаты не нужно кэшировать. Он также улучшит производительность в некоторых базах данных. Для этого нужно вызвать setForwardOnly() до подготовки или выполнения запроса. Обратите внимание, что конструктор, принимающий запрос и базу данных, может выполнить запрос.

Режим только вперёд выключен по умолчанию.

Установка forward only в значение false — это предложение для движка базы данных, у которого последнее слово в вопросе о том, будет ли результат набора данных только forward-only или прокручиваемым. isForwardOnly() всегда вернёт правильный статус набора результатов.

Примечание: Вызов setForwardOnly после выполнения запроса в лучшем случае приведёт к неожиданным результатам, а в худшем — к аварийному завершению работы.

Примечание: Чтобы убедиться, что запрос forward-only был выполнен успешно, приложение должно проверять lastError() на наличие ошибки не только после выполнения запроса, но и после навигации по результатам запроса.

Предупреждение: PostgreSQL: Во время навигации по результатам запроса в режиме forward-only не выполняйте никаких других SQL-команд в той же базе данных. Это приведёт к потере результатов запроса.

См. также isForwardOnly(), next(), seek() и QSqlResult::setForwardOnly().

void QSqlQuery::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)

Инструктирует драйвер базы данных возвращать числовые значения с точностью, заданной параметром precisionPolicy.

Например, драйвер Oracle может извлекать числовые значения в виде строк, чтобы предотвратить потерю точности. Если высокая точность не важна, используйте этот метод для увеличения скорости выполнения, минуя преобразования строк.

Примечание: Драйверы, которые не поддерживают извлечение числовых значений с низкой точностью, проигнорируют политику точности. Вы можете использовать QSqlDriver::hasFeature(), чтобы узнать, поддерживает ли драйвер эту функцию.

Примечание: Установка политики точности не влияет на активный запрос. Для активации политики вызовите exec(QString) или prepare().

См. также QSql::NumericalPrecisionPolicy и numericalPrecisionPolicy().

int QSqlQuery::size() const

Возвращает размер результата (количество строк), или -1, если размер определить нельзя или база данных не поддерживает отчёт о размере запроса. Обратите внимание, что для не-SELECT запросов (isSelect() возвращает false), size() вернёт -1. Если запрос не активен (isActive() возвращает false), возвращается -1.

Чтобы определить количество строк, затронутых не-SELECT операцией, используйте numRowsAffected().

См. также isActive(), numRowsAffected() и QSqlDriver::hasFeature().

QVariant QSqlQuery::value(int index) const

Возвращает значение поля index в текущей записи.

Поля нумеруются слева направо с помощью текста SELECT оператора, например, в

SELECT forename, surname FROM people;

поле 0 является forename, а поле 1 является surname. Использование SELECT * не рекомендуется, поскольку порядок полей в запросе не определён.

Возвращается недействительный QVariant, если поле index не существует, запрос неактивен или запрос расположен на недействительной записи.

См. также previous(), next(), first(), last(), seek(), isActive() и isValid().

QVariant QSqlQuery::value(const QString &name) const

Это перегруженный метод.

Возвращает значение поля с именем name в текущей записи. Если поле name не существует, возвращается недействительный объект.

Этот перегруз меньше эффективен, чем value()

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qsqlquery.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API