Qt連接數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作
數(shù)據(jù)庫
數(shù)據(jù)庫基本概念
數(shù)據(jù)(Data)
能夠輸入計(jì)算機(jī)并能被計(jì)算機(jī)程序識別和處理的信息集合數(shù)據(jù)庫 (Database)
數(shù)據(jù)庫是在數(shù)據(jù)庫管理系統(tǒng)管理和控制之下,存放在存儲介質(zhì)上的數(shù)據(jù)集合
常用的數(shù)據(jù)庫
1)大型數(shù)據(jù)庫Oracle公司是最早開發(fā)關(guān)系數(shù)據(jù)庫的廠商之一,其產(chǎn)品支持最廣泛的操作系統(tǒng)平臺。目前Oracle關(guān)系數(shù)據(jù)庫產(chǎn)品的市場占有率名列前茅。IBM 的DB2是第一個具備網(wǎng)上功能的多媒體關(guān)系數(shù)據(jù)庫管理系統(tǒng),支持包Linux在內(nèi)的一系列平臺。中型數(shù)據(jù)庫Server是微軟開發(fā)的數(shù)據(jù)庫產(chǎn)品,主要支持windows平臺。
2)小型數(shù)據(jù)庫mySQL是一個小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),開發(fā)者為瑞典MySQL AB公司,2008年被Sun公司收購,開放源碼。
3)基于嵌入式的數(shù)據(jù)庫
基于嵌入式Linux的數(shù)據(jù)庫主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是關(guān)系型數(shù)據(jù)庫,功能強(qiáng)大,支持存儲過程、SQL兼容等SQLite關(guān)系型數(shù)據(jù)庫,體積小,支持ACID事務(wù)Berkeley DB中并沒有數(shù)據(jù)庫服務(wù)器的概念,它的程序庫直接鏈接到應(yīng)用程序中 eXtremeDB是內(nèi)存數(shù)據(jù)庫,運(yùn)行效率高
SQLite3基礎(chǔ)
SQLite的源代碼是C,其源代碼完全開放。SQLite第一個Alpha版本誕生于2000年5月。 他是一個輕量級的嵌入式數(shù)據(jù)庫。
SQLite特性:
- 零配置一無需安裝和管理配置;
- 儲存在單一磁盤文件中的一個完整的數(shù)據(jù)庫;
- 數(shù)據(jù)庫文件可以在不同字節(jié)順序的機(jī)器間自由共享;
- 支持?jǐn)?shù)據(jù)庫大小至2TB;
- 足夠小,全部源碼大致3萬行c代碼,250KB;
- 比目前流行的大多數(shù)數(shù)據(jù)庫對數(shù)據(jù)的操作要快;
QT連接數(shù)據(jù)庫
1.1 QT將數(shù)據(jù)庫分為三個層次
1> 數(shù)據(jù)庫驅(qū)動層:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin
2> sql接口層:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError
3> 用戶接口層:提供一些模型QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel
1.2 實(shí)現(xiàn)數(shù)據(jù)庫操作的相關(guān)方法
1、添加數(shù)據(jù)庫:
[static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String(defaultConnection))
QSQLITE
SQLite version 3 or above
2、設(shè)置數(shù)據(jù)庫名稱:void QSqlDatabase::setDatabaseName(const QString &name)
3、包含數(shù)據(jù)庫:bool QSqlDatabase::contains(const QString &connectionName = QLatin1String(defaultConnection))
4、打開數(shù)據(jù)庫:bool QSqlDriver::open(const QString &db)
5、關(guān)閉數(shù)據(jù)庫:void QSqlDatabase::close()
6、錯誤信息:QSqlError QSqlDatabase::lastError()
7、sql語句執(zhí)行:構(gòu)造一個QSqlQuery類對象,調(diào)用其成員函數(shù)exec,執(zhí)行sql語句:bool QSqlQuery::exec(const QString &query)
8、bool QSqlQuery::next():遍歷查詢結(jié)果的函數(shù)
sql語句(常用)
本項(xiàng)目使用sqlite3,不區(qū)分大小寫
1)創(chuàng)建表格
create table 表名 (字段名 數(shù)據(jù)類型, 字段名 數(shù)據(jù)類型);
create table if not exists 表名 (字段名 數(shù)據(jù)類型, 字段名 數(shù)據(jù)類型);
?
eg:
CREATE TABLE stu (id int, name char, score float);
CREATE TABLE if not exists stu1 (id int, name char, score float);注意:數(shù)據(jù)庫不支持嚴(yán)格的數(shù)據(jù)類型檢查,數(shù)據(jù)類型寫錯了,創(chuàng)建是能夠成功的,不會有錯誤提示;
2)刪除表格
drop table 表名;
?
eg:
drop table stu1;3)插入記錄
字符串類型可以使用單引號,也可以使用雙引號
1) 全字段插入
insert into 表名 values (數(shù)據(jù)1, 數(shù)據(jù)2, 數(shù)據(jù)3);
eg:
INSERT INTO stu VALUES (2, 'ls', 99);
INSERT INTO stu VALUES (1, "zs", 59);注意:
1.數(shù)據(jù)輸入的順序要與創(chuàng)建時候字段的順序一致;
2) 部分字段插入
insert into 表名 (字段名1, 字段名2) values (數(shù)據(jù)1, 數(shù)據(jù)2);
eg:
INSERT INTO stu (id, name) values (9, 'ww');注意:
1.數(shù)據(jù)的順序要與指定的字段名1,字段名2對應(yīng);
4)查看記錄
--.header on 打開表頭
--.mode column 對齊
--在終端輸入shell指令:sqlitebrowser sq.db 圖形化界面
?
--1) 查看所有記錄
select * from 表名;
-- eg:
SELECT * FROM stu;
--2) 查看某幾行
select * from 表名 where 限制條件;
邏輯與 and 邏輯或 or
-- eg:
SELECT * FROM stu WHERE id<3 AND score>90;
SELECT * FROM stu WHERE id<2 OR id>3;
--3) 查看某幾列
select 字段1, 字段2 from 表名;
select 字段1, 字段2 from 表名 where 限制條件;
-- eg:
SELECT id, name FROM stu;
SELECT id, name FROM stu WHERE score>90;5)修改記錄
update 表名 set 字段=數(shù)值 where 限制條件;
?
eg:
UPDATE stu SET score=60 WHERE id=1;6)刪除記錄
delete from 表名 where 限制條件;
?
eg:
DELETE FROM stu WHERE id=1;
delete from stu; 刪除表格中的所有數(shù)據(jù);7)主鍵(primary key)
primary key 主鍵;
create table 表名(字段名 數(shù)據(jù)類型 primary key, 字段名 數(shù)據(jù)類型);
primary key主鍵:唯一標(biāo)識表格中的每一條記錄;
例如:id字段為主鍵,當(dāng)表格中有id==1的記錄時,不允許再插入id為1的記錄了;
--eg:
CREATE TABLE stu (id int PRIMARY KEY, name char, score float);
?
--注意:主鍵的值必須唯一。每一張表格都應(yīng)該設(shè)置一個主鍵,而且只能設(shè)置一個。8)拷貝
--從a中拷貝所有數(shù)據(jù)到b中:
create table b as select * from a;
--從a中拷貝指定字段到b中:
create table b as select 字段,字段,字段 from a;
?
CREATE TABLE stu1 AS SELECT * FROM stu;
CREATE TABLE stu2 AS SELECT id, name, score FROM stu;9)增加列
alter table 表名 add column 字段名 數(shù)據(jù)類型;
alter table stu add column score int;10)修改表名
alter table 舊表名 rename to 新表名; alter table stu rename to stuinfo;
11)修改字段名(列名)
--不支持直接修改列名
--1.將表重新命名(a改成b)
alter table stuinfo rename to stu;
--2.新建修改名字后的表(新建一個a)
create table stuinfo (name char, age1 int, sex char, score int);
--3.從舊表b中取出數(shù)據(jù),插入到新表a中;
insert into stuinfo select * from stu;12)刪除列
--不支持直接刪除列;
--1.創(chuàng)建一個新表b,并復(fù)制舊表a需要保留的字段信息;
create table stu as select name, age1, sex from stuinfo;
--2.刪除舊表a;
drop table stuinfo;
--3.修改新表b的名字a;
alter table stu rename to stuinfo;通過數(shù)據(jù)庫實(shí)現(xiàn)簡易的學(xué)生管理系統(tǒng)
ui界面

配置文件

頭文件 (.h文件)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlDatabase> //數(shù)據(jù)庫類
#include <QSqlQuery> //執(zhí)行sql語句對應(yīng)的類
#include <QSqlRecord> //記錄類
#include <QMessageBox> //消息對話框類
#include <QDebug>
#include <QSqlError>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_loginButton_clicked();
void on_showButton_clicked();
void on_findButton_clicked();
void on_deleButton_clicked();
void deletelist(); //清空內(nèi)容函數(shù)
private:
Ui::Widget *ui;
//定義一個數(shù)據(jù)庫對象
QSqlDatabase db;
};
#endif // WIDGET_H源文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//判斷數(shù)據(jù)庫對象是否包含了自己使用的數(shù)據(jù)庫 Student.db
//如果沒有這個數(shù)據(jù)庫就需要添加一個數(shù)據(jù)庫
if(!db.contains("Student.db"))
{
//添加一個數(shù)據(jù)庫
//函數(shù)原型: static QSqlDatabase addDatabase(QSqlDriver* driver);
//參數(shù):數(shù)據(jù)庫的版本
//返回值:添加的數(shù)據(jù)庫
db = QSqlDatabase::addDatabase("QSQLITE"); //表明用的是sqlite3及以上版本的數(shù)據(jù)庫
//給數(shù)據(jù)庫命名
db.setDatabaseName("Student.db");
}
//打開數(shù)據(jù)庫
if(!db.open())
{
QMessageBox::information(this, "提示", "數(shù)據(jù)庫打開失敗");
return;
}
//此時說明數(shù)據(jù)庫已經(jīng)創(chuàng)建出來并打開了,就可以創(chuàng)建數(shù)據(jù)表了
//創(chuàng)建數(shù)據(jù)表需要使用sql語句,需要使用QSQLQuerry類對象來完成
//準(zhǔn)備sql語句
QString sql = "create table if not exists myTable("
"number integer primary key autoincrement," //序號自增
"id integer," //學(xué)號,是整形
"name varchar(10)," //學(xué)生姓名
"score integer," //成績
"sex varchar(4))"; //性別
//定義語句執(zhí)行者
QSqlQuery querry;
//使用querry執(zhí)行sql語句
if(!querry.exec(sql))
{
QMessageBox::information(this, "失敗", "創(chuàng)建表失敗");
}else
{
QMessageBox::information(this, "成功", "創(chuàng)建表成功");
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::deletelist()
{
ui->idEDIT->clear();
ui->nameEdit->clear();
ui->sexEdit->clear();
ui->scoreEdit->clear();
ui->tableWidget->clear();
}
//錄入按鈕對應(yīng)的槽函數(shù)
void Widget::on_loginButton_clicked()
{
//獲取ui界面中要存入數(shù)據(jù)庫的字符串
int ui_id = ui->idEDIT->text().toInt(); //獲取ui界面的學(xué)號
QString ui_name = ui->nameEdit->text(); //獲取ui界面上的姓名
int ui_score = ui->scoreEdit->text().toInt(); //獲取ui界面上的成績
QString ui_sex = ui->sexEdit->text(); //獲取ui界面上的性別
if(ui_id==0 || ui_name.isEmpty() || ui_score==0 || ui_sex.isEmpty())
{
QMessageBox::information(this,"提示","請將學(xué)生信息填寫完整");
return;
}
//準(zhǔn)備sql語句
QString sql = QString("insert into myTable(id,name,score,sex)"
"values(%1, \"%2\", %3, \"%4\")"
).arg(ui_id).arg(ui_name).arg(ui_score).arg(ui_sex);
//定義語句執(zhí)行者
QSqlQuery querry;
//使用querry執(zhí)行sql語句
if(!querry.exec(sql))
{
QMessageBox::information(this, "失敗", "錄入失敗");
}else
{
QMessageBox::information(this, "成功", "錄入成功");
deletelist();
}
}
//展示按鈕對應(yīng)的槽函數(shù)
void Widget::on_showButton_clicked()
{
deletelist();
//準(zhǔn)備sql語句
QString sql = "select * from myTable";
//定義語句執(zhí)行者
QSqlQuery querry;
//使用querry執(zhí)行sql語句
if(!querry.exec(sql))
{
QMessageBox::information(this, "失敗", "展示失敗");
return;
}
//此時,將查找到的所有結(jié)果,全都放在querry對象中了
//可以通過next函數(shù)不斷遍歷查詢到的結(jié)果
//querry.next()有數(shù)據(jù)為真,否則為假
int i = 0; //用來記錄行號
while(querry.next()) //代表行
{
//遍歷的就是任意一組記錄:queery.record
// qDebug() << querry.record(); //所有數(shù)據(jù)輸出
//要找到每條記錄中的每個使用數(shù)據(jù)
//qDebug() << querry.record().value(2); //把第二列的數(shù)據(jù)輸出
//querry.record().value(2).toString(); //將記錄的某一項(xiàng)的數(shù)據(jù)轉(zhuǎn)變成字符串
//獲取從數(shù)據(jù)庫中查詢到的有幾列 //數(shù)據(jù)項(xiàng)的個數(shù)
//querry.record().count(); //返回當(dāng)前記錄對應(yīng)數(shù)據(jù)項(xiàng)的個數(shù)
//將數(shù)據(jù)庫中的表格展示到ui界面
//要傳參行和列還要一個QTableWidgetItem的指針
//ui->tableWidget->setItem()
for(int j=0; j<querry.record().count()-1; j++)
{
ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));
}
i++; //進(jìn)行下一行
}
}
//查找按鈕對應(yīng)的槽函數(shù)
void Widget::on_findButton_clicked()
{
QString sql = QString("SELECT * FROM myTable WHERE id=%1").arg(ui->idEDIT->text().toInt());
//qDebug() << sql;
QSqlQuery querry;
//使用querry執(zhí)行sql語句
if(!querry.exec(sql))
{
//qDebug() << querry.lastError();
QMessageBox::information(this, "失敗", "查找失敗");
return;
}
deletelist();
//此時,將查找到的所有結(jié)果,全都放在querry對象中了
//可以通過next函數(shù)不斷遍歷查詢到的結(jié)果
//querry.next()有數(shù)據(jù)為真,否則為假
int i = 0; //用來記錄行號
while(querry.next()) //代表行
{
for(int j=0; j<querry.record().count()-1; j++)
{
ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));
}
i++; //進(jìn)行下一行
}
}
//刪除按鈕對應(yīng)的槽函數(shù)
void Widget::on_deleButton_clicked()
{
QString sql = QString("DELETE FROM myTable WHERE id=%1").arg(ui->idEDIT->text().toInt());
//qDebug() << sql;
QSqlQuery querry;
//使用querry執(zhí)行sql語句
if(!querry.exec(sql))
{
//qDebug() << querry.lastError();
QMessageBox::information(this, "失敗", "刪除失敗");
return;
}else
{
QMessageBox::information(this, "成功", "刪除成功");
deletelist();
}
}
main.cpp文件
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}實(shí)現(xiàn)效果:

以上就是Qt連接數(shù)據(jù)庫并實(shí)現(xiàn)增刪改查操作的詳細(xì)內(nèi)容,更多關(guān)于Qt連接數(shù)據(jù)庫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vs2019創(chuàng)建WebService服務(wù)的實(shí)現(xiàn)
這篇文章主要介紹了vs2019創(chuàng)建WebService服務(wù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
關(guān)于數(shù)據(jù)結(jié)構(gòu)單向鏈表的各種操作
這篇文章主要介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)單向鏈表的各種操作,關(guān)于數(shù)據(jù)結(jié)構(gòu)鏈表的操作一般涉及的就是增刪改查,下面將關(guān)于無空頭鏈表展開介紹,需要的朋友可以參考下2023-04-04
使用VS2010創(chuàng)建MFC ActiveX工程項(xiàng)目
VS2010開發(fā)ActiveX有兩種方法,分別是MFC和ATL。MFC開過起來比較簡單,但是最終生成的文件比較大,ATL是專門用來開發(fā)ActiveX的,但是相對比較難,必須知道很多原理機(jī)制和API。咱先從MFC開發(fā)ActiveX開始吧。2015-06-06
C++?ncnn模型驗(yàn)證精度實(shí)現(xiàn)代碼
這篇文章主要介紹了C++?ncnn模型驗(yàn)證精度實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
詳解C++標(biāo)準(zhǔn)庫中處理正則表達(dá)式的類std::regex
std?是?C++?標(biāo)準(zhǔn)庫的命名空間,包含了大量標(biāo)準(zhǔn)的?C++?類、函數(shù)和對象,這些類和函數(shù)提供了廣泛的功能,包括輸入輸出、容器、算法、字符串處理等,這篇文章主要介紹了C++標(biāo)準(zhǔn)庫中提供的用于處理正則表達(dá)式的類std::regex,需要的朋友可以參考下2024-03-03
C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼
本文主要介紹了C語言實(shí)現(xiàn)內(nèi)存函數(shù)的示例代碼,包括memcpy、memmove、memset和memcmp的使用,具有一定的參考價值,感興趣的可以了解一下2025-02-02
C++實(shí)現(xiàn)假裝藍(lán)屏整蠱小程序
因?yàn)楣ぷ鞯男枰袝r候我們離開時并不想讓別人看到我們電腦的內(nèi)容,所以本文為大家分享了一個基于C++實(shí)現(xiàn)的假裝藍(lán)屏的小程序,需要的可以參考下2023-06-06

