Qt 數據庫操作(Sqlite)

數據庫簡介

關于數據庫的基礎知識這里就不做介紹了,相關博客可以查看:

SQL基礎知識

數據庫學霸筆記

上面博客都寫的比較詳細,本文主要介紹如何使用Qt進行數據庫相關操作,數據庫分為關系型數據庫和非關系型數據,關系型數據庫主要有Sqlite、MySQL、Oracle、SQLServer、PostgreSQL等,非關系型數據庫主要有Redis、Cassandra、MongoDB等。這次主要介紹Qt使用SQlite數據庫。

基礎SQL操作

Qt使用數據庫工程文件記得引入sql模塊:

QT  += sql

數據庫初始化:

    //查看支持的數據庫驅動for (const QString &driver : QSqlDatabase::drivers()) {qDebug() << driver;}//建立數據庫連接m_Db = QSqlDatabase::addDatabase("QSQLITE");//設置本地數據庫文件m_Db.setDatabaseName("test.db");//打開數據庫if (!m_Db.open()) { qDebug() << "open db fail"; }//創建表QString execSql =QString("create table if not exists testinfo(name varchar(64),id ""varchar(64),createdate varchar(64))");//遍歷輸出該數據庫中所有表名for (const QString &table : m_Db.tables()) { qDebug() << table; }QSqlQuery query;if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }

上述代碼中先查看數據庫驅動,數據庫驅動是應用程序和數據庫之間的橋梁,提供訪問數據庫所需的工具和 API(應用程序編程接口)。查看程序輸出打印:

Qt默認支持一些驅動,可以看到有SQlite,但是沒有MySQL,如若要用Qt進行MySQL相關數據庫操作則需額外安裝相關驅動(本文不作介紹)。然后查看生成了對應的數據庫文件test.db。

如何查看這個數據庫文件了,我推薦使用DB browser for SQLite,使用比較簡單,使用該軟件打開對應數據庫文件:

可以看到我們在代碼中創建的表,點擊"瀏覽數據":

數據庫表數據相關操作,無非增刪查改四種,界面添加對應按鈕,編寫對應槽函數代碼。

增:

void MainWindow::on_insert_clicked() {if (ui->name->text().isEmpty() || ui->id->text().isEmpty()) { return; }if (!m_Db.isOpen()) { return; }QString name = ui->name->text().trimmed();QString id = ui->id->text().trimmed();QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");QString execSql = QString("insert into testinfo (name,id, createdate) ""values('%1', '%2', '%3')").arg(name).arg(id).arg(date);QSqlQuery query;if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

輸入數據點擊添加按鈕:

查看數據表內容:

?可以看到一條數據已經成功添加。

刪:

void MainWindow::on_delete_2_clicked() {if (ui->name->text().isEmpty()) { return; }if (!m_Db.isOpen()) { return; }QString name = ui->name->text().trimmed();QString execSql =QString("delete from testinfo where name = '%1';").arg(name);QSqlQuery query;if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

我在數據庫中添加了一條數據,然后點擊按鈕刪除對應指定name的數據

點擊按鈕后數據已刪除:

?查:

void MainWindow::on_select_clicked() {QString name = ui->name->text();QString id = ui->id->text();QString execSql = QString();if (name.isEmpty() && id.isEmpty()) {execSql = QString("select * from testinfo");} else if (!name.isEmpty() && id.isEmpty()) {execSql = QString("select * from testinfo where name = '%1'").arg(name);} else if (name.isEmpty() && !id.isEmpty()) {execSql = QString("select * from testinfo where id = '%1'").arg(id);} else {execSql =QString("select * from testinfo where name = '%1' and id = '%2'").arg(name).arg(id);}QSqlQuery query;if (!query.exec(execSql)) {qDebug() << query.lastError().text();} else {while (query.next()) {QSqlRecord rec = query.record(); //獲取列QStringList vals;for (int i = 0; i < rec.count(); ++i) {vals.append(rec.value(i).toString());}ui->textEdit->append(vals.join(","));}}
}

執行效果不作演示。(select的where用法比較多,詳細可以查看文章開頭推薦的第一篇博客)

改:

void MainWindow::on_update_clicked() {//修改指定name的id值if (ui->name->text().isEmpty() || ui->id->text().isEmpty()) { return; }if (!m_Db.isOpen()) { return; }QString name = ui->name->text().trimmed();QString id = ui->id->text().trimmed();QString execSql = QString("update testinfo set id = '%1' where name = '%2'").arg(id).arg(name);QSqlQuery query;if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

根據界面輸入的name和id,將指定name的數據id改為指定值:

額外補充:刪除表為:drop+表名,該操作會將表中所有數據以及表結果刪除,如果只是想刪除所有數據則為: truncate+表名。

事務

事務是一組操作的集合,這些操作被視為一個單一的工作單元。事務要么完成所有操作,要么取消所有操作,保持數據庫在良好的狀態下。

比如我現在要一次性插入多條數據,用事務如下編寫:

void MainWindow::on_test_clicked() {//使用事務添加100條數據QStringList sqlList;for (int i = 0; i < 100; ++i) {QString execSql = QString("insert into testinfo (name,id, createdate) ""values('%1', '%2', '%3')").arg(i).arg(i).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));sqlList.append(execSql);}if (!m_Db.isOpen()) { return; }m_Db.transaction(); //開啟事務for (const QString &execSql : sqlList) {QSqlQuery query(m_Db);bool b = query.exec(execSql);if (!b) {m_Db.rollback(); //失敗進行回滾return;}}m_Db.commit(); //事務提交
}

點擊按鈕后查看數據內容:

?

內容已添加。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72136.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72136.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72136.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡安全 api 網絡安全 ast技術

隨著應用或者API被攻擊利用已經越來越多&#xff0c;雖然來自開源組件的漏洞加劇了這一現象的發生&#xff0c;但是&#xff0c;其實主要還是在于應用程序或者API本身沒有做好防范&#xff0c;根源在于源代碼本身的質量沒有嚴格把控。AST是指Application Security Testing&…

Mac 配置 Maven JDK

不使用 Homebrew&#xff0c;創建指定版本 JDK 1、官網下載指定版本并安裝……省略 2、vi &#xff5e;/.zshrc 同時要檢查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

【每日學點HarmonyOS Next知識】拖拽調整列表順序、tab回彈、自定義彈窗this、狀態變量修飾枚舉

1、HarmonyOS 功能實現&#xff08;拖拽調整列表順序&#xff09;&#xff1f; 可參考&#xff1a; import curves from ohos.curves; import Curves from ohos.curvesEntry Component struct ListItemExample {State private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]…

Django部署Filemanagement

Pycharm搭建項目安裝虛擬環境 mysqlclient對mysql的安裝&#xff0c;配置有要求 pymsql偽裝成mysqlclient&#xff0c;pymysql可以操縱mysql pip install pymysql操作sql5.7 mysql8.0會出現與pycharm不兼容問題&#xff0c;會報錯&#xff0c;所以降到5.7 # 進入mysql 需要…

【病毒分析】熊貓燒香病毒分析及其查殺修復

目錄 前言 一、樣本概況 1.1 樣本信息 1.2 測試環境及工具 1.3 分析目標 二、具體行為分析 2.1 主要行為 2.1.1 惡意程序對用戶造成的危害 2.2 惡意代碼分析 2.2.1 加固后的惡意代碼樹結構圖(是否有加固) 2.2.2 惡意程序的代碼分析片段 三、解決方案(或總結) 3.1 …

Spring Boot集成Spring Statemachine

Spring Statemachine 是 Spring 框架下的一個模塊&#xff0c;用于簡化狀態機的創建和管理&#xff0c;它允許開發者使用 Spring 的特性&#xff08;如依賴注入、AOP 等&#xff09;來構建復雜的狀態機應用。以下是關于 Spring Statemachine 的詳細介紹&#xff1a; 主要特性 …

數組總和 (leetcode 40

leetcode系列 文章目錄 一、核心操作二、外層配合操作三、核心模式代碼總結 去重方式和之前三數之和一樣&#xff0c;也可以用used數組去重&#xff0c;但本次嘗試使用set去重 一、核心操作 如果count為0了&#xff0c;則證明正好減到了0&#xff0c;就可以收獲&#xff0c;…

sqli-lab靶場學習(八)——Less26-28

前言 25關已經出現了初步的一些關鍵字過濾&#xff0c;通過雙寫可以繞過。后面的關卡&#xff0c;我們會遇到更多關鍵字過濾&#xff0c;需要各種技巧繞過。 Less26 第26關寫了會過濾空格和注釋符。有很多的答案&#xff0c;會用%a0替代空格&#xff0c;但據說這是sqli-labs部…

python:VOC格式數據集轉換為YOLO數據集格式

作者&#xff1a;CSDN _養樂多_ 本文將介紹如何將目標檢測中常用的VOC格式數據集轉換為YOLO數據集&#xff0c;并進行數據集比例劃分&#xff0c;從而方便的進行YOLO目標檢測。 如果不想分兩步&#xff0c;可以直接看第三節代碼。 文章目錄 一、將VOC格式數據集轉換為YOLO格…

Docker容器安裝軟件(完整版)

文章目錄 一、安裝Docker1.1 docker 相關的命令1.2 配置鏡像加速 二. 安裝es2.1 創建網絡2.2 拉取鏡像2.3 創建掛載點目錄2.4 部署單點es&#xff0c;創建es容器2.5 編寫elasticsearch.yml2.6 重啟es容器2.7 測試Elasticsearch是否安裝成功 三. 基于Docker安裝Kibana3.1 拉取鏡…

LINUX 指令大全

Linux服務器上有許多常用的命令&#xff0c;可以幫助你管理文件、目錄、進程、網絡和系統配置等。以下是一些常用的Linux命令&#xff1a; 文件和目錄管理 ls&#xff1a;列出當前目錄中的文件和子目錄 bash lspwd&#xff1a;顯示當前工作目錄的路徑 bash pwdcd&#xff1a;切…

燃氣對我們生活的重要性體現在哪里?

燃氣在我們的生活中有 多方面的重要性 &#xff0c;以下是燃氣對我們生活的重要性的詳細說明&#xff1a; 烹飪和熱水供應 &#xff1a; 燃氣是家庭烹飪的主要能源&#xff0c;能夠快速、高效地加熱食物&#xff0c;使家庭聚餐更加便捷和愉快。 燃氣熱水器能夠在短時間內提供…

NetAssist 5.0.14網絡助手基礎使用及自動應答使用方案

以下是NetAssist v5.0.14自動應答功能的詳細使用步驟&#xff1a; 一、基礎準備&#xff1a; 工具下載網址頁面&#xff1a;https://www.cmsoft.cn/resource/102.html 下載安裝好后&#xff0c;根據需要可以創建多個server&#xff0c;雙擊程序圖標運行即可&#xff0c;下面…

node.js-node.js作為服務器,前端使用WebSocket(單個TCP連接上進行全雙工通訊的協議)

1.WebSocket全雙工通信協議 WebSocket是HTML5開始提供的一種單個TCP連接上進行全雙工通訊的協議。讓客戶端和服務器間的數據交互變得簡單&#xff0c;允許服務端向客戶端主動推送數據。瀏覽器和服務器間只需要完成一次握手&#xff0c;兩者間創建持久性的連接&#xff0c;并進行…

java后端開發day31--集合進階(一)-----Collection集合List集合數據結構1

&#xff08;以下內容全部來自上述課程&#xff09; 1.集合體系結構 List系列集合&#xff1a;添加的元素是有序、可重復、有索引。 Set系列集合&#xff1a;添加的元素是無序、不重復、無索引。 2.Collection集合 Collection是單列集合的祖宗接口&#xff08;不可直接創建…

Qt配置OpenGL相機踩的坑

項目根據LearnOpenGL配置Qt的相機&#xff0c;更新view矩陣和project矩陣的位移向量變得很大&#xff0c;我設置的明明相機位置是(0,0,3)&#xff0c;理想的位移向量剛好是相反數(0,0,-3)&#xff0c;對應的view矩陣位置向量可以變成(0,0,1200)…離模型非常遠矩陣模型也看不見&…

【C++設計模式】第十六篇:迭代器模式(Iterator)

注意&#xff1a;復現代碼時&#xff0c;確保 VS2022 使用 C17/20 標準以支持現代特性。 遍歷聚合對象的統一方式 1. 模式定義與用途 核心思想 ?迭代器模式&#xff1a;提供一種方法順序訪問聚合對象的元素&#xff0c;而無需暴露其內部表示。關鍵用途&#xff1a; 1.?統一…

關于WPS的Excel點擊單元格打開別的文檔的兩種方法的探究【為單元格添加超鏈接】

問題需求 目錄和文件結構如下&#xff1a; E:\Dir_Level1 │ Level1.txt │ └─Dir_Level2│ Level2.txt│ master.xlsx│└─Dir_Level3Level3.txt現在要在master.xlsx點擊單元格進而訪問Level1.txt、Level2.txt、Level3.txt這些文件。 方法一&#xff1a;“單元格右鍵…

聚類中的相似矩陣和拉普拉斯矩陣

前言&#xff08;可以略過&#xff09; 最近在看的是關于聚類的論文&#xff0c;之前對聚類的步驟和相關內容不太了解&#xff0c;為了讀懂論文就去學習了一下&#xff0c;這里將自己的理解記錄下來。學習的不全面&#xff0c;主要是為了看懂論文&#xff0c;后續如果有涉及到聚…

前端筆記 --- vue框架

目錄 基礎知識 指令的修飾符 計算屬性 watch偵聽器的寫法 Vue的生命周期 工程化開發&腳手架 VUE CLI 組件注冊的方式 scoped樣式沖突與原理 data 組件之間的關系和組件通信 v-model詳解 sync修飾符 Dom介紹 操作HTML標簽 總結 ref 和 $refs $nextTick 自…