最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt連接數(shù)據(jù)庫(kù)并實(shí)現(xiàn)增刪改查操作

 更新時(shí)間:2023年09月07日 11:44:20   作者:ck釘釘釘  
這篇文章主要為大家詳細(xì)介紹了Qt如何連接數(shù)據(jù)庫(kù)并實(shí)現(xiàn)增刪改查等基本操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

數(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公司是最早開發(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是微軟開發(fā)的數(shù)據(jù)庫(kù)產(chǎn)品,主要支持windows平臺(tái)。

2)小型數(shù)據(jù)庫(kù)mySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),開發(fā)者為瑞典MySQL AB公司,2008年被Sun公司收購(gòu),開放源碼。

3)基于嵌入式的數(shù)據(jù)庫(kù)

基于嵌入式Linux的數(shù)據(jù)庫(kù)主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是關(guān)系型數(shù)據(jù)庫(kù),功能強(qiáng)大,支持存儲(chǔ)過程、SQL兼容等SQLite關(guān)系型數(shù)據(jù)庫(kù),體積小,支持ACID事務(wù)Berkeley DB中并沒有數(shù)據(jù)庫(kù)服務(wù)器的概念,它的程序庫(kù)直接鏈接到應(yīng)用程序中 eXtremeDB是內(nèi)存數(shù)據(jù)庫(kù),運(yùn)行效率高

SQLite3基礎(chǔ)

www.sqlite.org

SQLite的源代碼是C,其源代碼完全開放。SQLite第一個(gè)Alpha版本誕生于2000年5月。 他是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)。

SQLite特性:

  • 零配置一無需安裝和管理配置;
  • 儲(chǔ)存在單一磁盤文件中的一個(gè)完整的數(shù)據(jù)庫(kù);
  • 數(shù)據(jù)庫(kù)文件可以在不同字節(jié)順序的機(jī)器間自由共享;
  • 支持?jǐn)?shù)據(jù)庫(kù)大小至2TB;
  • 足夠小,全部源碼大致3萬行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> 用戶接口層:提供一些模型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))

QSQLITE

SQLite version 3 or above

2、設(shè)置數(shù)據(jù)庫(kù)名稱:void QSqlDatabase::setDatabaseName(const QString &name)

3、包含數(shù)據(jù)庫(kù):bool QSqlDatabase::contains(const QString &connectionName = QLatin1String(defaultConnection))

4、打開數(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語句執(zhí)行:構(gòu)造一個(gè)QSqlQuery類對(duì)象,調(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ù)庫(kù)不支持嚴(yán)格的數(shù)據(jù)類型檢查,數(shù)據(jù)類型寫錯(cuò)了,創(chuàng)建是能夠成功的,不會(huì)有錯(cuò)誤提示;

2)刪除表格

drop table 表名;
?
eg:
    drop table stu1;

3)插入記錄 

字符串類型可以使用單引號(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      打開表頭
--.mode column    對(duì)齊
--在終端輸入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)識(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ù)類型;
     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;

通過數(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ù)類
#include <QSqlQuery>            //執(zhí)行sql語句對(duì)應(yīng)的類
#include <QSqlRecord>           //記錄類
#include <QMessageBox>          //消息對(duì)話框類
#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;
    //定義一個(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
    //如果沒有這個(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");
    }
    //打開數(shù)據(jù)庫(kù)
    if(!db.open())
    {
        QMessageBox::information(this, "提示", "數(shù)據(jù)庫(kù)打開失敗");
        return;
    }
    //此時(shí)說明數(shù)據(jù)庫(kù)已經(jīng)創(chuàng)建出來并打開了,就可以創(chuàng)建數(shù)據(jù)表了
    //創(chuàng)建數(shù)據(jù)表需要使用sql語句,需要使用QSQLQuerry類對(duì)象來完成
    //準(zhǔn)備sql語句
    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))";                 //性別
    //定義語句執(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();
}
//錄入按鈕對(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é)生信息填寫完整");
        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();
    }
}
//展示按鈕對(duì)應(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;
    }
    //此時(shí),將查找到的所有結(jié)果,全都放在querry對(duì)象中了
    //可以通過next函數(shù)不斷遍歷查詢到的結(jié)果
    //querry.next()有數(shù)據(jù)為真,否則為假
    int i = 0;               //用來記錄行號(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ù)中查詢到的有幾列  //數(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語句
    if(!querry.exec(sql))
    {
        //qDebug() << querry.lastError();
        QMessageBox::information(this, "失敗", "查找失敗");
        return;
    }
    deletelist();
    //此時(shí),將查找到的所有結(jié)果,全都放在querry對(duì)象中了
    //可以通過next函數(shù)不斷遍歷查詢到的結(jié)果
    //querry.next()有數(shù)據(jù)為真,否則為假
    int i = 0;               //用來記錄行號(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語句
    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ù)庫(kù)并實(shí)現(xiàn)增刪改查操作的詳細(xì)內(nèi)容,更多關(guān)于Qt連接數(shù)據(jù)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言中的線程信號(hào)控制詳解

    C語言中的線程信號(hào)控制詳解

    這篇文章主要通過一些示例為大家詳細(xì)介紹一下C語言中的線程信號(hào)控制,文中的示例代碼講解詳細(xì),對(duì)我們深入了解C語言有一定的幫助,感興趣的可以學(xué)習(xí)一下
    2023-02-02
  • C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例

    C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例

    這篇文章主要介紹了C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 使用C++調(diào)用Python代碼的方法步驟

    使用C++調(diào)用Python代碼的方法步驟

    這篇文章主要介紹了使用C++調(diào)用Python代碼的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • QT移植到RK3568開發(fā)板的方法步驟

    QT移植到RK3568開發(fā)板的方法步驟

    本文主要介紹了QT移植到RK3568開發(fā)板的方法步驟,文中通過圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • C++的頭文件和實(shí)現(xiàn)文件詳解

    C++的頭文件和實(shí)現(xiàn)文件詳解

    這篇文章主要介紹了C++的頭文件和實(shí)現(xiàn)文件詳解的相關(guān)資料,需要的朋友可以參考下
    2015-01-01
  • C語言全方位講解指針的使用

    C語言全方位講解指針的使用

    指針是C語言中一個(gè)非常重要的概念,也是C語言的特色之一。使用指針可以對(duì)復(fù)雜數(shù)據(jù)進(jìn)行處理,能對(duì)計(jì)算機(jī)的內(nèi)存分配進(jìn)行控制,在函數(shù)調(diào)用中使用指針還可以返回多個(gè)值
    2022-04-04
  • C++中stack和queue的用法及說明

    C++中stack和queue的用法及說明

    這篇文章主要介紹了C++中stack和queue的用法及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-10-10
  • C語言基礎(chǔ)雙指針移除元素解法

    C語言基礎(chǔ)雙指針移除元素解法

    這篇文章介紹了C語言基礎(chǔ)雙指針移除元素的解法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C語言楊輝三角兩種實(shí)現(xiàn)方法

    C語言楊輝三角兩種實(shí)現(xiàn)方法

    大家好,本篇文章主要講的是C語言楊輝三角兩種實(shí)現(xiàn)方法,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++用read()和write()讀寫二進(jìn)制文件的超詳細(xì)教程

    C++用read()和write()讀寫二進(jìn)制文件的超詳細(xì)教程

    二進(jìn)制的文件肉眼我們是讀不懂的,如果通過二進(jìn)制的讀寫操作就可以讀懂,下面這篇文章主要給大家介紹了關(guān)于C++用read()和write()讀寫二進(jìn)制文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06

最新評(píng)論

石屏县| 赣州市| 乡城县| 伊宁市| 铅山县| 永顺县| 资兴市| 周口市| 株洲县| 五莲县| 友谊县| 海淀区| 平果县| 金乡县| 宣武区| 嘉兴市| 汤原县| 旬邑县| 淮滨县| 滦平县| 祁阳县| 兴海县| 古蔺县| 胶南市| 萨嘎县| 勃利县| 廊坊市| 漯河市| 梁平县| 隆子县| 西吉县| 定襄县| 台南市| 沧州市| 镇安县| 祥云县| 吴桥县| 鄄城县| 盐城市| 额尔古纳市| 昆明市|