QT database, realizing database addition, deletion, modification and query

QT related concepts about database

QT divides the database into three levels:

Database driver layer:QSqlDriver, QSqlDriverCreator, QSqlDriverCreatorBase, QSqlDriverPlugin

sql interface layer:QSqlDatabase, QSqlQuery, QSqlRecord, QSqlError

User interface layer:Provide some models QSqlQueryModel, QSqlTableModel, QSqlRelationalTableModel

Relevant methods to implement database operations

Add database:

[static] QSqlDatabase QSqlDatabase::addDatabase(
    QSqlDriver *driver, 
    const QString &connectionName = QLatin1String(defaultConnection)) 
QSQLITE SQLite version 3 or above 

Set database name:

​​​​​​​void QSqlDatabase::setDatabaseName(const QString &name)

Contains database:

bool QSqlDatabase::contains(const QString &connectionName = QLatin1String(defaultConnection)) 

Open the database:

​​​​​​​bool QSqlDriver::open(const QString &db)

Close the database:

void QSqlDatabase::close() 

error message:

QSqlError QSqlDatabase::lastError()

SQL statement execution:Construct a QSqlQuery class object, call its member function exec, and execute the SQL statement

bool QSqlQuery::exec(const QString &query)

Function to iterate over query results:

bool QSqlQuery::next()

Implement student management system through database

Functional interface:

Main function code

#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(const QString& type);
        //参数:数据库版本
        //返回值:添加的数据库
        db = QSqlDatabase::addDatabase("QSQLITE");      //表示使用的是sqlite3版本的数据库


        //给数据库命名
        db.setDatabaseName("Student.db");
    }

    //打开数据库
    if(!db.open())
    {
        QMessageBox::information(this, "提示", "数据库打开失败");
        return;
    }

    //代码执行到这说明数据库创建并打开完毕,就可以创建数据表了
    //创建数据表需要使用sql语句,需要使用QsqlQuery类对象来完成
    //准备sql语句
    QString sql = "create table if not exists myTable("           //创建表的sql语句
                  "id integer primary key autoincrement,"       //id主键,允许自增
                  "numb integer,"                               //学号
                  "name varchar(10),"                           //姓名
                  "score integer,"                              //分数
                  "sex varchar(4))";                            //性别
    //定义语句执行者
    QSqlQuery query;
    //使用query执行sql语句
    if(!query.exec(sql))
    {
        QMessageBox::information(this, "失败", "创建表失败");
    }else{
        QMessageBox::information(this, "成功", "创建表成功");
    }
}

Widget::~Widget()
{
    delete ui;
}

//录入按钮对应的槽函数
void Widget::on_pushButton_clicked()
{
    //获取ui界面中要存入数据库中的数据
    int numb_ui = ui->lineEdit->text().toInt();      //获取UI界面的学号
    QString name_ui = ui->lineEdit_2->text();        //获取UI界面的姓名
    int score_ui = ui->lineEdit_3->text().toInt();   //获取UI界面的成绩
    QString sex_ui = ui->lineEdit_4->text();         //获取UI界面的性别

    if(numb_ui == 0 || name_ui.isEmpty() || score_ui == 0 || sex_ui.isEmpty())
    {
        QMessageBox::information(this, "提示", "请将信息填写完整");
        return;
    }

    //准备sql语句
    QString sql =QString("insert into myTable(numb, name, score, sex) values (%1, '%2', %3, '%4')").arg(numb_ui).arg(name_ui).arg(score_ui).arg(sex_ui);

    //定义语句执行者
    QSqlQuery query;

    if(!query.exec(sql))
    {
        QMessageBox::information(this, "失败", "录入数据失败");
    }else{
        QMessageBox::information(this, "成功", "录入数据成功");
    }

    //清除
    ui->lineEdit->clear();
    ui->lineEdit_2->clear();
    ui->lineEdit_3->clear();
    ui->lineEdit_4->clear();

}

//展示按钮对应的槽函数
void Widget::on_pushButton_2_clicked()
{
    //准备sql语句
    QString sql = "select * from myTable";

    //定义语句执行者
    QSqlQuery query;

    if(!query.exec(sql))
    {
        QMessageBox::information(this, "失败", "没有找到数据");
        return;
    }

    //将查找到的所有结果都放到query对象中
    //可以通过next函数不断遍历查询结果
    int i = 0;          //记录行号
    while(query.next())
    {
        //遍历的是任意一组记录,query.record
        //要找到每条记录中的每个数据,使用value(i)
        //将数据库中的表格战术到UI界面
        //ui->tableWidget->setItem()
        //query.record().value()

        for(int j=0; j<query.record().count()-1; j++)
        {
            ui->tableWidget->setItem(i, j, new QTableWidgetItem(query.record().value(j+1).toString()));
        }
        i++;
    }
}

Guess you like

Origin blog.csdn.net/weixin_53478812/article/details/132675868