이 페이지에서

QSqlQuery Class

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

헤더: #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()`를 사용하여 데이터를 가져올 수 있습니다. 모든 데이터는 QVariant를 사용하여 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는 이를 활용합니다. 하지만 이러한 지원을 제공하지 않는 데이터베이스의 경우, 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()`라는 저장 프로시저를 호출하여, `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

바인딩되지 않은 매개변수는 원래 값을 유지한다는 점에 유의하십시오.

return 문을 사용하여 값을 반환하거나 여러 결과 집합을 반환하는 저장 프로시저는 완전히 지원되지 않습니다. 자세한 내용은 SQL 데이터베이스 드라이버를 참조하십시오.

경고: QSqlQuery를 생성하기 전에 SQL 드라이버를 로드하고 연결을 열어야합니다 . 또한 쿼리가 존재하는 동안 연결은 계속 열려 있어야 합니다. 그렇지 않으면 QSqlQuery의 동작이 정의되지 않습니다.

QSqlDatabase, QSqlQueryModel, QSqlTableModel 및 QVariant도 참조하십시오 .

멤버 유형 문서

enum QSqlQuery::BatchExecutionMode

상수값설명
QSqlQuery::ValuesAsRows0- 여러 행을 업데이트합니다. ` QVariantList `의 각 항목을 다음 행을 업데이트할 때의 값으로 취급합니다.
QSqlQuery::ValuesAsColumns1- 단일 행을 업데이트합니다. ` QVariantList `의 각 항목을 배열 유형의 단일 값으로 취급합니다.

속성 설명서

[since 6.8] forwardOnly : bool

이 속성은 ‘전진 전용(forward only)’ 모드를 지정합니다. ` forward `가 true인 경우, 결과 집합을 탐색할 때 양수 값을 가진 ` next()` 및 ` seek()`만 허용됩니다.

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

전진 전용 모드는 기본적으로 비활성화되어 있습니다.

forwardOnly를 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 설정에 따라 해당 쿼리에 대한 위치 기반 바인딩 binding 을 활성화하거나 비활성화합니다(기본값은 true 입니다). 위치 기반 바인딩을 비활성화하면 쿼리 자체에 '?'가 포함되어 있지만, 이를 위치 기반 바인딩 매개변수로 처리해서는 안 되고(예: PostgreSQL 데이터베이스의 JSON 연산자로 처리해야 하는 경우) 유용합니다.

데이터베이스에서 물음표(?)를 사용한 위치 기반 바인딩을 기본적으로 지원하는 경우에는 이 속성이 아무런 영향을 미치지 않습니다( QSqlDriver::PositionalPlaceholders 참조).

이 열거형은 Qt 6.8에서 도입되었습니다.

액세스 함수:

멤버 함수 문서

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

QSqlResult ( result )를 사용하여 데이터베이스와 통신하는 QSqlQuery 객체를 생성합니다.

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

db 데이터베이스를 사용하여 QSqlQuery 객체를 생성합니다. 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)

other 에서 QSqlQuery를 이동 생성합니다.

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

[noexcept] QSqlQuery::~QSqlQuery()

객체를 삭제하고 할당된 리소스를 모두 해제합니다.

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

위치 기반 값 바인딩을 사용할 때 값 목록에 val 값을 추가합니다. addBindValue() 호출 순서에 따라 준비된 쿼리에서 해당 값이 어느 자리표시자에 바인딩될지가 결정됩니다. paramType 가 QSql::Out 또는 QSql::InOut 인 경우, exec() 호출 후 해당 자리표시자는 데이터베이스의 데이터로 덮어쓰게 됩니다.

NULL 값을 바인딩하려면 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)

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

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

addBindValue(), prepare(), exec(), boundValue() 및 boundValues()도 참조하십시오 .

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

pos 위치에 있는 자리 표시자가 준비된 문(prepared statement) 내의 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 위치에 있는 자리 표시자의 값을 반환합니다.

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`에 네 개의 새 행을 삽입합니다:

1  Harald
2  Boris
3  Trond
4  NULL

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

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

참고: 목록 내 QVariant의유형은 변경되어서는 안 됩니다. 예를 들어, 하나의 QVariantList 내에서 정수형과 문자열형 변수를 혼합하여 사용할 수 없습니다.

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

prepare(), bindValue(), addBindValue()도 참조하십시오 .

QString QSqlQuery::executedQuery() const

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

대부분의 경우 이 함수는 ` lastQuery()`와 동일한 문자열을 반환합니다. 자리 표시자가 포함된 준비된 쿼리가 이를 지원하지 않는 DBMS에서 실행될 경우, 해당 쿼리의 준비 과정이 에뮬레이트됩니다. 원본 쿼리의 자리 표시자는 바인딩된 값으로 대체되어 새로운 쿼리가 생성됩니다. 이 함수는 수정된 쿼리를 반환합니다. 주로 디버깅 목적으로 유용합니다.

lastQuery()도 참조하십시오 .

void QSqlQuery::finish()

이 쿼리가 다시 실행될 때까지 더 이상 데이터를 가져오지 않도록 데이터베이스 드라이버에 지시합니다. 일반적으로 이 함수를 호출할 필요는 없지만, 나중에 쿼리를 재사용할 계획이라면 잠금이나 커서와 같은 리소스를 해제하는 데 도움이 될 수 있습니다.

쿼리를 비활성 상태로 설정합니다. 바인딩된 값은 기존 값을 유지합니다.

prepare(), exec(), isActive()도 참조하십시오 .

bool QSqlQuery::first()

결과에 첫 번째 레코드가 있는 경우 이를 가져오고, 쿼리 위치를 가져온 레코드로 설정합니다. 이 함수를 호출하기 전에 결과가 ‘ active ’ 상태여야 하며, ` isSelect()`가 true를 반환해야 한다는 점에 유의하십시오. 그렇지 않으면 아무 작업도 수행하지 않고 false를 반환합니다. 성공하면 ` true `를 반환합니다. 실패할 경우 쿼리 위치는 유효하지 않은 위치로 설정되고 false가 반환됩니다.

next(), previous(), last(), seek(), at(), isActive() 및 isValid()도 참조하십시오 .

bool QSqlQuery::isActive() const

쿼리가 활성 상태인 경우 ` true `를 반환합니다. 활성 QSqlQuery 란 ` exec()` 호출이 성공적으로 완료되었으나 아직 처리가 끝나지 않은 쿼리를 말합니다. 활성 쿼리의 처리가 끝나면 ` 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 `가 null인 경우 ` true `을 반환합니다. 그 외의 경우에는 ` false`을 반환합니다. 일부 드라이버의 경우, 데이터 검색 시도가 이루어지기 전까지는 `isNull()`이 정확한 정보를 반환하지 않는다는 점에 유의하십시오.

isActive(), isValid() 및 value()도 참조하십시오 .

bool QSqlQuery::isNull(QAnyStringView name) const

name 와 일치하는 필드가 없으면 true 를 반환하고, 그렇지 않으면 해당 필드 인덱스에 대해 isNull(int index)를 반환합니다.

이 오버로드는 isNull()보다 효율이 낮습니다.

참고: Qt 6.8 이전버전에서는 이 함수가 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를 반환합니다. 성공하면 true 를 반환합니다. 실패하면 쿼리 위치가 유효하지 않은 위치로 설정되고 false가 반환됩니다.

next(), previous(), first(), seek(), at(), isActive(), isValid()도 참조하십시오 .

QSqlError QSqlQuery::lastError() const

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

QSqlError 및 QSqlDatabase::lastError()도 참조하십시오 .

QVariant QSqlQuery::lastInsertId() const

데이터베이스가 이를 지원하는 경우, 가장 최근에 삽입된 행의 객체 ID를 반환합니다. 쿼리가 어떤 값도 삽입하지 않았거나 데이터베이스가 ID를 반환하지 않는 경우, 유효하지 않은 ` QVariant `가 반환됩니다. 삽입 작업으로 인해 두 개 이상의 행이 변경된 경우, 동작은 정의되지 않습니다.

MySQL 데이터베이스의 경우, 행의 자동 증가(auto-increment) 필드가 반환됩니다.

참고: PSQL에서 이 함수가작동하려면 테이블에 OID가 포함되어 있어야 하며, OID는 기본적으로 생성되지 않을 수 있습니다. 확인을 위해 default_with_oids 구성 변수를 확인하십시오.

QSqlDriver::hasFeature()도 참조하십시오 .

QString QSqlQuery::lastQuery() const

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

executedQuery()도 참조하십시오 .

bool QSqlQuery::next()

결과에 다음 레코드가 있는 경우 해당 레코드를 가져오고, 쿼리 포인터를 가져온 레코드에 위치시킵니다. 이 함수를 호출하기 전에 결과가 ‘ active ’ 상태여야 하며, ` isSelect()`가 true를 반환해야 한다는 점에 유의하십시오. 그렇지 않으면 아무 작업도 수행하지 않고 false를 반환합니다.

다음 규칙이 적용됩니다:

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

레코드를 가져올 수 없는 경우, 결과의 위치를 마지막 레코드 뒤로 이동시키고 false를 반환합니다. 레코드를 성공적으로 가져온 경우 true를 반환합니다.

previous(), first(), last(), seek(), at(), isActive() 및 isValid()도 참조하십시오 .

bool QSqlQuery::nextResult()

현재 결과 집합을 버리고, 다음 결과 집합이 있는 경우 해당 결과 집합으로 이동합니다.

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

새로운 결과 집합이 있는 경우 이 함수는 true를 반환합니다. 쿼리는 새 결과 집합의 유효하지 않은 레코드로 위치가 재설정되며, 데이터 값을 가져오기 전에 유효한 레코드로 이동해야 합니다. 새로운 결과 집합이 없는 경우, 이 함수는 ` false `를 반환하고 쿼리는 비활성 상태로 설정됩니다. 어떤 경우든 이전 결과 집합은 버려집니다.

문장 중 하나가 SELECT 문이 아닌 경우, 결과 집합 대신 영향을 받는 행의 개수가 반환될 수 있습니다.

일부 데이터베이스(예: Microsoft SQL Server)는 여러 결과 집합을 다룰 때 스크롤 불가능한 커서를 요구한다는 점에 유의하십시오. 일부 데이터베이스는 모든 문을 한 번에 실행하는 반면, 다른 데이터베이스는 결과 집합에 실제로 액세스할 때까지 실행을 지연시킬 수 있으며, 일부 데이터베이스는 SQL 배치에서 사용할 수 있는 문에 제한을 둘 수도 있습니다.

QSqlDriver::hasFeature(), 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를 반환합니다.

참고: 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()`가 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"); // "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 음수이거나 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)

forwardOnly 를 forward 로 설정합니다.

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

isForwardOnly(), forwardOnly, next() 및 seek()도 참조하십시오 .

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

numericalPrecisionPolicy 를 precisionPolicy 로 설정합니다.

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

numericalPrecisionPolicy()도 참조하십시오 .

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

positionalBindingEnabled 를 enable 로 설정합니다.

참고: 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()보다 효율이 낮습니다.

참고: Qt 6.8 이전버전에서는 이 함수가 QAnyStringView 이 아닌 QString 을 인수로 받았습니다.

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

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

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

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

© 2026 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.