Spec-Zone.ru › Qt 5.6

Класс QSqlQuery

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

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

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

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

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

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(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(), выполнение 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().

Подходы к привязке значений

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

Привязка по имени, используя именованные плейсхолдеры:

    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. Если 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

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

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

    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(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()'ed, но ещё не завершён. Когда вы закончили с активным запросом, вы можете сделать запрос неактивным, вызвав finish() или clear(), или вы можете удалить экземпляр QSqlQuery.

Примечание: Особый интерес представляет активный запрос, являющийся SELECT утверждением. Для некоторых баз данных, которые поддерживают транзакции, активный запрос, являющийся SELECT утверждением, может привести к тому, что commit() или rollback() завершатся неудачно, поэтому перед коммитом или откатом вы должны сделать ваш активный SELECT запрос неактивным одним из способов, перечисленных выше.

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

bool QSqlQuery::isForwardOnly() const

Возвращает true если можно прокручивать результат только вперёд; в противном случае возвращает false.

См. также setForwardOnly() и next().

bool QSqlQuery::isNull(int field) const

Возвращает true если запрос не активен, запрос не позиционирован на действительной записи, такого field нет или field пусто; в противном случае false. Обратите внимание, что для некоторых драйверов isNull() не будет возвращать точную информацию до тех пор, пока не будет сделана попытка извлечь данные.

См. также isActive(), isValid() и value().

bool QSqlQuery::isNull(const QString &name) const

Это перегруженная функция.

Возвращает true если нет поля с таким name; в противном случае возвращает isNull(int index) для соответствующего индекса поля.

Этот перегруз более неэффективен, чем isNull()

bool QSqlQuery::isSelect() const

Возвращает true если текущий запрос является SELECT утверждением; в противном случае возвращает false.

bool QSqlQuery::isValid() const

Возвращает true если запрос в настоящее время позиционирован на действительной записи; в противном случае возвращает false.

bool QSqlQuery::last()

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

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

QSqlError QSqlQuery::lastError() const

Возвращает информацию об ошибке последней ошибки (если таковая имеется), произошедшей с этим запросом.

См. также QSqlError и QSqlDatabase::lastError().

QVariant QSqlQuery::lastInsertId() const

Возвращает идентификатор объекта последней вставленной строки, если база данных его поддерживает. Недействительный QVariant будет возвращён, если запрос не вставил никакого значения или если база данных не сообщает id обратно. Если более одной строки была затронута вставкой, поведение не определено.

Для баз данных MySQL будет возвращено поле автоинкремента строки.

Примечание: Для работы этой функции в PSQL таблица должна содержать OID, которые могут быть не созданы по умолчанию. Проверьте переменную конфигурации default_with_oids для уверенности.

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

QString QSqlQuery::lastQuery() const

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

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

END_OF_DOCUMENT_MARKER

bool QSqlQuery::next()

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

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

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

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

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

bool QSqlQuery::nextResult()

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

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

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

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

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

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

См. также 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() завершится с ошибкой.

Для SQLite строка запроса может содержать только один оператор за раз. Если указано более одного оператора, функция возвращает false.

Пример:

    QSqlQuery query;
    query.prepare("INSERT INTO person (id, forename, surname) "
                  "VALUES (:id, :forename, :surname)");
    query.bindValue(":id", 1001);
    query.bindValue(":forename", "Bart");
    query.bindValue(":surname", "Simpson");
    query.exec();

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

bool QSqlQuery::previous()

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

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

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

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

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

QSqlRecord QSqlQuery::record() const

Возвращает QSqlRecord, содержащую информацию о поле для текущего запроса. Если запрос указывает на допустимую строку (isValid() возвращает true), запись заполняется значениями строки. Пустая запись возвращается, когда нет активного запроса (isActive() возвращает false).

Для получения значений из запроса следует использовать value(), так как поиск по индексу в нем быстрее.

В следующем примере выполняется запрос SELECT * FROM. Поскольку порядок столбцов не определен, используется QSqlRecord::indexOf() для получения индекса столбца.

QSqlQuery q("select * from employees");
QSqlRecord rec = q.record();

qDebug() << "Number of columns: " << rec.count();

int nameCol = rec.indexOf("name"); // index of the field "name"
while (q.next())
    qDebug() << q.value(nameCol).toString(); // output all names

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

const QSqlResult *QSqlQuery::result() const

Возвращает результат, связанный с запросом.

bool QSqlQuery::seek(int index, bool relative = false)

Возвращает запись в позиции index, если она доступна, и позиционирует запрос на полученной записи. Первая запись находится в позиции 0. Обратите внимание, что запрос должен быть в состоянии активный и isSelect() должен возвращать true перед вызовом этой функции.

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

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

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

  • Если результат в данный момент расположен перед первой записью и:
    • index отрицателен или равен нулю, изменений нет, и возвращается false.
    • index положителен, выполняется попытка позиционировать результат в абсолютной позиции index - 1, следуя тем же правилам, что и для не-относительного 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 после выполнения запроса приведет в лучшем случае к неожиданным результатам, а в худшем — к сбою.

END_OF_DOCUMENT_MARKER

См. также 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.6/qsqlquery.html

Spec-Zone.ru

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