日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【Qt】数据库实战(三)

發布時間:2024/4/24 数据库 79 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【Qt】数据库实战(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。