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

歡迎訪問 生活随笔!

生活随笔

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

数据库

【Qt】数据库实战(二)

發布時間:2024/4/24 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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】数据库实战(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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