文章目录:

一:QSqlQuery查询类

1.QT查询数据库 

1.1 目录结构

1.2 数据库连接单独放在一个新建头文件connection.h中配置数据库

1.3 编辑main.cpp文件调用连接函数

1.4 编辑mainwindow.ui文件添加按钮

1.5 编辑mainwindow.cpp文件编写槽函数

1.6 运行结果

2.QT数据库数据绑定

第一种:在sql语句中使用占位符变量实现

a.目录结构

b.编辑mainwindow.ui文件添加滑动spinBox

c.编辑mainwindow.cpp文件编写槽函数

d.运行结果

QSqlQuery类绑定函数

a.目录结构

b.编辑mainwindow.cpp文件编写槽函数

c.运行结果

第二种:利用QSqlQuery类绑定函数实现

a.编辑mainwindow.cpp文件编写槽函数

b.运行结果

3.QT批处理操作

3.1 编辑mainwindow.cpp文件编写槽函数

3.2 运行结果

4.QT事务操作

二:QT的SQL查询模型QSqlQueryModel

三:QT的SQL表格模型QSqlTableModel

四:QT的SQL关系表格模型QSqlRelationalTableModel


一:QSqlQuery查询类

1.QT查询数据库 

1.1 目录结构

1.2 数据库连接单独放在一个新建头文件connection.h中配置数据库

#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
    // 配置数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    //数据库名memory 建立在内存中的数据库 该数据库只在程序运行期间有效
    db.setDatabaseName(":memory:");
    //数据库连接测试
    if (!db.open()) {
        QMessageBox::critical(0, qApp->tr("不能打开数据库"),
                              qApp->tr("无法建立数据库连接"
                                       ), QMessageBox::Cancel);
        return false;
    }
    //数据库操作
    QSqlQuery query;
    query.exec("create table student (id int primary key, "
               "name varchar(20))");
    query.exec("insert into student values(0, 'first')");
    query.exec("insert into student values(1, 'second')");
    query.exec("insert into student values(2, 'third')");
    query.exec("insert into student values(3, 'fourth')");
    query.exec("insert into student values(4, 'fifth')");
    return true;
}
#endif // CONNECTION_H

1.3 编辑main.cpp文件调用连接函数

#include "mainwindow.h"
#include <QApplication>
#include "connection.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //调用连接函数
    if (!createConnection())
        return 1;



    MainWindow w;
    w.show();

    return a.exec();
}

1.4 编辑mainwindow.ui文件添加按钮

1.5 编辑mainwindow.cpp文件编写槽函数

#include "mainwindow.h"
#include "ui_mainwindow.h"



#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include <QSqlQuery>
#include <QSqlError>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


}

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


//双击mainwindow.ui文件进入设计模式,按钮转到槽,然后选择clicked()单击信号槽
void MainWindow::on_pushButton_clicked()
{
    QSqlQuery query;
    query.exec("select * from student");
    while(query.next())
    {
        qDebug() << query.value(0).toInt()
                 << query.value(1).toString();
    }
}

1.6 运行结果

2.QT数据库数据绑定

第一种:在sql语句中使用占位符变量实现

a.目录结构

和上面一样

b.编辑mainwindow.ui文件添加滑动spinBox

c.编辑mainwindow.cpp文件编写槽函数

#include "mainwindow.h"
#include "ui_mainwindow.h"



#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include <QSqlQuery>
#include <QSqlError>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


}

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


//双击mainwindow.ui文件进入设计模式,按钮转到槽,然后选择clicked()单击信号槽
void MainWindow::on_pushButton_clicked()
{
    QSqlQuery query;
    int id = ui->spinBox->value();
    //在sql语句中使用变量
    //数据绑定:通过改变滑动数字,利用按钮点击查询数据库对应值
    query.exec(QString("select name from student where id =%1")
                   .arg(id));
    query.next();
    QString name = query.value(0).toString();
    qDebug() << name;
}


void MainWindow::on_spinBox_textChanged(const QString &arg1)
{

}

d.运行结果

QSqlQuery类绑定函数

a.目录结构

和上面一样

b.编辑mainwindow.cpp文件编写槽函数

#include "mainwindow.h"
#include "ui_mainwindow.h"



#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include <QSqlQuery>
#include <QSqlError>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


}

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


//双击mainwindow.ui文件进入设计模式,按钮转到槽,然后选择clicked()单击信号槽
void MainWindow::on_pushButton_clicked()
{
    QSqlQuery query;
    //设置属性占位符
    query.prepare("insert into student (id, name) "
                  "values (:id, :name)");
    
    //利用绑定函数实现键值对 0:id  1:name
    //    query.bindValue(0, 5);
    //    query.bindValue(1, "sixth");
    
    //利用addBindValue()函数来实现
    query.addBindValue(5);
    query.addBindValue("sixth");

    //开始执行
    query.exec();
    query.exec("select * from student");
    query.last();
    int id = query.value(0).toInt();
    QString name = query.value(1).toString();
    qDebug() << id << name;
}


void MainWindow::on_spinBox_textChanged(const QString &arg1)
{

}

c.运行结果

第二种:利用QSqlQuery类绑定函数实现

a.编辑mainwindow.cpp文件编写槽函数

#include "mainwindow.h"
#include "ui_mainwindow.h"



#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include <QSqlQuery>
#include <QSqlError>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


}

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


//双击mainwindow.ui文件进入设计模式,按钮转到槽,然后选择clicked()单击信号槽
void MainWindow::on_pushButton_clicked()
{
    QSqlQuery query;
    query.prepare("select name from student where id = ?");
    int id = ui->spinBox->value();
    query.addBindValue(id);
    query.exec();
    query.next();
    qDebug() << query.value(0).toString();
}


void MainWindow::on_spinBox_textChanged(const QString &arg1)
{

}

b.运行结果

3.QT批处理操作

3.1 编辑mainwindow.cpp文件编写槽函数

#include "mainwindow.h"
#include "ui_mainwindow.h"



#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include <QSqlQuery>
#include <QSqlError>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


}

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


//双击mainwindow.ui文件进入设计模式,按钮转到槽,然后选择clicked()单击信号槽
void MainWindow::on_pushButton_clicked()
{
    QSqlQuery q;
    q.prepare("insert into student values (?, ?)");
    //插入键
        QVariantList ints;
        ints << 10 << 11 << 12 << 13;
        q.addBindValue(ints);
    //插入值    
        QVariantList names;
        // 最后一个是空字符串,应与前面的格式相同
            // 利用QVariant(QVariant::String)来输入空值NULL,因为前面都是QString类型的
            // 所以这里要使用QVariant::String 使格式一致化
        names << "xiaoming" << "xiaoliang"
              << "xiaogang" << QVariant(QVariant::String);
        q.addBindValue(names);
    //进行批处理,如果出错就输出错误  execBatch()函数进行批处理
        if (!q.execBatch()) 
            qDebug() << q.lastError();
    //下面输出整张表
    QSqlQuery query;
    query.exec("select * from student");
    while(query.next())
    {
        int id = query.value(0).toInt();
        QString name = query.value(1).toString();
        qDebug() << id << name;
    }
}


void MainWindow::on_spinBox_textChanged(const QString &arg1)
{

}

3.2 运行结果

4.QT事务操作

查询数据库不需要,写的时候需要 

事务操作是指一组数据库操作:要么都成功,要么都失败,具有原子性、一致性、隔离性和持久性等特性
典型的事务场景包括银行转账等




来启动一个事务(执行之前)
    QSqlDatabase::transaction()

提交事务
    QSqlDatabase::commmit()

回滚查看(执行之后)
    QSqlDatabase::commit()或者QSqlDatabase::rollback()
//启动事务
QSqlDatabase::database().transaction();

QSqlQuery query;
query.exec("SELECT id FROMemployee WHERE name = 'Torild Halvorsen'");
if (query.next()) {
    int employeeId = query.value(0).toInt();
    query.exec("INSERT INTO project(id, name, ownerid) "
               "VALUES (201, 'ManhattanProject', "
               + QString::number(employeeId) + ')');
}

//回滚
QSqlDatabase::database().commit();

二:QT的SQL查询模型QSqlQueryModel

三:QT的SQL表格模型QSqlTableModel

四:QT的SQL关系表格模型QSqlRelationalTableModel

Logo

一站式 AI 云服务平台

更多推荐