QSqlQuery Class

QSqlQuery 클래스는 SQL 문을 실행하고 조작하는 수단을 제공합니다. 더 보기...

Header: #include <QSqlQuery>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql

공용 유형

enum BatchExecutionMode { ValuesAsRows, ValuesAsColumns }

속성

공공 기능

QSqlQuery(QSqlResult *result)
QSqlQuery(const QSqlDatabase &db)
QSqlQuery(const QString &query = QString(), const QSqlDatabase &db = QSqlDatabase())
(since 6.2) QSqlQuery(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
(since 6.6) QString boundValueName(int pos) const
(since 6.6) QStringList boundValueNames() const
(since 6.0) QVariantList boundValues() const
void clear()
const QSqlDriver *driver() const
bool exec()
bool exec(const QString &query)
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(QAnyStringView name) const
(since 6.7) bool isPositionalBindingEnabled() 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)
(since 6.7) void setPositionalBindingEnabled(bool enable)
int size() const
(since 6.2) void swap(QSqlQuery &other)
QVariant value(int index) const
QVariant value(QAnyStringView name) const
(since 6.2) QSqlQuery &operator=(QSqlQuery &&other)

상세 설명

QSqlQuery는 QSqlDatabase 에서 실행되는 SQL 쿼리에서 데이터를 생성, 탐색 및 검색하는 것과 관련된 기능을 캡슐화합니다. SELECT, INSERT, UPDATE, DELETE 와 같은 DML(데이터 조작 언어) 문과 CREATE TABLE 과 같은 DDL(데이터 정의 언어) 문을 실행하는 데 사용할 수 있습니다. 또한 표준 SQL이 아닌 데이터베이스별 명령을 실행하는 데에도 사용할 수 있습니다(예: PostgreSQL의 경우 SET DATESTYLE=ISO ).

성공적으로 실행된 SQL 문은 쿼리의 상태를 활성으로 설정하여 isActive()가 true 을 반환하도록 합니다. 그렇지 않으면 쿼리 상태가 비활성으로 설정됩니다. 두 경우 모두 새 SQL 문을 실행할 때 쿼리는 유효하지 않은 레코드에 배치됩니다. 활성 쿼리는 값을 검색하기 전에 유효한 레코드로 이동해야 합니다( isValid()가 true)를 반환하도록).

일부 데이터베이스의 경우 commit() 또는 rollback()를 호출할 때 SELECT 문인 활성 쿼리가 존재하는 경우 커밋 또는 롤백이 실패합니다. 자세한 내용은 isActive()를 참조하세요.

레코드 탐색은 다음 함수를 사용하여 수행됩니다:

이러한 함수를 사용하면 프로그래머가 쿼리에서 반환된 레코드를 앞으로, 뒤로 또는 임의로 이동할 수 있습니다. 결과만 앞으로 이동해야 하는 경우(예: next() 사용) setForwardOnly()를 사용하면 상당한 양의 메모리 오버헤드를 절약하고 일부 데이터베이스에서 성능을 개선할 수 있습니다. 활성 쿼리가 유효한 레코드에 배치되면 value()를 사용하여 데이터를 검색할 수 있습니다. 모든 데이터는 QVariants를 사용하여 SQL 백엔드에서 전송됩니다.

예를 들어

    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는 이를 활용하지만, 이러한 지원이 없는 데이터베이스의 경우 쿼리가 실행될 때 플레이스홀더를 실제 값으로 대체하는 등의 방식으로 기능 자체를 구현합니다. SELECT 쿼리가 아닌 쿼리에 영향을 받은 행 수를 확인하려면 numRowsAffected(), SELECT 쿼리에 의해 검색된 행 수를 확인하려면 size()를 사용합니다.

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() 라는 저장 프로시저를 호출하여 in 매개 변수에 문자를 전달하고 그 결과를 out 매개 변수로 가져옵니다.

    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참조하세요 .

멤버 유형 문서

enum QSqlQuery::BatchExecutionMode

상수설명
QSqlQuery::ValuesAsRows0- 여러 행을 업데이트합니다. QVariantList 의 모든 항목을 다음 행을 업데이트하기 위한 값으로 취급합니다.
QSqlQuery::ValuesAsColumns1- 단일 행을 업데이트합니다. QVariantList 의 모든 항목을 배열 유형의 단일 값으로 처리합니다.

속성 문서

[since 6.8] forwardOnly : bool

이 속성은 앞으로만 모드를 유지합니다. forward 이 참이면 양수 값을 가진 next() 및 seek()만 결과를 탐색할 수 있습니다.

정방향 전용 모드는 결과를 캐시할 필요가 없으므로 (드라이버에 따라) 메모리 효율이 더 높을 수 있습니다. 또한 일부 데이터베이스의 성능을 향상시킬 수 있습니다. 이를 위해서는 쿼리가 준비되거나 실행되기 전에 setForwardOnly() 을 호출해야 합니다. 쿼리와 데이터베이스를 받는 생성자가 쿼리를 실행할 수 있다는 점에 유의하세요.

전달 전용 모드는 기본적으로 꺼져 있습니다.

정방향 전용을 false로 설정하는 것은 데이터베이스 엔진에 제안하는 것으로, 결과 집합이 정방향 전용인지 아니면 스크롤 가능한지에 대한 최종 결정권은 데이터베이스 엔진에 있습니다. isForwardOnly()는 항상 결과 집합의 올바른 상태를 반환합니다.

참고: 쿼리 실행 후 setForwardOnly 을 호출하면 기껏해야 예기치 않은 결과가 나오고 최악의 경우 충돌이 발생할 수 있습니다.

참고: 정방향 전용 쿼리가 성공적으로 완료되었는지 확인하려면 애플리케이션에서 쿼리를 실행한 후뿐만 아니라 쿼리 결과를 탐색한 후에도 lastError()에서 오류를 확인해야 합니다.

경고: PostgreSQL: 정방향 전용 모드에서 쿼리 결과를 탐색하는 동안 동일한 데이터베이스 연결에서 다른 SQL 명령을 실행하지 마세요. 그러면 쿼리 결과가 손실될 수 있습니다.

이 속성은 Qt 6.8에 도입되었습니다.

액세스 함수:

bool isForwardOnly() const
void setForwardOnly(bool forward)

next() 및 seek()도 참조하세요 .

[since 6.8] numericalPrecisionPolicy : QSql::NumericalPrecisionPolicy

precisionPolicy 에서 지정한 정밀도로 숫자 값을 반환하도록 데이터베이스 드라이버에 지시합니다.

예를 들어 Oracle 드라이버는 정밀도 손실을 방지하기 위해 숫자 값을 문자열로 검색할 수 있습니다. 높은 정밀도가 중요하지 않은 경우 이 방법을 사용하면 문자열 변환을 우회하여 실행 속도를 높일 수 있습니다.

참고: 낮은 정밀도의 숫자 값 가져오기를 지원하지 않는 드라이버는 정밀도 정책을 무시합니다. QSqlDriver::hasFeature ()를 사용하여 드라이버가 이 기능을 지원하는지 확인할 수 있습니다.

참고: 정밀도 정책을 설정해도 현재 활성 쿼리에는 영향을 미치지 않습니다. 정책을 활성화하려면 exec(QString) 또는 prepare()을 호출하세요.

이 속성은 Qt 6.8에 도입되었습니다.

액세스 함수:

QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const
void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)

QSql::NumericalPrecisionPolicy, QSqlDriver::numericalPrecisionPolicy, QSqlDatabase::numericalPrecisionPolicy참조하세요 .

[since 6.8] positionalBindingEnabled : bool

이 속성은 enable (기본값은 true)에 따라 이 쿼리에 대해 binding 위치 바인딩을 사용하거나 사용하지 않도록 설정합니다. 위치 바인딩을 비활성화하면 쿼리 자체에 위치 바인딩 매개변수로 처리해서는 안 되는 '?'가 포함되어 있는 경우, 예를 들어 PostgreSQL 데이터베이스의 JSON 연산자로 처리해야 하는 경우에 유용합니다.

데이터베이스가 물음표가 있는 위치 바인딩을 기본적으로 지원하는 경우에는 이 속성이 적용되지 않습니다( QSqlDriver::PositionalPlaceholders 참조).

이 프로퍼티는 Qt 6.8에 도입되었습니다.

액세스 함수:

멤버 함수 문서

[explicit] QSqlQuery::QSqlQuery(QSqlResult *result)

QSqlResult result 을 사용하여 데이터베이스와 통신하는 QSqlQuery 객체를 구축합니다.

[explicit] QSqlQuery::QSqlQuery(const QSqlDatabase &db)

데이터베이스를 사용하여 QSqlQuery 객체를 작성합니다 db. db 이 유효하지 않으면 애플리케이션의 기본 데이터베이스가 사용됩니다.

QSqlDatabase도 참조하세요 .

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

SQL query 과 데이터베이스 db 를 사용하여 QSqlQuery 객체를 작성합니다. db 이 지정되지 않았거나 유효하지 않은 경우 애플리케이션의 기본 데이터베이스가 사용됩니다. query 이 빈 문자열이 아닌 경우 실행됩니다.

QSqlDatabase도 참조하세요 .

[noexcept, since 6.2] QSqlQuery::QSqlQuery(QSqlQuery &&other)

Move - other 에서 QSqlQuery를 생성합니다.

이 함수는 Qt 6.2에 도입되었습니다.

[noexcept] QSqlQuery::~QSqlQuery()

개체를 파괴하고 할당된 모든 리소스를 해제합니다.

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

위치 값 바인딩을 사용할 때 val 값을 값 목록에 추가합니다. addBindValue() 호출 순서에 따라 준비된 쿼리에서 값이 바인딩될 플레이스홀더가 결정됩니다. paramTypeQSql::Out 또는 QSql::InOut 인 경우 exec() 호출 후에 플레이스홀더가 데이터베이스의 데이터로 덮어씌워집니다.

NULL 값을 바인딩하려면 QVariant; 예를 들어 문자열을 바인딩하는 경우 QVariant(QMetaType::fromType<QString>()) 을 사용합니다.

bindValue(), prepare(), exec(), boundValue() 및 boundValues()도 참조하세요 .

int QSqlQuery::at() const

쿼리의 현재 내부 위치를 반환합니다. 첫 번째 레코드는 위치 0에 있습니다. 위치가 유효하지 않은 경우 특수 음수 값인 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)

준비된 문에서 val 값에 바인딩되도록 placeholder 자리 표시자를 설정합니다. 플레이스홀더 이름을 지정할 때 플레이스홀더 마크(예: :)를 포함해야 합니다. paramTypeQSql::Out 또는 QSql::InOut 인 경우 exec() 호출 후에 플레이스홀더가 데이터베이스의 데이터로 덮어씌워집니다. 이 경우 결과를 저장할 충분한 공간을 미리 할당해야 합니다.

NULL 값을 바인딩하려면 QVariant; 예를 들어 문자열을 바인딩하는 경우 QVariant(QMetaType::fromType<QString>()) 을 사용합니다.

addBindValue(), prepare(), exec(), boundValue() 및 boundValues()도 참조하세요 .

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

준비된 문에서 val 값에 바인딩되도록 pos 위치에 자리 표시자를 설정합니다. 필드 번호는 0부터 시작합니다. paramTypeQSql::Out 또는 QSql::InOut 인 경우 exec() 호출 후에 자리 표시자가 데이터베이스의 데이터로 덮어씌워집니다.

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

placeholder 의 값을 반환합니다.

boundValues(), bindValue(), addBindValue()도 참조하세요 .

QVariant QSqlQuery::boundValue(int pos) const

pos 위치의 자리 표시자 값을 반환합니다.

boundValues()도 참조하세요 .

[since 6.6] QString QSqlQuery::boundValueName(int pos) const

pos 위치에 바인딩된 값 이름을 반환합니다.

목록의 순서는 이름 바인딩 또는 위치 바인딩 사용 여부에 관계없이 바인딩 순서대로입니다.

이 함수는 Qt 6.6에 도입되었습니다.

boundValueNames()도 참조하십시오 .

[since 6.6] QStringList QSqlQuery::boundValueNames() const

바인딩된 모든 값의 이름을 반환합니다.

목록의 순서는 이름 바인딩 또는 위치 바인딩 사용 여부와 관계없이 바인딩 순서에 따릅니다.

이 함수는 Qt 6.6에 도입되었습니다.

boundValues() 및 boundValueName()도 참조하세요 .

[since 6.0] QVariantList QSqlQuery::boundValues() const

바인딩된 값의 목록을 반환합니다.

목록의 순서는 명명 바인딩 또는 위치 바인딩 사용 여부에 관계없이 바인딩 순서대로 정렬됩니다.

바인딩된 값은 다음과 같은 방법으로 검사할 수 있습니다:

   const QVariantList list = query.boundValues(); for (qsizetype i = 0; i < list.size(); ++i)        qDebug() << i << ":" << list.at(i).toString();

이 기능은 Qt 6.0에 도입되었습니다.

boundValue(), bindValue(), addBindValue() 및 boundValueNames()도 참조하세요 .

void QSqlQuery::clear()

결과 집합을 지우고 쿼리가 보유한 모든 리소스를 해제합니다. 쿼리 상태를 비활성으로 설정합니다. 이 함수를 호출해야 하는 경우는 거의 없습니다.

const QSqlDriver *QSqlQuery::driver() const

쿼리와 관련된 데이터베이스 드라이버를 반환합니다.

bool QSqlQuery::exec()

이전에 준비한 SQL 쿼리를 실행합니다. 쿼리가 성공적으로 실행되면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

이 쿼리의 마지막 오류는 exec()가 호출될 때 재설정된다는 점에 유의하세요.

prepare(), bindValue(), addBindValue(), boundValue() 및 boundValues()도 참조하세요 .

bool QSqlQuery::exec(const QString &query)

query 에서 SQL을 실행합니다. 쿼리가 성공하면 true 을 반환하고 쿼리 상태를 active 으로 설정하고, 그렇지 않으면 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::execBatch(QSqlQuery::BatchExecutionMode mode = ValuesAsRows)

이전에 준비한 SQL 쿼리를 일괄적으로 실행합니다. 바인딩된 모든 매개 변수는 변형 목록이어야 합니다. 데이터베이스가 일괄 실행을 지원하지 않는 경우 드라이버는 기존의 exec() 호출을 사용하여 시뮬레이션합니다.

쿼리가 성공적으로 실행되면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

예시:

QSqlQuery q; q.prepare("insert into myTable values (?, ?)");QVariantList ints; ints<< 1<< 2<< 3<< 4; q.addBindValue(ints);QVariantList names; names<< "Harald"<< "Boris"<< "Trond"<< QVariant(QMetaType::fromType<QString>()); q.addBindValue(names);if (!q.execBatch())    qDebug() << q.lastError();

위의 예는 myTable 에 4개의 새 행을 삽입합니다:

1  Harald
2  Boris
3  Trond
4  NULL

NULL 값을 바인딩하려면 바인딩된 QVariantList 에 관련 유형의 null QVariant 을 추가해야 합니다(예: 문자열을 사용하는 경우 QVariant(QMetaType::fromType<QString>()) 을 사용해야 합니다).

참고: 바인딩된 모든 QVariantList 에는 동일한 수의 변형이 포함되어야 합니다.

참고: 목록에 있는 QVariants의 유형은 변경되지 않아야 합니다. 예를 들어 QVariantList 내에 정수와 문자열 이형 상품을 혼합할 수 없습니다.

mode 매개 변수는 바인딩된 QVariantList 이 어떻게 해석될지를 나타냅니다. modeValuesAsRows 인 경우 QVariantList 내의 모든 변형은 새 행의 값으로 해석됩니다. ValuesAsColumns 은 Oracle 드라이버의 특수한 경우입니다. 이 모드에서는 QVariantList 내의 모든 항목이 저장 프로시저 내의 IN 또는 OUT 값에 대한 배열 값으로 해석됩니다. 이 모드는 IN 또는 OUT 값이 기본 유형의 열로만 구성된 테이블 유형인 경우에만 작동합니다(예: 다음과 같은 경우). TYPE myType IS TABLE OF VARCHAR(64) INDEX BY BINARY_INTEGER;

prepare(), bindValue() 및 addBindValue()도 참조하세요 .

QString QSqlQuery::executedQuery() const

마지막으로 성공적으로 실행된 쿼리를 반환합니다.

대부분의 경우 이 함수는 lastQuery()와 동일한 문자열을 반환합니다. 플레이스홀더가 있는 준비된 쿼리가 이를 지원하지 않는 DBMS에서 실행되는 경우 이 쿼리의 준비 과정이 에뮬레이션됩니다. 원래 쿼리의 자리 표시자는 바인딩된 값으로 대체되어 새 쿼리를 형성합니다. 이 함수는 수정된 쿼리를 반환합니다. 주로 디버깅 목적으로 유용합니다.

lastQuery()도 참조하세요 .

void QSqlQuery::finish()

데이터베이스 드라이버에 이 쿼리가 다시 실행될 때까지 이 쿼리에서 더 이상 데이터를 가져오지 않도록 지시합니다. 일반적으로 이 함수를 호출할 필요는 없지만 나중에 쿼리를 다시 사용하려는 경우 잠금이나 커서 등의 리소스를 확보하는 데 유용할 수 있습니다.

쿼리를 비활성으로 설정합니다. 바인딩된 값은 해당 값을 유지합니다.

prepare(), exec() 및 isActive()도 참조하세요 .

bool QSqlQuery::first()

결과에서 첫 번째 레코드(있는 경우)를 검색하고 검색된 레코드에 쿼리를 배치합니다. 결과는 active 상태여야 하며 isSelect()은 이 함수를 호출하기 전에 참을 반환해야 하며, 그렇지 않으면 아무 작업도 수행하지 않고 거짓을 반환합니다. 성공하면 true 을 반환합니다. 실패하면 쿼리 위치가 유효하지 않은 위치로 설정되고 false가 반환됩니다.

next(), previous(), last(), seek(), at(), isActive(), isValid()도 참조하세요 .

bool QSqlQuery::isActive() const

쿼리가 활성 상태인 경우 true 을 반환합니다. 활성 QSqlQueryexec()가 성공적으로 완료되었지만 아직 완료되지 않은 쿼리입니다. 활성 쿼리를 완료하면 finish() 또는 clear()를 호출하여 쿼리를 비활성 상태로 만들거나 QSqlQuery 인스턴스를 삭제할 수 있습니다.

참고: 특히 주목할 만한 것은 SELECT 문인 활성 쿼리입니다. 트랜잭션을 지원하는 일부 데이터베이스의 경우 SELECT 문인 활성 쿼리로 인해 commit() 또는 rollback()가 실패할 수 있으므로 커밋하거나 롤백하기 전에 위에 나열된 방법 중 하나를 사용하여 활성 SELECT 문 쿼리를 비활성 상태로 만들어야 합니다.

isSelect()도 참조하세요 .

bool QSqlQuery::isForwardOnly() const

반환값 forwardOnly.

참고: 속성에 대한 게터 함수 forwardOnly.

forwardOnly, next() 및 seek()도 참조하세요 .

bool QSqlQuery::isNull(int field) const

쿼리가 active, 쿼리가 유효한 레코드에 위치하지 않거나 field, 또는 field 이 아닌 경우 true 를 반환하고, 그렇지 않으면 false 을 반환합니다. 일부 드라이버의 경우 isNull()은 데이터 검색을 시도할 때까지 정확한 정보를 반환하지 않는다는 점에 유의하세요.

isActive(), isValid() 및 value()도 참조하세요 .

bool QSqlQuery::isNull(QAnyStringView name) const

이 함수는 오버로드된 함수입니다.

name 이 있는 필드가 없는 경우 true 을 반환하고, 그렇지 않으면 해당 필드 인덱스에 대해 isNull(int index)을 반환합니다.

이 오버로드는 isNull()보다 효율성이 떨어집니다.

참고: 6.8 이전 Qt 버전에서는 이 함수가 QAnyStringView 이 아닌 QString 을 취했습니다.

[since 6.7] bool QSqlQuery::isPositionalBindingEnabled() const

반환값 positionalBindingEnabled.

참고: 프로퍼티 positionalBindingEnabled 에 대한 겟터 함수.

이 함수는 Qt 6.7에 도입되었습니다.

positionalBindingEnabled도 참조하십시오 .

bool QSqlQuery::isSelect() const

현재 쿼리가 SELECT 문인 경우 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

bool QSqlQuery::isValid() const

쿼리가 현재 유효한 레코드에 위치하면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

bool QSqlQuery::last()

결과에서 마지막 레코드(있는 경우)를 검색하고 검색된 레코드에 쿼리를 배치합니다. 결과는 active 상태여야 하며 isSelect()은 이 함수를 호출하기 전에 참을 반환해야 하며, 그렇지 않으면 아무 작업도 수행하지 않고 거짓을 반환합니다. 성공하면 true 을 반환합니다. 실패하면 쿼리 위치가 유효하지 않은 위치로 설정되고 false가 반환됩니다.

next(), previous(), first(), seek(), at(), isActive(), isValid()도 참조하세요 .

QSqlError QSqlQuery::lastError() const

이 쿼리에서 발생한 마지막 오류(있는 경우)에 대한 오류 정보를 반환합니다.

QSqlErrorQSqlDatabase::lastError()도 참조하세요 .

QVariant QSqlQuery::lastInsertId() const

데이터베이스에서 지원하는 경우 가장 최근에 삽입된 행의 객체 ID를 반환합니다. 쿼리에서 값을 삽입하지 않았거나 데이터베이스가 ID를 다시 보고하지 않으면 잘못된 QVariant 이 반환됩니다. 삽입으로 두 개 이상의 행을 건드린 경우 동작이 정의되지 않습니다.

MySQL 데이터베이스의 경우 행의 자동 증가 필드가 반환됩니다.

참고: 이 함수가 PSQL에서 작동하려면 테이블에 기본적으로 생성되지 않았을 수 있는 OID가 포함되어 있어야 합니다. default_with_oids 구성 변수를 확인하여 확인하세요.

QSqlDriver::hasFeature()도 참조하세요 .

QString QSqlQuery::lastQuery() const

사용 중인 현재 쿼리의 텍스트를 반환하거나 현재 쿼리 텍스트가 없는 경우 빈 문자열을 반환합니다.

executedQuery()도 참조하세요 .

bool QSqlQuery::next()

가능한 경우 결과에서 다음 레코드를 검색하고 검색된 레코드에 쿼리를 배치합니다. 결과는 active 상태여야 하며 isSelect()은 이 함수를 호출하기 전에 참을 반환해야 하며, 그렇지 않으면 아무 작업도 수행하지 않고 거짓을 반환합니다.

다음 규칙이 적용됩니다:

  • 결과가 현재 첫 번째 레코드 앞에 있는 경우(예: 쿼리가 실행된 직후) 첫 번째 레코드를 검색하려고 시도합니다.
  • 결과가 현재 마지막 레코드 뒤에 있는 경우 변경 사항이 없으며 false가 반환됩니다.
  • 결과가 중간 어딘가에 있는 경우 다음 레코드를 검색하려고 시도합니다.

레코드를 검색할 수 없는 경우 결과는 마지막 레코드 뒤에 위치하며 false가 반환됩니다. 레코드가 성공적으로 검색되면 참이 반환됩니다.

previous(), first(), last(), seek(), at(), isActive(), isValid()도 참조하세요 .

bool QSqlQuery::nextResult()

현재 결과 집합을 삭제하고 가능한 경우 다음 결과 집합으로 이동합니다.

일부 데이터베이스는 저장 프로시저 또는 SQL 일괄 처리(여러 문을 포함하는 쿼리 문자열)에 대해 여러 결과 집합을 반환할 수 있습니다. 쿼리를 실행한 후 여러 결과 집합을 사용할 수 있는 경우 이 함수를 사용하여 다음 결과 집합으로 이동할 수 있습니다.

새 결과 집합을 사용할 수 있는 경우 이 함수는 참을 반환합니다. 쿼리는 새 결과 집합의 유효하지 않은 레코드에서 위치가 변경되며 데이터 값을 검색하기 전에 유효한 레코드로 이동해야 합니다. 새 결과 집합을 사용할 수 없는 경우 함수는 false 을 반환하고 쿼리는 비활성으로 설정됩니다. 어떤 경우든 이전 결과 집합은 삭제됩니다.

문 중 하나가 비선택 문인 경우 결과 집합 대신 영향을 받는 행의 수를 사용할 수 있습니다.

Microsoft SQL Server와 같은 일부 데이터베이스에서는 여러 결과 집합으로 작업할 때 스크롤할 수 없는 커서가 필요하다는 점에 유의하세요. 일부 데이터베이스는 모든 문을 한 번에 실행하는 반면 다른 데이터베이스는 결과 집합에 실제로 액세스할 때까지 실행을 지연시킬 수 있으며, 일부 데이터베이스에는 SQL 일괄 처리에서 사용할 수 있는 문에 제한이 있을 수 있습니다.

QSqlDriver::hasFeature(), forwardOnly, next(), isSelect(), numRowsAffected(), isActive() 및 lastError()도 참조하세요 .

int QSqlQuery::numRowsAffected() const

결과의 SQL 문에 영향을 받는 행 수를 반환하거나 확인할 수 없는 경우 -1을 반환합니다. SELECT 문의 경우 값이 정의되지 않으므로 대신 size()을 사용하세요. 쿼리가 active 이 아닌 경우 -1이 반환됩니다.

size() 및 QSqlDriver::hasFeature()도 참조하세요 .

QSql::NumericalPrecisionPolicy QSqlQuery::numericalPrecisionPolicy() const

numericalPrecisionPolicy를 반환합니다.

참고: 숫자 정밀도 정책 프로퍼티에 대한 게터 함수입니다.

setNumericalPrecisionPolicy()도 참조하세요 .

bool QSqlQuery::prepare(const QString &query)

실행을 위해 SQL 쿼리 query 를 준비합니다. 쿼리가 성공적으로 준비되면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

쿼리에는 바인딩 값을 위한 자리 표시자가 포함될 수 있습니다. Oracle 스타일 콜론 이름(예: :surname)과 ODBC 스타일(?) 자리 표시자는 모두 지원되지만 동일한 쿼리에서 혼합할 수 없습니다. 예는 Detailed Description 을 참조하세요.

이식성 참고 사항: 일부 데이터베이스는 쿼리가 처음 실행될 때까지 쿼리 준비를 지연하도록 선택합니다. 이 경우 구문상 잘못된 쿼리 준비는 성공하지만 연속된 모든 exec()는 실패합니다. 데이터베이스가 명명된 자리 표시자를 직접 지원하지 않는 경우 자리 표시자는 [a-zA-Z0-9_] 범위의 문자만 포함할 수 있습니다.

SQLite의 경우 쿼리 문자열은 한 번에 하나의 문만 포함할 수 있습니다. 두 개 이상의 문이 주어지면 함수는 false 을 반환합니다.

예시:

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

exec(), bindValue() 및 addBindValue()도 참조하세요 .

bool QSqlQuery::previous()

가능한 경우 결과에서 이전 레코드를 검색하고 검색된 레코드에 쿼리를 배치합니다. 결과는 active 상태여야 하며 isSelect()은 이 함수를 호출하기 전에 참을 반환해야 하며, 그렇지 않으면 아무 작업도 수행하지 않고 거짓을 반환합니다.

다음 규칙이 적용됩니다:

  • 결과가 현재 첫 번째 레코드 앞에 있는 경우 변경 사항이 없으며 false가 반환됩니다.
  • 결과가 현재 마지막 레코드 뒤에 있으면 마지막 레코드를 검색하려고 시도합니다.
  • 결과가 중간 어딘가에 있으면 이전 레코드를 검색하려고 시도합니다.

레코드를 검색할 수 없는 경우 결과는 첫 번째 레코드 앞에 위치하게 되고 거짓이 반환됩니다. 레코드가 성공적으로 검색되면 참이 반환됩니다.

next(), first(), last(), seek(), at(), isActive(), isValid()도 참조하세요 .

QSqlRecord QSqlQuery::record() const

현재 쿼리에 대한 필드 정보가 포함된 QSqlRecord 을 반환합니다. 쿼리가 유효한 행을 가리키면(isValid() 참을 반환함) 레코드가 해당 행의 값으로 채워집니다. 활성 쿼리가 없는 경우 빈 레코드가 반환됩니다(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"); // "name" 필드의 인덱스동안 (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()가 참을 반환해야 합니다.

relative (기본값)이 거짓인 경우 다음 규칙이 적용됩니다:

  • index 이 음수이면 결과가 첫 번째 레코드 앞에 배치되고 거짓이 반환됩니다.
  • 그렇지 않으면 index 위치에 있는 레코드로 이동을 시도합니다. index 위치에 있는 레코드를 검색할 수 없는 경우 결과는 마지막 레코드 뒤에 배치되고 false가 반환됩니다. 레코드가 성공적으로 검색되면 참이 반환됩니다.

relative 이 참이면 다음 규칙이 적용됩니다:

  • 결과가 현재 첫 번째 레코드 앞에 위치하며:
    • index 가 음수이거나 0이면 변경 사항이 없으며 false가 반환됩니다.
    • index 가 양수이면 위의 비상대 검색과 동일한 규칙에 따라 결과를 절대 위치 index - 1에 위치시키려고 시도합니다.
  • 결과가 현재 마지막 레코드 다음에 위치하며:
    • index 가 양수이거나 0이면 변경이 없고 false가 반환됩니다.
    • index 가 음수이면 아래 규칙에 따라 결과를 마지막 레코드에서 index + 1 상대 위치에 위치시키려고 시도합니다.
  • 결과가 현재 중간 어딘가에 있고 상대 오프셋 index 이 결과를 0 아래로 이동시키면 결과는 첫 번째 레코드 앞에 배치되고 false가 반환됩니다.
  • 그렇지 않으면 현재 레코드보다 앞의 index 레코드(또는 index 가 음수인 경우 현재 레코드보다 뒤의 index 레코드)로 이동을 시도합니다. 오프셋 index 레코드를 검색할 수 없는 경우 index >= 0이면 마지막 레코드 뒤에, index 음수이면 첫 번째 레코드 앞에 위치하며 false가 반환됩니다. 레코드가 성공적으로 검색되면 true가 반환됩니다.

next(), previous(), first(), last(), at(), isActive(), isValid()도 참조하세요 .

void QSqlQuery::setForwardOnly(bool forward)

forwardOnlyforward 으로 설정합니다.

참고: forwardOnly 속성에 대한 세터 함수.

isForwardOnly(), forwardOnly, next() 및 seek()도 참조하세요 .

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

numericalPrecisionPolicyprecisionPolicy 으로 설정합니다.

참고: 속성에 대한 세터 함수 numericalPrecisionPolicy.

numericalPrecisionPolicy()도 참조하세요 .

[since 6.7] void QSqlQuery::setPositionalBindingEnabled(bool enable)

positionalBindingEnabledenable 으로 설정합니다.

참고: positionalBindingEnabled 속성에 대한 세터 함수.

이 함수는 Qt 6.7에 도입되었습니다.

isPositionalBindingEnabled() 및 positionalBindingEnabled도 참조하십시오 .

int QSqlQuery::size() const

결과의 크기(반환되는 행 수)를 반환하거나 크기를 확인할 수 없거나 데이터베이스가 쿼리 크기에 대한 보고 정보를 지원하지 않는 경우 -1을 반환합니다. SELECT 문이 아닌 경우(isSelect() 반환 false) size()는 -1을 반환합니다. 쿼리가 활성화되지 않은 경우(isActive() 반환값 false) -1이 반환됩니다.

SELECT 문이 아닌 문에 영향을 받는 행 수를 확인하려면 numRowsAffected()를 사용합니다.

isActive(), numRowsAffected() 및 QSqlDriver::hasFeature()도 참조하세요 .

[noexcept, since 6.2] void QSqlQuery::swap(QSqlQuery &other)

이 쿼리를 other 로 바꿉니다. 이 작업은 매우 빠르며 실패하지 않습니다.

이 함수는 Qt 6.2에 도입되었습니다.

QVariant QSqlQuery::value(int index) const

현재 레코드에 있는 index 필드의 값을 반환합니다.

필드는 SELECT 문의 텍스트를 사용하여 왼쪽에서 오른쪽으로 번호가 매겨집니다(예: 다음과 같이).

SELECT forename, surname FROM people;

필드 0은 forename, 필드 1은 surname 입니다. 쿼리에서 필드의 순서가 정의되지 않았으므로 SELECT * 을 사용하는 것은 권장되지 않습니다.

index 필드가 존재하지 않거나 쿼리가 비활성 상태이거나 쿼리가 잘못된 레코드에 위치하는 경우 잘못된 QVariant 가 반환됩니다.

previous(), next(), first(), last(), seek(), isActive() 및 isValid()도 참조하세요 .

QVariant QSqlQuery::value(QAnyStringView name) const

이 함수는 오버로드된 함수입니다.

현재 레코드에 있는 name 필드의 값을 반환합니다. name 필드가 존재하지 않으면 유효하지 않은 변형이 반환됩니다.

이 오버로드는 value()보다 효율성이 떨어집니다.

참고: 6.8 이전 Qt 버전에서는 이 함수가 QAnyStringView 이 아닌 QString 을 취했습니다.

[noexcept, since 6.2] QSqlQuery &QSqlQuery::operator=(QSqlQuery &&other)

Move - 이 객체에 other 를 할당합니다.

이 함수는 Qt 6.2에 도입되었습니다.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.