【Qt】数据库实战(三)
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 開發環境
- 03. 增刪改查操作
- 04. 名字綁定和位置綁定
- 05. 程序示例
- 06. 批處理操作
- 07. 事務操作
- 08. 附錄
01. 概述
Qt數據庫模型中提供名字綁定和位置綁定。
02. 開發環境
Windows系統:Windows10
Qt版本:Qt5.15或者Qt6
03. 增刪改查操作
3.1 數據庫查詢參考代碼
//數據庫查詢 QSqlQuery query; query.exec("select * from dept");while (query.next()) {//value(0) 表示第一個字段int id = query.value(0).toInt();QString name = query.value(1).toString();QString loc = query.value(2).toString();qDebug() << id << " " << name << " " << loc; }3.2 數據庫刪除參考代碼
//刪除 QSqlQuery query; query.exec("delete from dept where id = 1");3.3 數據庫更新參考代碼
//更新 QSqlQuery query; query.exec("UPDATE dept SET name = 'name' WHERE id = 3");3.4 數據庫插入參考代碼
//插入 QSqlQuery query; query.exec("INSERT INTO dept (id, name, loc) ""VALUES (1, '1name', '1loc')");【注意】 如果構造QSqlQuery的時候 指定了執行的語句, 那么不需要調用exec函數執行
錯誤代碼如下:
//如果這樣去構造一個對象 那么將會自動執行 不需要調用exec QSqlQuery query("insert into dept(id, name, loc) values(4, '4name', '4loc')"); if (query.exec()) {qDebug() << "insert into database ok"; } else {qDebug() << "insert into database faield..."; }04. 名字綁定和位置綁定
4.1 名字綁定方式一
//名字綁定 Oracle風格 QSqlQuery query; query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (:id, :name, :loc)"); //通過名字綁定值 query.bindValue(":id", 5); query.bindValue(":name", "5name"); query.bindValue(":loc", "5loc"); //執行 ok = query.exec();4.2 名字綁定方式二
//名字占位符 位置綁定 QSqlQuery query; query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (:id, :name, :loc)"); query.bindValue(0, 6); query.bindValue(1, "6name"); query.bindValue(2, "6loc"); ok = query.exec();4.3 名字綁定方式三
//名字占位符 位置綁定 QSqlQuery query; query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (:id, :name, :loc)"); //按照次序進行綁定 query.addBindValue(7); query.addBindValue("7name"); query.addBindValue("7loc"); ok = query.exec();4.4 位置綁定方式一
//位置綁定 MySQL風格 QSqlQuery query; query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (?, ?, ?)"); query.bindValue(0, 8); query.bindValue(1, "8name"); query.bindValue(2, "8loc"); query.exec();4.5 位置綁定方式二
//位置綁定 MySQL風格 QSqlQuery query; query.prepare("INSERT INTO dept (id, name, loc) ""VALUES (?, ?, ?)"); query.addBindValue(9); query.addBindValue("9name"); query.addBindValue("9loc"); query.exec();05. 程序示例
5.1 首先在設計模式往界面上添加一個Spin Box部件,如下圖所示。
5.2 將查詢按鈕槽里面的內容更改如下:
void MainWindow::on_pushButton_clicked() {QSqlQuery query;int id = ui->spinBox->value();query.exec(QString("select name from student where id = %1").arg(id));//指向第一個有效數據query.next();QString name = query.value(0).toString();qDebug() << name; }這里使用了QString類的arg()函數實現了在SQL語句中使用變量,我們運行程序,更改Spin Box的值,然后點擊查詢按鈕,效果如下圖所示。
連接到數據庫成功 "first" "second"5.3 在QSqlQuery類中提供了數據綁定同樣可以實現在SQL語句中使用變量,雖然它也是通過占位符來實現的,不過使用它形式上更明了一些。下面先來看一個例子,將查詢按鈕槽更改如下:
void MainWindow::on_pushButton_clicked() {QSqlQuery query;query.prepare("insert into student(id, name) ""values(:id, :name)");query.bindValue(0, 6);query.bindValue(1, "sixth");query.exec();//執行查詢操作query.exec("select * from student");query.last();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "id: " << id << " name: " << name; }執行結果:
連接到數據庫成功 id: 6 name: "sixth"這里在student表的最后又添加了一條記錄。然后我們先使用了prepare()函數,在其中利用了“:id”和“:name”來代替具體的數據,而后又利用bindValue()函數給id和name兩個字段賦值,這稱為綁定操作。其中編號0和1分別代表“:id”和“:name”,就是說按照prepare()函數中出現的字段從左到右編號,最左邊是0 。
5.4 位置綁定
void MainWindow::on_pushButton_clicked() {QSqlQuery query;query.prepare("insert into student(id, name) ""values(?, ?)");query.bindValue(0, 6);query.bindValue(1, "sixth");query.exec();//執行查詢操作query.exec("select * from student");query.last();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "id: " << id << " name: " << name; }也可以利用addBindValue()函數,這樣就可以省去編號,它是按順序給字段賦值的,如下:
void MainWindow::on_pushButton_clicked() {QSqlQuery query;query.prepare("insert into student(id, name) ""values(?, ?)");query.addBindValue(6);query.addBindValue("sixth");query.exec();//執行查詢操作query.exec("select * from student");query.last();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "id: " << id << " name: " << name; }當用ODBC的表示方法時,我們也可以將編號用實際的占位符代替,如下:
void MainWindow::on_pushButton_clicked() {QSqlQuery query;query.prepare("insert into student(id, name) ""values(:id, :name)");query.bindValue(":id", 6);query.bindValue(":name", "sixth");query.exec();//執行查詢操作query.exec("select * from student");query.last();int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << "id: " << id << " name: " << name; }5.5 通過綁定操作在SQL語句中使用變量。更改槽函數如下:
void MainWindow::on_pushButton_clicked() {QSqlQuery query;query.prepare("select name from student where id = ?");int id = ui->spinBox->value();query.addBindValue(id);query.exec();query.next();qDebug() << query.value(0).toString(); }執行結果
連接到數據庫成功 "third"06. 批處理操作
當要進行多條記錄的操作時,我們就可以利用綁定進行批處理。將槽更改如下:
void MainWindow::on_pushButton_clicked() {QSqlQuery query;query.prepare("insert into student values(?, ?)");QVariantList ints;ints << 10 << 11 << 12 << 13;query.addBindValue(ints);QVariantList names;names << "xiaoming" << "xiaogang" << "xiaohua" << QVariant(QVariant::String);query.addBindValue(names);if (!query.execBatch()){qDebug() << query.lastError().text();}//輸出整張表query.exec("select * from student");while(query.next()){int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << id << " " << name;}}執行結果:
連接到數據庫成功 1 "first" 2 "second" 3 "third" 4 "fourth" 5 "fifth" 10 "xiaoming" 11 "xiaogang" 12 "xiaohua" 13 ""我們在程序中利用列表存儲了同一字段的多個值,然后進行了值綁定。最后執行execBatch()函數進行批處理。注意程序中利用QVariant(QVariant::String)來輸入空值NULL,因為前面都是QString類型的,所以這里要使用QVariant::String 使格式一致化。
07. 事務操作
事務可以保證一個復雜的操作的原子性,就是對于一個數據庫操作序列,這些操作要么全部做完,要么一條也不做,它是一個不可分割的工作單位。在Qt中,如果
底層的數據庫引擎支持事務,那么QSqlDriver::hasFeature(QSqlDriver::Transactions)會返回true??梢允褂肣SqlDatabase::transaction()來啟動一個事務,然后
編寫一些希望在事務中執行的SQL語句,最后調用QSqlDatabase::commit()或者QSqlDatabase::rollback()。當使用事務時必須在創建查詢以前就開始事務。
void MainWindow::on_pushButton_clicked() {//啟動事務QSqlDatabase::database().transaction();QSqlQuery query;query.prepare("insert into student values(?, ?)");QVariantList ints;ints << 10 << 11 << 12 << 13;query.addBindValue(ints);QVariantList names;names << "xiaoming" << "xiaogang" << "xiaohua" << QVariant(QVariant::String);query.addBindValue(names);if (!query.execBatch()){qDebug() << query.lastError().text();}//輸出整張表query.exec("select * from student");while(query.next()){int id = query.value(0).toInt();QString name = query.value(1).toString();qDebug() << id << " " << name;}QSqlDatabase::database().commit(); }08. 附錄
6.1 Qt教程匯總
網址:https://dengjin.blog.csdn.net/article/details/115174639
6.2 源碼下載
網址:【Qt】數據庫實戰(三).rar
總結
以上是生活随笔為你收集整理的【Qt】数据库实战(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】数据库实战(二)
- 下一篇: 【Qt】数据库实战之QSqlQueryM