【Qt】数据库实战(二)
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 開發環境
- 03. 連接到數據庫
- 04. 操作結果集
- 06. 附錄
01. 概述
SQL即結構化查詢語言,是關系數據庫的標準語言。前面已經在Qt里利用QSqlQuery類執行了SQL語句,這一節我們將詳細講解該類的使用。
02. 開發環境
Windows系統:Windows10
Qt版本:Qt5.15或者Qt6
03. 連接到數據庫
3.1 新建Qt Widgets應用,項目名稱為15SQL,基類為QMainWindow,類名為MainWindow。完成后打開15SQL.pro并添加代碼:QT += sql 然后保存該文件。
3.2 向項目中添加新文件,模板選擇C++分類中的C++ Header File,名稱為connection.h,然后打開該文件,更改如下:
#ifndef CONNECTION_H #define CONNECTION_H#include <QMessageBox> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug>static bool createConnection() {//加載驅動QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(":memory:");bool ret = db.open();if (ret){qDebug() << "連接到數據庫成功";}else{qDebug() << "連接到數據庫失敗: " << db.lastError().text();}//創建QSqlQuery對象QSqlQuery query;query.exec("create table student(id int primary key, name varchar(20))");query.exec("insert into student values(1, 'first')");query.exec("insert into student values(2, 'second')");query.exec("insert into student values(3, 'third')");query.exec("insert into student values(4, 'fourth')");query.exec("insert into student values(5, 'fifth')");return true; }#endif // CONNECTION_H頭文件中我們添加了一個建立連接的函數,使用這個頭文件的目的就是要簡化主函數中的內容。這里先創建了一個SQLite數據庫的默認連接,設置數據庫名稱時使用了“:memory:”,表明這個是建立在內存中的數據庫,也就是說該數據庫只在程序運行期間有效,等程序運行結束時就會將其銷毀。當然,大家也可以將其改為一個具體的數據庫名稱,比如“my.db”,這樣就會在項目目錄中創建該數據庫文件了。下面使用open()函數將數據庫打開,如果打開失敗,則彈出提示對話框。最后使用QSqlQuery創建了一個student表,并插入了包含id和name兩個字段的五條記錄,如下圖所示。其中,id字段是int類型的,“primary key”表明該字段是主鍵,它不能為空,而且不能有重復的值;而name字段是varchar類型的,并且不大于20個字符。這里使用的SQL語句都要包含在雙引號中,如果一行寫不完,那么分行后,每一行都要使用兩個雙引號引起來。
3.3 main.cpp中調用連接函數。
#include "mainwindow.h"#include <QApplication> #include "connection.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);if (!createConnection()){return 1;}MainWindow w;w.show();return a.exec(); }3.4 界面上添加一個按鈕來實現查詢操作。雙擊mainwindow.ui文件進入設計模式。然后將一個Push Button拖到界面上,并修改其顯示文本為“查詢”。效果如下圖所示。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lCIAuh7Y-1616661582511)(assets/image-20210325161610312.png)]
3.5 在查詢按鈕上點擊鼠標右鍵,選擇“轉到槽”,然后選擇clicked()單擊信號槽并點擊OK,并實現對應的槽函數
//查詢按鈕 void MainWindow::on_pushButton_clicked() {QSqlQuery query;query.exec("select * from student");while(query.next()){qDebug() << query.value(0).toInt()<< " " << query.value(1).toString();} }執行結果如下:
連接到數據庫成功 1 "first" 2 "second" 3 "third" 4 "fourth" 5 "fifth"04. 操作結果集
當query.exec(“select * from student”);這條語句執行完后,我們便獲得了相應的執行結果,因為獲得的結果可能不止一條記錄,所以稱之為結果集。結果集其實就是查詢到的所有記錄的集合,在QSqlQuery類中提供了多個函數來操作這個集合,需要注意這個集合中的記錄是從0開始編號的。最常用的操作有:
seek(int n) :query指向結果集的第n條記錄; first() :query指向結果集的第一條記錄; last() :query指向結果集的最后一條記錄; next() :query指向下一條記錄,每執行一次該函數,便指向相鄰的下一條記錄; previous() :query指向上一條記錄,每執行一次該函數,便指向相鄰的上一條記錄; record() :獲得現在指向的記錄; value(int n) :獲得字段的值。其中n表示你查詢的第n個字段,比如前面我們使用“select * from student”就相當于 “select id, name from student”,那么value(0)返回id字段的值,value(1)返回name字段的值。該函數返回 QVariant類型的數據,關于該類型與其他類型的對應關系,可以在幫助中查看QVariant。 at() :獲得現在query指向的記錄在結果集中的編號。【提示】
剛執行完query.exec(“select * from student”);這行代碼時,query是指向結果集以外的,我們可以利用query.next()使得query指向結果集的第一條記錄。當然我們也可以利用seek(0)函數或者first()函數使query指向結果集的第一條記錄。但是為了節省內存開銷,推薦的方法是,在query.exec(“select * from student”);這行代碼前加上query.setForwardOnly(true);這條代碼,此后只能使用next()和seek()函數。
下面我們通過例子來演示一下這些函數的使用。將槽更改如下:
void MainWindow::on_pushButton_clicked() {QSqlQuery query;query.exec("select * from student");qDebug() << "exec next()";//結果集指向第一條記錄if (query.next()){//獲取所指向的記錄在結果集中的編號int rowNum = query.at();//獲取每條記錄中字段(列)的個數int columnNum = query.record().count();//獲取name字段所在列的編號,列從左向右編號,最左邊的編號為0int fieldNo = query.record().indexOf("name");//獲取字段id的值int id = query.value(0).toInt();//獲取name字段的值QString name = query.value(fieldNo).toString();//輸出結果qDebug() << "rowNum: " << rowNum << " id: " << id<< " name: " << name << " columnNum: " << columnNum;qDebug() << "------------------------------";if (query.seek(2)){qDebug() << "rowNum: " << query.at()<< " id: " << query.value(0).toInt()<< " name: " << query.value(1).toString();}qDebug() << "------------------------------";if (query.last()){qDebug() << "rowNum: " << query.at()<< " id: " << query.value(0).toInt()<< " name: " << query.value(1).toString();}}}執行結果:
連接到數據庫成功 exec next() rowNum: 0 id: 1 name: "first" columnNum: 2 ------------------------------ rowNum: 2 id: 3 name: "third" ------------------------------ rowNum: 4 id: 5 name: "fifth"06. 附錄
6.1 Qt教程匯總
網址:https://dengjin.blog.csdn.net/article/details/115174639
6.2 源碼下載
網址:【Qt】數據庫實戰(二).rar
總結
以上是生活随笔為你收集整理的【Qt】数据库实战(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】数据库实战(一)
- 下一篇: 【Qt】数据库实战(三)