欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 21:41:16
...

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


Qt添加数据库的dll

将mysql文件lib目录下的libmysql.dll和libmysql.lib复制到Qt中的bin文件下。如下图所示;
Qt vs2017连接MySQL数据库 - 增删改查(详细步骤)
Qt vs2017连接MySQL数据库 - 增删改查(详细步骤)

注意:一定要做这一步,不然是无法连接上数据库的!
Qt vs2017连接MySQL数据库 - 增删改查(详细步骤)


连接数据库

添加如下头文件:

#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, "提示", "数据库连接成功");
}

当成功连接到数据库:
Qt vs2017连接MySQL数据库 - 增删改查(详细步骤)


QString sql = "";

创建表

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();
    

    插入结果如下图:Qt vs2017连接MySQL数据库 - 增删改查(详细步骤)

  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();
    

    插入结果如下图:
    Qt vs2017连接MySQL数据库 - 增删改查(详细步骤)


删除数据

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();
}

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


删除表

drop table 表名;

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

释放数据库连接

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

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

获得当前数据库对象

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

很简单,一行代码的事:

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

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


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