Qt + MySQL(简单的增删改查)

Qt编译MySql插件教程

帮助: SQL Programming

QSqlDatabase

静态函数

1.drivers(),得到可以使用的数据库驱动名字的集合

cpp 复制代码
[static] QStringList QSqlDatabase::drivers();

2.addDatabase(),添加一个数据库实例

cpp 复制代码
[static] QSqlDatabase QSqlDatabase::addDatabase(
    const QString &type, 
    const QString &connectionName = QLatin1String( defaultConnection ));

该函数的有两个参数分别是:

type: 指定要连接什么样的数据库,就是数据库驱动对应的驱动名
connectionName:数据库连接名,默认叫: defaultConnection,我们可以在应用程序中添加多个数据库连接(也就是多个实例),每个连接都对应一个唯一的名字。

函数的返回值就是得到的数据库实例对象。

3.database(),通过数据库连接名得到数据库实例对象(指向数据库连接的指针)

cpp 复制代码
[static] QSqlDatabase QSqlDatabase::database(
    const QString &connectionName = QLatin1String( defaultConnection ), 
    bool open = true);

该函数的有两个参数分别是:

connectionName: 通过addDatabase()函数的第二个参数指定的连接名
open: 实例的状态

  • true: 得到的实例设置为打开状态
  • false: 得到的实例设置为关闭状态

4.判断连接名对应的连接是否已经存在了,给函数参数指定数据库连接名函数就可以返回连接对应的状态了:true(打开) 或者 false(关闭)。

cpp 复制代码
[static] bool QSqlDatabase::contains(
    const QString &connectionName = QLatin1String( defaultConnection ));

5.QSqlDatabase::colse() 关闭数据库之后,调用 QSqlDatabase::removeDatabase() 移除该连接

普通成员函数

cpp 复制代码
// 1.设置数据库名
void QSqlDatabase::setDatabaseName(const QString &name);
// 2.设置数据库服务器主机名(一般指定服务器IP地址即可)
void QSqlDatabase::setHostName(const QString &host);
// 3.设置数据库服务器绑定的端口
void QSqlDatabase::setPort(int port);// 如果数据库服务器绑定的是默认端口,可以省略设置端口的操作。
// 4.设置连接的数据库中某个用户的用户名
void QSqlDatabase::setUserName(const QString &name);
// 5.设置连接的数据库中某个用户对应的密码
void QSqlDatabase::setPassword(const QString &password);

// 6.连接数据库(必须要先设置连接信息,然后再连接数据库)
bool QSqlDatabase::open();// 数据库连接成功返回true,连接失败返回false。
// 7.判断数据库是否打开了,返回值和open()函数相同。
bool QSqlDatabase::isOpen() const;
// 8.关闭数据库连接
void QSqlDatabase::close();
// 9.返回有关数据库上发生的最后一个错误的信息。
QSqlError QSqlDatabase::lastError() const;
QString QSqlError::text() const;
// 该函数返回的是一个QSqlError对象,调用QSqlError类提供的text()方法就可以得到最后一个错误对应的信息描述了。

// 事务操作
// 10.创建一个事务
bool QSqlDatabase::transaction();
// 11.提交事务
bool QSqlDatabase::commit();
// 12.事务回滚
bool QSqlDatabase::rollback();

QSqlQuery

QSqlQuery 封装了从 QSqlDatabase上执行的SQL查询中创建、导航和检索数据所涉及的功能。既可以执行 SELECTINSERTUPDATEDELETE等DML(数据操作语言)语句,也可以执行CREATE TABLE等DDL(数据定义语言)语句。

成员函数

1.构造函数

cpp 复制代码
QSqlQuery::QSqlQuery(
    const QString &query = QString(), 
    QSqlDatabase db = QSqlDatabase());

参数说明(这两个参数都有默认值,因此可以根据实际需求进行指定):
query:要执行的SQL语句,指定无参 exec() 执行的 SQL 语句
db:数据库实例对象,如果没有指定db,或者是无效的,则使用应用程序的默认数据库。

2.执行一个SQL语句

cpp 复制代码
bool QSqlQuery::exec();    // 没有参数,执行的SQL语句是在构造函数中指定的
bool QSqlQuery::exec(const QString &query);   // 有参数,参数对应的字符串就是要执行的SQL语句

3.检索查询得到的结果集中的下一条记录(如果可用),并将查询定位到检索到的记录上。

cpp 复制代码
bool QSqlQuery::next();

该函数检索结果集中的每一条记录的规则如下:

  • 如果当前位于结果集第一个记录之前,例如,在执行查询之后,将尝试检索第一个记录。
  • 如果当前位于结果集最后一条记录之后,结果集已经检索完毕并返回false。
  • 如果结果位于结果集中间的某个位置,则尝试检索下一个记录。

函数调用之后,如果检索到有效记录返回true,否则返回false。

4.获取当前记录中字段的值

cpp 复制代码
QVariant QSqlQuery::value(int index) const;  // 通过字段的索引得到当前字段的值,编号从0开始。
QVariant QSqlQuery::value(const QString &name) const; // 通过字段的名字得到当前字段的值。

由于数据库表中的字段可以有多种数据类型,因此将这多种类型通过 QVariant 类进行了包装从而实现了整齐划一。我们可以通过调用 QVariant 类的API函数得到其内部实际类型的数据。

ui界面

使用 QSqlQuery 进行查询时,字符类型的参数的占位符加引号 QString("select *from student where num = '%1'").arg(searchname);;但是对于数值类型的参数的占位符,QString("select *from student where num = '%1'").arg(searchnumer);QString("select *from student where num = %1").arg(searchnumer); ,加不加引号都可以正常查询

QSqlQuery简单使用

代码:

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>



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

    setWindowTitle("SQL");//设置窗口的标题
    connect(ui->pushButtonInsert, &QPushButton::clicked, this, &MainWindow::pInsert_clicked);
    connect(ui->pushButtonDelete, &QPushButton::clicked, this, &MainWindow::pDelete_clicked);
    connect(ui->pushButtonModify, &QPushButton::clicked, this, &MainWindow::pModify_clicked);
    connect(ui->pushButtonSelect, &QPushButton::clicked, this, &MainWindow::pSelect_clicked);
    connect(ui->pushButtonSelectAll, &QPushButton::clicked, this, &MainWindow::pSelectAll_clicked);
    ui->textEdit->setText("右侧栏操作介绍:\n"
                          "1.插入:输入新学生的姓名,学号,分数\n"
                          "2.删除:输入要删除学生的姓名\n"
                          "3.修改:输入学生姓名,对其学号和分数进行修改\n"
                          "4.指定信息优先按姓名查询,其次按学号\n"
                          "5.查询所有学生信息");

    QStringList list = QSqlDatabase::drivers();
    qDebug() << list;

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    db.setHostName("127.0.0.1"); // 本地连接
    db.setPort(3306);       // 如果使用的是默认端口可以不设置
    db.setUserName("");	// 数据库用户名
    db.setPassword(""); // 数据库密码
    db.setDatabaseName("student"); // 数据库名字

    if(db.open())
    {
        QMessageBox::information(this, "打开数据库", "数据库打开成功, 可以读写数据了......");
    }
    else{
        QString msg = "数据库打开失败: " + db.lastError().text();
        QMessageBox::information(this, "打开数据库", msg);
    }

    pquery = new QSqlQuery(db);

    QString str = "create table IF NOT EXISTS student(num int, name varchar(32), score double);";
    pquery->exec(str); // 建表
}


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

void MainWindow::pInsert_clicked()
{
    if(ui->lineEditName->text().isEmpty() ||
            ui->lineEditNumber->text().isEmpty() ||
            ui->lineEditScore->text().isEmpty()) {
        QMessageBox::information(this, "Insert Error", "要插入的学生信息必须完整");
        return;
    }

    QString namestr = ui->lineEditName->text();
    int num = ui->lineEditNumber->text().toInt();
    double score = ui->lineEditScore->text().toDouble();

    QString str = QString("insert into student(num, name, score) values('%1', '%2', '%3')").arg(num).arg(namestr).arg(score);
    pquery->exec(str);
    ui->textEdit->append("插入成功\n");
}

void MainWindow::pDelete_clicked()
{
    if(ui->lineEditName->text().isEmpty()) {
        QMessageBox::information(this, "Delete Error", "必须给出要删除学生的姓名");
        return;
    }
    QString name = ui->lineEditName->text();//从行编辑框中获取需要删除的人名
    QString str = QString("select * from student where name = '%1'").arg(name);
    pquery->exec(str);
    if(pquery->size() <= 0) {
        QMessageBox::information(this, "Delete Error", "要删除的学生不存在,请检查输入的姓名是否正确");
        return;
    }

    str =  QString("delete from student where name = '%1'").arg(name);
    pquery->exec(str);
    ui->textEdit->append(QString("删除姓名为%1的同学成功\n").arg(name));
}

void MainWindow::pModify_clicked()
{
    if(ui->lineEditName->text().isEmpty() ||
            ui->lineEditNumber->text().isEmpty() ||
            ui->lineEditScore->text().isEmpty()) {
        QMessageBox::information(this, "Insert Error", "要修改的学生信息必须完整");
        return;
    }

    QString updatename = ui->lineEditName->text();
    QString temp = QString("select * from student where name = '%1'").arg(updatename);
    pquery->exec(temp);
    if(pquery) {
        if(pquery->size() <= 0) {
            QMessageBox::information(this, "Insert Error", "要修改的学生不存在,请查看输入的姓名是否正确");
            return;
        }
    }

    int number = ui->lineEditNumber->text().toInt();
    double score = ui->lineEditScore->text().toDouble();
    temp = QString("update student set num = '%1' , score = '%2' where name = '%3'").arg(number).arg(score).arg(updatename);
    pquery->exec(temp);//执行修改信息的操作
    ui->textEdit->append("修改成功\n");
}

void MainWindow::pSelect_clicked()
{
    if(ui->lineEditName->text().isEmpty() && ui->lineEditNumber->text().isEmpty()) {
         QMessageBox::information(this, "Select Error", "必须指定查询的姓名或者学号");
         return;
    }

    QString searchname = ui->lineEditName->text();
    int searchnumer = ui->lineEditNumber->text().toInt();
    QString str;

    if(!ui->lineEditName->text().isEmpty()) {
        str = QString("select *from student where name = '%1'").arg(searchname);
        pquery->exec(str);
        if(pquery->size() <= 0) {
            QMessageBox::information(this, "Select Error", "要查询的学生不存在,请查看输入的姓名是否正确");
            return;
        }
        ui->textEdit->append(QString("查询姓名为%1的同学成功").arg(searchname));
    }
    else if(!ui->lineEditNumber->text().isEmpty()) {
        str = QString("select *from student where num = '%1'").arg(searchnumer);
        pquery->exec(str);
        if(pquery->size() <= 0) {
            QMessageBox::information(this, "Select Error", "要查询的学生不存在,请查看输入的学号是否正确");
            return;
        }
        ui->textEdit->append(QString("查询学号为%1的同学成功").arg(searchnumer));
    }

    pquery->exec(str);
    QString name;
    int number = 0;
    double score;
    while (pquery->next())
    {
        number = pquery->value(0).toInt();
        name = pquery->value(1).toString();
        score =  pquery->value(2).toDouble();
        str = "学号: " + QString::number(number) + " " +
              "姓名: " + name + " " +
              "分数: " + QString::number(score);
        ui->textEdit->append(str);
    }
    ui->textEdit->append("\n");
}

void MainWindow::pSelectAll_clicked()
{
    QString str = QString("select *from student");
    pquery->exec(str);
    if(pquery->size() <= 0) {
        QMessageBox::information(this, "Select Error", "目前student里没有信息");
    }

    ui->textEdit->append("查询所有成员成功");
    QString name;
    int number = 0;
    double score;
    while (pquery->next())
    {
        number = pquery->value(0).toInt();
        name = pquery->value(1).toString();
        score =  pquery->value(2).toDouble();
        str = "学号: " + QString::number(number) + " " +
              "姓名: " + name + " " +
              "分数: " + QString::number(score);
        ui->textEdit->append(str);
    }
    ui->textEdit->append("\n");
}
相关推荐
xujiangyan_1 小时前
MySQL的半同步模式
数据库·git·mysql
飞翔沫沫情2 小时前
《MySQL 5.7.44审计合规实践:插件集成与日志分割自动化方案》
数据库·mysql·mysql审计
SunkingYang2 小时前
QT中怎么隐藏或显示最大化、最小化、关闭按钮
qt·关闭按钮·隐藏·显示·最大化按钮·最小化按钮
六bring个六2 小时前
QT上位机笔记
开发语言·笔记·qt
步木木2 小时前
Qt 5.14.2入门(一)写个Hello Qt!程序
开发语言·qt
画扇落汗4 小时前
Python 几种将数据插入到数据库的方法(单行插入、批量插入,SQL Server、MySQL,insert into)
数据库·python·sql·mysql
银河系的一束光4 小时前
mysql的下载和安装2025.4.8
数据库·mysql
FreeLikeTheWind.6 小时前
Qt 开发时可以在函数内引用的头文件
开发语言·c++·qt
binary00108 小时前
基于 Qt 的图片处理工具开发(一):拖拽加载与基础图像处理功能实现
图像处理·人工智能·qt
八股文领域大手子10 小时前
从接口400ms到20ms,记录一次JVM、MySQL、Redis的混合双打
jvm·数据库·redis·mysql·jar