Qt Version 5.14.0
QSqlQuery類提供執行SQL語句的接口,並且能夠訪問執行結果數據集。
執行一次查詢
想要執行SQL語句,只需要創建一個QSqlQuery對象,然后調用它的exec函數,如下代碼。(這里構造QSqlQuery對象時沒有指定數據庫鏈接名稱)
QSqlQuery query;
bool flag = query.exec("SELECT name, salary FROM employee WHERE salary > 50000");
if(false == flag)
{
qDebug() << query.lastError();
}
訪問結果數據集
QSqlQuery提供的接口每次只能訪問結果集中的一條記錄,在執行完exec()函數后,QSqlQuery對象的內部指針位於結果集第一條數據之前,調用next()函數訪問第一條結果集,然后再不斷調用next()函數訪問剩余所有數據,示例代碼如下:
while (query.next()) {
QString name = query.value(0).toString();
int salary = query.value(1).toInt();
qDebug() << name << salary;
}
QSqlQuery::value()函數用於從一條記錄中讀取某個特定字段的數據。字段由索引指定(從0開始),value()函數的返回值是QVariant類型的,這個類型可以保存所有C++和Qt Core中定義的類型。不同數據庫的數據類型會自動映射到Qt支持的對應類型,之后可以調用toInt()、toString()等函數將其轉換為具體的數據。Qt具體支持的各個數據庫的數據類型,詳見Qt助手關鍵詞: Data Types for Qt-supported Database Systems。
訪問結果數據集可以使用的QSqlQuery接口有:
- next()
- previous()
- first()
- last()
- seek()
當前位置的索引可以通過at()獲取,結果集總行數使用size()函數獲取(如果該數據庫支持此接口)。
一個數據庫驅動是否支持某個特性該如何判斷,可以使用hasFeature()函數。
在你瀏覽結果集數據時,如果只使用next()和seek()函數,則可以在調用exec()之前,調用setForwardOnly(true)來提高效率。
插入、更新和刪除
QSqlQuery::exec()可以執行任意SQL語句,如果你想一次插入很多條數據,可以使用占位符來提高效率(這樣可以自動將各個數據類型轉換為QString類型,簡化SQL語句字符串的構建過程)。
Qt支持兩種類型的占位符:名字綁定 和 位置綁定。
名字綁定示例代碼如下:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (:id, :name, :salary)");
query.bindValue(":id", 1001);
query.bindValue(":name", "Thad Beaumont");
query.bindValue(":salary", 65000);
query.exec();
位置綁定示例代碼如下:
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Thad Beaumont");
query.addBindValue(65000);
query.exec();
Qt提供的所有數據庫驅動都支持這兩種綁定方式。如果數據庫原生支持這種句法,Qt會直接將這個query傳給DBMS,否則會對其進行預處理。實際執行的query可以調用executedQuery()來獲得。
更新和刪除類似。
事務
事務可以保證一個復雜的操作是原子的,即要么都執行,要么都不執行。 如果數據庫支持事務,QSqlDriver::hasFeature(QSqlDriver::Transactions)會返回true。
使用事務的步驟如下:
- 初始化事務( QSqlDatabase::transaction())
- 執行query
- 執行成功則提交事務(commit()),執行失敗則回滾(rollback())
============================================================================================================
qt之QSqlQuery
QSqlQuery提供了一個執行和查詢的狀態,該類封裝了函數提取和檢索數據的功能,它可以被用做數據操作
語句,列出select insert update selete ,也介意作為數據定義語句,列如create table
成功執行sql語句 isActive會返回true,否則返回false,
通過導出記錄執行以下語句
· next()
· previous()
· first()
· last()
· seek()
游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制
這些函數允許程序設計者去向前向后移動在記錄中
For example:
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
}
參數化查詢
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();
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Bart");
query.addBindValue("Simpson");
query.exec();
QSqlQuery::QSqlQuery(QSqlResult *result)
根據結果集構造一個QSqlQuery對象
QSqlQuery::QSqlQuery(QSqlDatabase db)
根據數據庫得到一個QSqlQuery對象
void QSqlQuery::addBindValue(const QVariant &val, QSql::ParamType paramType = QSql::In)
參數化查詢的時候,調用該函數,
返回當前內部查詢的位置,該位置是以0開始。
void QSqlQuery::bindValue(int pos, const QVariant &val, QSql::ParamType paramType = QSql::In)
構建參數。
清除結果集,並釋放資源
bool QSqlQuery::exec(const QString &query)
執行查詢
執行一個已經准備好的查詢。
QString QSqlQuery::executedQuery() const
返回最后一次查詢的字符串。
int QSqlQuery::numRowsAffected() const
返回影響的函數
bool QSqlQuery::prepare(const QString &query)
構建准備查詢語句
在結構集中返回上一個結果集。
const QSqlResult *QSqlQuery::result() const
返回結果集
void QSqlQuery::setForwardOnly(bool forward)
設置向前查詢
返回結果集的大小
QVariant QSqlQuery::value(int index) const
返回值
QVariant QSqlQuery::value(const QString &name) const
根據字段名返回值。
============================================================================================================