濟(jì)南網(wǎng)站建設(shè)報(bào)價(jià)收錄網(wǎng)站排名
目錄
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)基本概念
常用的數(shù)據(jù)庫(kù)
SQLite3基礎(chǔ)
SQLite特性:
QT連接數(shù)據(jù)庫(kù)
1.1 QT將數(shù)據(jù)庫(kù)分為三個(gè)層次
1.2 實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作的相關(guān)方法
?sql語(yǔ)句(常用)
1)創(chuàng)建表格
2)刪除表格
3)插入記錄?
4)查看記錄?
5)修改記錄?
6)刪除記錄?
?7)主鍵(primary key)
8)拷貝?
9)增加列?
10)修改表名?
11)修改字段名(列名)?
12)刪除列?
通過(guò)數(shù)據(jù)庫(kù)實(shí)現(xiàn)簡(jiǎn)易的學(xué)生管理系統(tǒng)
ui界面
配置文件
頭文件 (.h文件)?
源文件
main.cpp文件
實(shí)現(xiàn)效果:?
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)基本概念
- 數(shù)據(jù)(Data)
能夠輸入計(jì)算機(jī)并能被計(jì)算機(jī)程序識(shí)別和處理的信息集合數(shù)據(jù)庫(kù) (Database)
數(shù)據(jù)庫(kù)是在數(shù)據(jù)庫(kù)管理系統(tǒng)管理和控制之下,存放在存儲(chǔ)介質(zhì)上的數(shù)據(jù)集合
-
常用的數(shù)據(jù)庫(kù)
1)大型數(shù)據(jù)庫(kù)Oracle公司是最早開(kāi)發(fā)關(guān)系數(shù)據(jù)庫(kù)的廠商之一,其產(chǎn)品支持最廣泛的操作系統(tǒng)平臺(tái)。目前Oracle關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品的市場(chǎng)占有率名列前茅。IBM 的DB2是第一個(gè)具備網(wǎng)上功能的多媒體關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),支持包Linux在內(nèi)的一系列平臺(tái)。中型數(shù)據(jù)庫(kù)Server是微軟開(kāi)發(fā)的數(shù)據(jù)庫(kù)產(chǎn)品,主要支持windows平臺(tái)。
2)小型數(shù)據(jù)庫(kù)mySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),開(kāi)發(fā)者為瑞典MySQL AB公司,2008年被Sun公司收購(gòu),開(kāi)放源碼。
3)基于嵌入式的數(shù)據(jù)庫(kù)
基于嵌入式Linux的數(shù)據(jù)庫(kù)主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是關(guān)系型數(shù)據(jù)庫(kù),功能強(qiáng)大,支持存儲(chǔ)過(guò)程、SQL兼容等SQLite關(guān)系型數(shù)據(jù)庫(kù),體積小,支持ACID事務(wù)Berkeley DB中并沒(méi)有數(shù)據(jù)庫(kù)服務(wù)器的概念,它的程序庫(kù)直接鏈接到應(yīng)用程序中 eXtremeDB是內(nèi)存數(shù)據(jù)庫(kù),運(yùn)行效率高
-
SQLite3基礎(chǔ)
www.sqlite.org
SQLite的源代碼是C,其源代碼完全開(kāi)放。SQLite第一個(gè)Alpha版本誕生于2000年5月。 他是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)。
SQLite特性:
- 零配置一無(wú)需安裝和管理配置;
- 儲(chǔ)存在單一磁盤(pán)文件中的一個(gè)完整的數(shù)據(jù)庫(kù);
- 數(shù)據(jù)庫(kù)文件可以在不同字節(jié)順序的機(jī)器間自由共享;
- 支持?jǐn)?shù)據(jù)庫(kù)大小至2TB;
- 足夠小,全部源碼大致3萬(wàn)行c代碼,250KB;
- 比目前流行的大多數(shù)數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)的操作要快;
QT連接數(shù)據(jù)庫(kù)
1.1 QT將數(shù)據(jù)庫(kù)分為三個(gè)層次
1> 數(shù)據(jù)庫(kù)驅(qū)動(dòng)層:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin
2> sql接口層:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError
3> 用戶(hù)接口層:提供一些模型QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel
1.2 實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作的相關(guān)方法
1、添加數(shù)據(jù)庫(kù):[static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String(defaultConnection))QSQLITESQLite version 3 or above
2、設(shè)置數(shù)據(jù)庫(kù)名稱(chēng):void QSqlDatabase::setDatabaseName(const QString &name)
3、包含數(shù)據(jù)庫(kù):bool QSqlDatabase::contains(const QString &connectionName = QLatin1String(defaultConnection))
4、打開(kāi)數(shù)據(jù)庫(kù):bool QSqlDriver::open(const QString &db)
5、關(guān)閉數(shù)據(jù)庫(kù):void QSqlDatabase::close()
6、錯(cuò)誤信息:QSqlError QSqlDatabase::lastError()7、sql語(yǔ)句執(zhí)行:構(gòu)造一個(gè)QSqlQuery類(lèi)對(duì)象,調(diào)用其成員函數(shù)exec,執(zhí)行sql語(yǔ)句:bool QSqlQuery::exec(const QString &query)
8、bool QSqlQuery::next():遍歷查詢(xún)結(jié)果的函數(shù)
?sql語(yǔ)句(常用)
本項(xiàng)目使用sqlite3,不區(qū)分大小寫(xiě)
1)創(chuàng)建表格
create table 表名 (字段名 數(shù)據(jù)類(lèi)型, 字段名 數(shù)據(jù)類(lèi)型);
create table if not exists 表名 (字段名 數(shù)據(jù)類(lèi)型, 字段名 數(shù)據(jù)類(lèi)型);
?
eg:CREATE TABLE stu (id int, name char, score float);CREATE TABLE if not exists stu1 (id int, name char, score float);
?
注意:數(shù)據(jù)庫(kù)不支持嚴(yán)格的數(shù)據(jù)類(lèi)型檢查,數(shù)據(jù)類(lèi)型寫(xiě)錯(cuò)了,創(chuàng)建是能夠成功的,不會(huì)有錯(cuò)誤提示;
2)刪除表格
drop table 表名;
?
eg:drop table stu1;
3)插入記錄?
字符串類(lèi)型可以使用單引號(hào),也可以使用雙引號(hào)
?
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)建時(shí)候字段的順序一致;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對(duì)應(yīng);
4)查看記錄?
.header on 打開(kāi)表頭
.mode column 對(duì)齊
在終端輸入shell指令:sqlitebrowser sq.db 圖形化界面
?
1) 查看所有記錄select * from 表名;eg:SELECT * FROM stu;2) 查看某幾行select * from 表名 where 限制條件;邏輯與 and 邏輯或 oreg: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ù)類(lèi)型 primary key, 字段名 數(shù)據(jù)類(lèi)型);
primary key主鍵:唯一標(biāo)識(shí)表格中的每一條記錄;例如:id字段為主鍵,當(dāng)表格中有id==1的記錄時(shí),不允許再插入id為1的記錄了;
eg:CREATE TABLE stu (id int PRIMARY KEY, name char, score float);
?
注意:主鍵的值必須唯一。每一張表格都應(yīng)該設(shè)置一個(gè)主鍵,而且只能設(shè)置一個(gè)。
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ù)類(lèi)型;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.新建修改名字后的表(新建一個(gè)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)建一個(gè)新表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;
通過(guò)數(shù)據(jù)庫(kù)實(shí)現(xiàn)簡(jiǎn)易的學(xué)生管理系統(tǒng)
ui界面
配置文件
頭文件 (.h文件)?
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase> //數(shù)據(jù)庫(kù)類(lèi)
#include <QSqlQuery> //執(zhí)行sql語(yǔ)句對(duì)應(yīng)的類(lèi)
#include <QSqlRecord> //記錄類(lèi)
#include <QMessageBox> //消息對(duì)話框類(lèi)
#include <QDebug>
#include <QSqlError>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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;//定義一個(gè)數(shù)據(jù)庫(kù)對(duì)象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ù)庫(kù)對(duì)象是否包含了自己使用的數(shù)據(jù)庫(kù) Student.db//如果沒(méi)有這個(gè)數(shù)據(jù)庫(kù)就需要添加一個(gè)數(shù)據(jù)庫(kù)if(!db.contains("Student.db")){//添加一個(gè)數(shù)據(jù)庫(kù)//函數(shù)原型: static QSqlDatabase addDatabase(QSqlDriver* driver);//參數(shù):數(shù)據(jù)庫(kù)的版本//返回值:添加的數(shù)據(jù)庫(kù)db = QSqlDatabase::addDatabase("QSQLITE"); //表明用的是sqlite3及以上版本的數(shù)據(jù)庫(kù)//給數(shù)據(jù)庫(kù)命名db.setDatabaseName("Student.db");}//打開(kāi)數(shù)據(jù)庫(kù)if(!db.open()){QMessageBox::information(this, "提示", "數(shù)據(jù)庫(kù)打開(kāi)失敗");return;}//此時(shí)說(shuō)明數(shù)據(jù)庫(kù)已經(jīng)創(chuàng)建出來(lái)并打開(kāi)了,就可以創(chuàng)建數(shù)據(jù)表了//創(chuàng)建數(shù)據(jù)表需要使用sql語(yǔ)句,需要使用QSQLQuerry類(lèi)對(duì)象來(lái)完成//準(zhǔn)備sql語(yǔ)句QString sql = "create table if not exists myTable(""number integer primary key autoincrement," //序號(hào)自增"id integer," //學(xué)號(hào),是整形"name varchar(10)," //學(xué)生姓名"score integer," //成績(jī)"sex varchar(4))"; //性別//定義語(yǔ)句執(zhí)行者QSqlQuery querry;//使用querry執(zhí)行sql語(yǔ)句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();
}//錄入按鈕對(duì)應(yīng)的槽函數(shù)
void Widget::on_loginButton_clicked()
{//獲取ui界面中要存入數(shù)據(jù)庫(kù)的字符串int ui_id = ui->idEDIT->text().toInt(); //獲取ui界面的學(xué)號(hào)QString ui_name = ui->nameEdit->text(); //獲取ui界面上的姓名int ui_score = ui->scoreEdit->text().toInt(); //獲取ui界面上的成績(jī)QString ui_sex = ui->sexEdit->text(); //獲取ui界面上的性別if(ui_id==0 || ui_name.isEmpty() || ui_score==0 || ui_sex.isEmpty()){QMessageBox::information(this,"提示","請(qǐng)將學(xué)生信息填寫(xiě)完整");return;}//準(zhǔn)備sql語(yǔ)句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);//定義語(yǔ)句執(zhí)行者QSqlQuery querry;//使用querry執(zhí)行sql語(yǔ)句if(!querry.exec(sql)){QMessageBox::information(this, "失敗", "錄入失敗");}else{QMessageBox::information(this, "成功", "錄入成功");deletelist();}
}
//展示按鈕對(duì)應(yīng)的槽函數(shù)
void Widget::on_showButton_clicked()
{deletelist();//準(zhǔn)備sql語(yǔ)句QString sql = "select * from myTable";//定義語(yǔ)句執(zhí)行者QSqlQuery querry;//使用querry執(zhí)行sql語(yǔ)句if(!querry.exec(sql)){QMessageBox::information(this, "失敗", "展示失敗");return;}//此時(shí),將查找到的所有結(jié)果,全都放在querry對(duì)象中了//可以通過(guò)next函數(shù)不斷遍歷查詢(xún)到的結(jié)果//querry.next()有數(shù)據(jù)為真,否則為假int i = 0; //用來(lái)記錄行號(hào)while(querry.next()) //代表行{//遍歷的就是任意一組記錄:queery.record// qDebug() << querry.record(); //所有數(shù)據(jù)輸出//要找到每條記錄中的每個(gè)使用數(shù)據(jù)//qDebug() << querry.record().value(2); //把第二列的數(shù)據(jù)輸出//querry.record().value(2).toString(); //將記錄的某一項(xiàng)的數(shù)據(jù)轉(zhuǎn)變成字符串//獲取從數(shù)據(jù)庫(kù)中查詢(xún)到的有幾列 //數(shù)據(jù)項(xiàng)的個(gè)數(shù)//querry.record().count(); //返回當(dāng)前記錄對(duì)應(yīng)數(shù)據(jù)項(xiàng)的個(gè)數(shù)//將數(shù)據(jù)庫(kù)中的表格展示到ui界面//要傳參行和列還要一個(gè)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)行下一行}}
//查找按鈕對(duì)應(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語(yǔ)句if(!querry.exec(sql)){//qDebug() << querry.lastError();QMessageBox::information(this, "失敗", "查找失敗");return;}deletelist();//此時(shí),將查找到的所有結(jié)果,全都放在querry對(duì)象中了//可以通過(guò)next函數(shù)不斷遍歷查詢(xún)到的結(jié)果//querry.next()有數(shù)據(jù)為真,否則為假int i = 0; //用來(lái)記錄行號(hào)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)行下一行}}
//刪除按鈕對(duì)應(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語(yǔ)句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();
}