Qt第二十章 数据库操作

Qt操作数据库

需要在cmakelist加上Sql模块

QSqlDataBase

可以通过静态成员查看支持的所有驱动

    qInfo() << QSqlDatabase::drivers();

在这里插入图片描述

QSqlQuery

数据库用例

在这里插入图片描述

执行SQL语句

  1. 查询
    QSqlQuery query("select * from tab1"); // 设置查询语句
    query.exec(); // 执行查询
    qDebug() << query.record().count(); // 获取字段数
    qDebug() << query.size(); // 记录数量,即查询出几行数据
    while (query.next()) {
        qDebug() << query.value(1).toString(); // 第一列的数据
        qDebug() << query.value("id").toString(); // 字段名为deptno的数据
    }
  1. 插入

方法1

    QSqlQuery query;
    bool r = query.exec("INSERT INTO tab1 (id) "
                        "VALUES (1002)");
    if (r)
        qDebug() << "插入成功";

方法2

    QSqlQuery query;
    query.prepare("INSERT INTO tab1(id,age,name)"
                  "VALUES(?,?,?)");
    query.addBindValue(2001);
    query.addBindValue(12);
    query.addBindValue("张三");
    if (query.exec())
        qDebug() << "插入成功";

方法3

    QSqlQuery query;
    query.prepare("INSERT INTO tab1(id,age,name)"
                  "VALUES(:id,:age,:name)");
    query.bindValue(":id", 2024);
    query.bindValue(":age", 12);
    query.bindValue(":name", "李四");
    if (query.exec())
        qDebug() << "插入成功";

方法4

    QSqlQuery query;
    query.prepare("insert into tab1 values(?,?,?,?)");
    QVariantList ids = QVariantList() << 3001 << 3002 << 3003;
    QVariantList ages = QVariantList() << 11 << 12 << 13;
    QVariantList names = QVariantList() << "a1"
                                        << "a2"
                                        << "a3";
    QVariantList sexs = QVariantList() << 0 << 1 << 0;
    query.addBindValue(ids);
    query.addBindValue(ages);
    query.addBindValue(names);
    query.addBindValue(sexs);
    if (!query.execBatch())
        qDebug() << query.lastError();
    else
        qDebug() << "插入成功";

QSqlRecord

    qDebug() << db.tables(); // 获取所有表名
    qDebug() << db.record("tab1"); // 获取表的字段

在这里插入图片描述

QSqlField

QSqkField表示数据库或表视图中单个列的特征,例如数据类型和列名。字段还包含数据库列的值,可以查看或更改该值。字段数据值存储为qvariant,不允许使用不兼容的类型。

    QSqlRecord rec = db.record("tab1");
    QSqlField field("score", QMetaType::fromType<int>());
    rec.append(field); // 添加score字段
    field.setValue(QString("123")); // 这里会把字符串转化成int
    for (int i = 0; i < rec.count(); i++) {
        qDebug() << rec.fieldName(i) << rec.value(i);
    }

在这里插入图片描述
尽管用QsqlField添加了字段,但数据库里实际并没有发生改变

数据库模型

模型操作参考第十四章

QSqlQueryModel

只读模式,不能更改

void Widget::sqlTableview()
{
    qInfo() << QSqlDatabase::drivers();
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setUserName("root");
    db.setPassword("123456");
    db.setDatabaseName("hello");

    if (!db.open())
        qDebug() << "数据库连接失败" << db.lastError().text();

    // 创建模型
    QSqlQueryModel* model = new QSqlQueryModel;
    model->setQuery("select * from tab1");
    // 创建视图
    QTableView* view = new QTableView;
    view->setModel(model);
    view->show();
}

在这里插入图片描述

QSqlTableModel

可以更改数据

void Widget::sqlTableview2()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setUserName("root");
    db.setPassword("123456");
    db.setDatabaseName("hello");
    if (!db.open())
        qDebug() << "数据库连接失败" << db.lastError().text();

    QSqlTableModel* model = new QSqlTableModel;
    model->setTable("tab1"); // 设置表
    model->setEditStrategy(QSqlTableModel::OnFieldChange); // 设置编辑策略,在视图里修改,立刻在数据库里也更改
    model->select();
    QTableView* view = new QTableView;
    view->setModel(model);
    view->show();

    model->setHeaderData(0, Qt::Horizontal, "tab_id"); // 设置第0列水平头的字段为tab_id
}

在这里插入图片描述

QSqlRelationalTableModel

编译MySql驱动msvc版本

Qt5.13版本后不包含MySql的驱动插件,需要自己手动编译

  1. 看下G:\Qt\6.6.3\Src 有没有这个文件夹(没有的用qt维护工具安装当前版本QT的Sources)Qt版本不同的后面路径自行修改
    在这里插入图片描述

  2. 看下C:\Program Files\MySQL\MySQL Server 8.3(没有的去mysql官方下载安装)如果安装在别的文件夹,后面用到的路径自行修改一下
    在这里插入图片描述

  3. 进入G:\Qt\6.6.3\Src\qtbase\src\plugins\sqldrivers用记事本打开.cmake.conf,添加如下代码

set(QT_REPO_MODULE_VERSION "6.6.3")
SET(FEATURE_sql_mysql ON)
SET(MySQL_INCLUDE_DIR "C:/Program Files/MySQL/MySQL Server 8.3/include")
SET(MySQL_LIBRARY "C:/Program Files/MySQL/MySQL Server 8.3/lib/libmysql.lib")

在这里插入图片描述

  1. 用QtCreator打开当前文件夹的CMakeLists.txt

  2. 点击项目>构建>Current Configuration 往下拉 找到FEATURE_sql_mysql 勾选(已经有的跳过这一步)
    在这里插入图片描述

  3. 点击执行CMake,项目里有mysql就说明成功了
    在这里插入图片描述

  4. 选择Debug,点击左下角小锤子构建项目

  5. 选择release ,同样构建一下项目(后面release项目的操作和debug类似,这里省略)

  6. 进入G:\Qt\6.6.3\Src\qtbase\src\plugins\sqldrivers\build\Desktop_Qt_6_6_3_MSVC2019_64bit-Debug\plugins\sqldrivers
    复制qsqlmysqld.dllqsqlmysqld.pdb
    在这里插入图片描述

  7. 进入G:\Qt\6.6.3\msvc2019_64\plugins\sqldrivers 粘贴刚才复制的文件
    在这里插入图片描述

  8. 进入C:\Program Files\MySQL\MySQL Server 8.3\lib复制libmysql.dllG:\Qt\6.6.3\msvc2019_64\bin

在这里插入图片描述
12. 运行代码测试一下

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlError>

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

    qInfo() << QSqlDatabase::drivers();

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setUserName("root");
    db.setPassword("123456");//这里替换成自己的数据库密码
    db.setDatabaseName("test");

    if (db.open())
        qDebug() << "数据库连接成功";
    else
        qDebug() << "数据库连接失败" << db.lastError().text();
    return a.exec();
}

在这里插入图片描述

MySql客户端程序部署

如果你的程序使用了MySQL数据库,那么在部署时,需要将MySql的依赖,一并拷贝到exe同级目录。
在这里插入图片描述
在这里插入图片描述
上面3个库拷贝进去,双击运行即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yerennuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值