Qt連接數據庫并實現(xiàn)增刪改查操作
數據庫
數據庫基本概念
數據(Data)
能夠輸入計算機并能被計算機程序識別和處理的信息集合數據庫 (Database)
數據庫是在數據庫管理系統(tǒng)管理和控制之下,存放在存儲介質上的數據集合
常用的數據庫
1)大型數據庫Oracle公司是最早開發(fā)關系數據庫的廠商之一,其產品支持最廣泛的操作系統(tǒng)平臺。目前Oracle關系數據庫產品的市場占有率名列前茅。IBM 的DB2是第一個具備網上功能的多媒體關系數據庫管理系統(tǒng),支持包Linux在內的一系列平臺。中型數據庫Server是微軟開發(fā)的數據庫產品,主要支持windows平臺。
2)小型數據庫mySQL是一個小型關系型數據庫管理系統(tǒng),開發(fā)者為瑞典MySQL AB公司,2008年被Sun公司收購,開放源碼。
3)基于嵌入式的數據庫
基于嵌入式Linux的數據庫主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是關系型數據庫,功能強大,支持存儲過程、SQL兼容等SQLite關系型數據庫,體積小,支持ACID事務Berkeley DB中并沒有數據庫服務器的概念,它的程序庫直接鏈接到應用程序中 eXtremeDB是內存數據庫,運行效率高
SQLite3基礎
SQLite的源代碼是C,其源代碼完全開放。SQLite第一個Alpha版本誕生于2000年5月。 他是一個輕量級的嵌入式數據庫。
SQLite特性:
- 零配置一無需安裝和管理配置;
- 儲存在單一磁盤文件中的一個完整的數據庫;
- 數據庫文件可以在不同字節(jié)順序的機器間自由共享;
- 支持數據庫大小至2TB;
- 足夠小,全部源碼大致3萬行c代碼,250KB;
- 比目前流行的大多數數據庫對數據的操作要快;
QT連接數據庫
1.1 QT將數據庫分為三個層次
1> 數據庫驅動層:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin
2> sql接口層:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError
3> 用戶接口層:提供一些模型QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel
1.2 實現(xiàn)數據庫操作的相關方法
1、添加數據庫:
[static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String(defaultConnection))
QSQLITE
SQLite version 3 or above
2、設置數據庫名稱:void QSqlDatabase::setDatabaseName(const QString &name)
3、包含數據庫:bool QSqlDatabase::contains(const QString &connectionName = QLatin1String(defaultConnection))
4、打開數據庫:bool QSqlDriver::open(const QString &db)
5、關閉數據庫:void QSqlDatabase::close()
6、錯誤信息:QSqlError QSqlDatabase::lastError()
7、sql語句執(zhí)行:構造一個QSqlQuery類對象,調用其成員函數exec,執(zhí)行sql語句:bool QSqlQuery::exec(const QString &query)
8、bool QSqlQuery::next():遍歷查詢結果的函數
sql語句(常用)
本項目使用sqlite3,不區(qū)分大小寫
1)創(chuàng)建表格
create table 表名 (字段名 數據類型, 字段名 數據類型); create table if not exists 表名 (字段名 數據類型, 字段名 數據類型); ? eg: CREATE TABLE stu (id int, name char, score float); CREATE TABLE if not exists stu1 (id int, name char, score float);
注意:數據庫不支持嚴格的數據類型檢查,數據類型寫錯了,創(chuàng)建是能夠成功的,不會有錯誤提示;
2)刪除表格
drop table 表名; ? eg: drop table stu1;
3)插入記錄
字符串類型可以使用單引號,也可以使用雙引號
1) 全字段插入
insert into 表名 values (數據1, 數據2, 數據3); eg: INSERT INTO stu VALUES (2, 'ls', 99); INSERT INTO stu VALUES (1, "zs", 59);
注意:
1.數據輸入的順序要與創(chuàng)建時候字段的順序一致;
2) 部分字段插入
insert into 表名 (字段名1, 字段名2) values (數據1, 數據2); eg: INSERT INTO stu (id, name) values (9, 'ww');
注意:
1.數據的順序要與指定的字段名1,字段名2對應;
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 字段=數值 where 限制條件; ? eg: UPDATE stu SET score=60 WHERE id=1;
6)刪除記錄
delete from 表名 where 限制條件; ? eg: DELETE FROM stu WHERE id=1; delete from stu; 刪除表格中的所有數據;
7)主鍵(primary key)
primary key 主鍵; create table 表名(字段名 數據類型 primary key, 字段名 數據類型); primary key主鍵:唯一標識表格中的每一條記錄; 例如:id字段為主鍵,當表格中有id==1的記錄時,不允許再插入id為1的記錄了; --eg: CREATE TABLE stu (id int PRIMARY KEY, name char, score float); ? --注意:主鍵的值必須唯一。每一張表格都應該設置一個主鍵,而且只能設置一個。
8)拷貝
--從a中拷貝所有數據到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 字段名 數據類型; 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中取出數據,插入到新表a中; insert into stuinfo select * from stu;
12)刪除列
--不支持直接刪除列; --1.創(chuàng)建一個新表b,并復制舊表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;
通過數據庫實現(xiàn)簡易的學生管理系統(tǒng)
ui界面
配置文件
頭文件 (.h文件)
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QSqlDatabase> //數據庫類 #include <QSqlQuery> //執(zhí)行sql語句對應的類 #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(); //清空內容函數 private: Ui::Widget *ui; //定義一個數據庫對象 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); //判斷數據庫對象是否包含了自己使用的數據庫 Student.db //如果沒有這個數據庫就需要添加一個數據庫 if(!db.contains("Student.db")) { //添加一個數據庫 //函數原型: static QSqlDatabase addDatabase(QSqlDriver* driver); //參數:數據庫的版本 //返回值:添加的數據庫 db = QSqlDatabase::addDatabase("QSQLITE"); //表明用的是sqlite3及以上版本的數據庫 //給數據庫命名 db.setDatabaseName("Student.db"); } //打開數據庫 if(!db.open()) { QMessageBox::information(this, "提示", "數據庫打開失敗"); return; } //此時說明數據庫已經創(chuàng)建出來并打開了,就可以創(chuàng)建數據表了 //創(chuàng)建數據表需要使用sql語句,需要使用QSQLQuerry類對象來完成 //準備sql語句 QString sql = "create table if not exists myTable(" "number integer primary key autoincrement," //序號自增 "id integer," //學號,是整形 "name varchar(10)," //學生姓名 "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(); } //錄入按鈕對應的槽函數 void Widget::on_loginButton_clicked() { //獲取ui界面中要存入數據庫的字符串 int ui_id = ui->idEDIT->text().toInt(); //獲取ui界面的學號 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,"提示","請將學生信息填寫完整"); return; } //準備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(); } } //展示按鈕對應的槽函數 void Widget::on_showButton_clicked() { deletelist(); //準備sql語句 QString sql = "select * from myTable"; //定義語句執(zhí)行者 QSqlQuery querry; //使用querry執(zhí)行sql語句 if(!querry.exec(sql)) { QMessageBox::information(this, "失敗", "展示失敗"); return; } //此時,將查找到的所有結果,全都放在querry對象中了 //可以通過next函數不斷遍歷查詢到的結果 //querry.next()有數據為真,否則為假 int i = 0; //用來記錄行號 while(querry.next()) //代表行 { //遍歷的就是任意一組記錄:queery.record // qDebug() << querry.record(); //所有數據輸出 //要找到每條記錄中的每個使用數據 //qDebug() << querry.record().value(2); //把第二列的數據輸出 //querry.record().value(2).toString(); //將記錄的某一項的數據轉變成字符串 //獲取從數據庫中查詢到的有幾列 //數據項的個數 //querry.record().count(); //返回當前記錄對應數據項的個數 //將數據庫中的表格展示到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++; //進行下一行 } } //查找按鈕對應的槽函數 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(); //此時,將查找到的所有結果,全都放在querry對象中了 //可以通過next函數不斷遍歷查詢到的結果 //querry.next()有數據為真,否則為假 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++; //進行下一行 } } //刪除按鈕對應的槽函數 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(); }
實現(xiàn)效果:
以上就是Qt連接數據庫并實現(xiàn)增刪改查操作的詳細內容,更多關于Qt連接數據庫的資料請關注腳本之家其它相關文章!
相關文章
vs2019創(chuàng)建WebService服務的實現(xiàn)
這篇文章主要介紹了vs2019創(chuàng)建WebService服務的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03使用VS2010創(chuàng)建MFC ActiveX工程項目
VS2010開發(fā)ActiveX有兩種方法,分別是MFC和ATL。MFC開過起來比較簡單,但是最終生成的文件比較大,ATL是專門用來開發(fā)ActiveX的,但是相對比較難,必須知道很多原理機制和API。咱先從MFC開發(fā)ActiveX開始吧。2015-06-06