Qt vs2017连接MySQL数据库 - 增删改查(详细步骤)

本文记录了Qt在vs2017中连接MySQL数据库的方法,包括添加数据库的dll、创建项目注意事项、连接数据库、进行增删改查操作、删除表、释放连接及获取数据库对象等内容,强调各语言连数据库方式大同小异,要注意语言特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的文章中已经记录了如何使用C#连接MySQL数据库和C#连接ACCESS数据库。今天记录下Qt如何在vs2017中连接MySQL数据库,应该所有vs连接MySQL数据库在此篇文章中都是通用的。


Qt添加数据库的dll

将mysql文件lib目录下的libmysql.dll和libmysql.lib复制到Qt中的bin文件下。如下图所示;
在这里插入图片描述
在这里插入图片描述

注意:一定要做这一步,不然是无法连接上数据库的!
在这里插入图片描述


创建项目时需注意事项

  1. 创建qt项目时,必须勾选SQL项,不然是无法完成连接数据库的。
    如下图:
    在这里插入图片描述

  2. 如果忘记了勾选了,还可以在项目中继续勾选

    右键项目名,选择属性,点击Qt ProjectSettings,再点击Qt Modules,该项可以继续添加勾选。

    如下图:
    在这里插入图片描述
    在这里插入图片描述


连接数据库

添加如下头文件:

#include <QtSql/QSqlDatabase>	// 连接数据库
#include <QtSql/QSqlError>		// 数据库连接失败打印报错语句
#include <QtSql/QSqlQuery>		// 数据库操作(增删改查)
#include <QMessageBox>
#include <QVariantList>			// 泛型链表,可以存储任何类型的数据
#include <QDebug>

如下代码是进行数据库的连接:

//addDatabase() 创建一个连接,调用这个函数时,我们可以传递我们要访问哪种类型的数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");     //驱动 

db.setHostName("localhost");          // 数据库地址,一般都是本地,填localhost就可以(或者填写127.0.0.1) 
db.setDatabaseName("school");         // 数据库名,根据你Mysql里面的数据库名称来填写,比如我的Mysql里面有个数据库叫school
db.setUserName("root");               // 登录用户名,一般是本地用户,填root就可以
db.setPassword("yang");				  // 登录密码,填写你自己Mysql登陆密码
db.setPort(3306);                     // 端口,默认是3306


// 打开数据库
if (!db.open()) {	// 数据库打开失败
	QMessageBox::warning(this, "警报", db.lastError().text());	// 显示错误信息
	return;
} else {
	QMessageBox::information(this, "提示", "数据库连接成功");
}

当成功连接到数据库:
在这里插入图片描述


QString sql = "";

特别注意:
操作数据库增删改查时,需要用到QSqlQuery query;;当每次需要操作时,最好都是定义一个新的去操作,避免不必要的操作失败!(这是经验所得)

创建表

create table 表名(列名 类型, ..., 列名 类型);

// 创建表
QSqlQuery query;	// *对数据进行操作所需要使用到的对象*
// 定义sql语句
sql = "create table qt_test_table(id int PRIMARY KEY AUTO_INCREMENT, name varchar(32), age int, score int);";
// 执行sql语句
query.exec(sql);	

插入单条数据

insert into 表名 values(数据1, 数据2, ..., 数据n);

// 插入数据
sql = "insert into qt_test_table values(1, '小明', 00, 59);";
query.exec(sql);	// 执行sql语句

批量插入数据

  1. 风格一:odbc风格

    // 创建预处理语句:?相当于 占位符
    query.exec("insert into qt_test_table(name, age, score) values(?, ?, ?);");
    // 给字段设置内容
    QVariantList nameList;
    nameList << "小红" << "小黄" << "小蓝" << "小紫";
    QVariantList ageList;
    ageList << 11 << 22 << 33 << 44;
    QVariantList scoreList;
    scoreList << 69 << 79 << 89 << 99;
    // 给字段绑定相应的值,按顺序绑定
    query.addBindValue(nameList);
    query.addBindValue(ageList);
    query.addBindValue(scoreList);
    // 执行预处理命令
    query.execBatch();
    

    插入结果如下图:在这里插入图片描述

  2. 风格二:oracle风格

    与风格一差不多,区别在于占位符与绑定顺序。

    // 创建预处理语句:占位符  : + 自定义名字(一般写跟字段名一致)
    query.prepare("insert into qt_test_table(name, age, score) values(:name, :age, :score);");
    // 给字段设置内容
    QVariantList _nameList;
    _nameList << "小绿" << "小黑" << "小白" << "小橙";
    QVariantList _ageList;
    _ageList << 55 << 66 << 77 << 88;
    QVariantList _scoreList;
    _scoreList << 19 << 29 << 39 << 49;
    // 给字段绑定相应的值,不局限于顺序
    query.bindValue(":name", _nameList);
    query.bindValue(":score", _scoreList);
    query.bindValue(":age", _ageList);
    // 执行预处理命令
    query.execBatch();
    

    插入结果如下图:
    在这里插入图片描述


删除数据

delete from 表名 where 条件;

// 删除数据
sql = QString("delete from qt_test_table where name = '小明';");
query.exec(sql);

更新数据

update 表名 set 列名 = ***, ..., 列名 = *** where 条件;

// 更新数据
sql = QString("update qt_test_table set name = '小小晓晓', age = 18, score = 100 where id = 2;");
query.exec(sql);

查询数据

使用.next()方法指向下一条记录,如果还有则返回true,如果没有了则返回false。

通过.value()可以获得对应字段的内容;
可以通过数字下标方式获得,也可以通过字段名获得。

select * from 表名; 查询全部
select 字段名 from 表名; 仅查询该字段内容
select * from 表名 where 条件; 条件查询

// 查询数据
query.exec("select * from qt_test_table;");		// 查询全部
//query.exec("select * from qt_test_table where id = 2;");	// 条件查询
// 当查询完数据返回false
while (query.next()) {
	qDebug() << query.value(0).toInt()			// 第一个字段
			 << query.value(1).toString()		// 第二个字段
			 << query.value("age").toInt()		// 也可以通过字段名进行获取
			 << query.value("score").toInt();
}

在这里插入图片描述


删除表

drop table 表名;

// 删除表
query.exec("drop table qt_test_table;");

释放数据库连接

当不在使用数据库时,记得释放数据库的连接

// 释放数据库连接  
db.close();         

获得当前数据库对象

有时候我们的数据库对象是在构造函数里定义的,但是如果我们需要在私有的方法里使用它,该如何使用呢?

很简单,一行代码的事:

QSqlDatabase::database();	// 返回当前数据库对象

使用它就可以返回当前数据库对象,进而做其他操作!


总结:
各语言连接数据库的方式都是大同小异,需要注意语言的特性,需要添加那些辅助的东西才可以进行正常连接!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cpp_learners

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

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

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

打赏作者

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

抵扣说明:

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

余额充值