QT操作mysql数据
Header: include
qmake: QT += sql
首先需要在QT项目文件的*.pro文件中添加: QT += core gui sql
所用到的头文件:
#include <qDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
1. 加载数据库驱动
将libmysql.dll库放到下面的目录下: D:\QT\Qt5.10.1\5.10.1\mingw53_32\bin
//查看QT支持的驱动
qDebug() << QSqlDatabase::drivers();
输出结果为:
//("QSQLITE", "QMYSQL", "QMYSQL3", "QOCI", "QOCI8", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
2. 设置账号密码
设置账号和密码信息使用QSqlDatabase类的成员函数:
void setHostName(const QString &host)
void setPassword(const QString &password)
void setPort(int port)
void setUserName(const QString &name)
void setDatabaseName(const QString &name)
使用方法, 如下所示
db.setHostName("192.168.10.145"); //设置mysql主机的IP地址
db.setDatabaseName("scott"); //设置数据库名
db.setUserName("root"); //设置用户名
db.setPassword("123456"); //设置密码
其实上面这几步就类似于登录mysql数据库需要的关键信息:
mysql -h192.168.10.145 -uroot -p123456 scott
3. 打开数据库
bool QSqlDatabase::open()
详情查看QT帮助手册
使用方法, 如下所示:
if(!db.open())
{
qDebug() << "数据库操作失败";
return;
}
4.执行select查询操作
1 需要使用QSqlQuery类的相关函数:
Header: #include <QSqlQuery>
2 QSqlQuery类的构造函数:
QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
该构造函数都有默认值, 构造的时候可以不指定:
用法: QSqlQuery query;
3 执行select查询语句
3.1 第一种方法, 直接调用exec执行sql语句
例如: query.exec("select * from dept");
3.2 第二种方法,先调用prepare准备一个sql语句, 然后再执行exec执行sql语句
例如:
bool success;
query.prepare("select * from dept");
success = query.exec();
if(!success)
{
qDebug() << "查询失败";
return;
}
4 获取查询表的总字段数
先调用QSqlQuery类的record方法:
QSqlRecord record() const;
然后在调用QSqlRecord类的count方法
int QSqlRecord::count() const
例如:
QSqlRecord rec = query.record();
qDebug() << "查询结果字段总数为:" << rec.count();
//注意: 有的函数有代码示例, 可以直接参考
5 获取查询结果总记录数
调用QSqlQuery类的size方法:
int size() const
例如:
qDebug() << "查询结果记录总数为" << query.size();
6 遍历查询的结果集
获取每一条记录:
bool QSqlQuery::next()
通过列的索引位置获取列的值---列的索引从0开始
QVariant QSqlQuery::value(int index) const
通过列名获取列的值:
QVariant value(const QString &name) const
代码示例:
while(query.next())
{
//qDebug() << query.value(0).toInt() << query.value(1).toString() << query.value(2).toString();
qDebug() << query.value("deptno").toInt() << query.value("dname").toString() <<
query.value("loc").toString();
}
7 移动指向结果集的位置指针:
bool QSqlQuery::seek(int index, bool relative = false)
例如:
query.seek(-1); //每次next都会使记录指针移动一次, 可以使用seek函数重置指针位置,类似于文件指针
5. 执行insert操作
方法1:
query.prepare("insert into dept values(77, 'sports', 'xiuzheng')");
success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "插入失败:" << lastError.driverText() << lastError.databaseText();
return;
}
方法2: 使用带有占位符的sql语句, 该语句不是一个完整的sql语句,需要调用bindValue函数给占位符设置值.
query.prepare("insert into dept values(?, ?, ?)");
//给字段设置值,字段位置索引从0开始
query.bindValue(0, 99);
query.bindValue(1, "SPORTS");
query.bindValue(2, "BEIJING");
success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "插入失败:" << lastError.driverText() << lastError.databaseText();
return;
}
方法3:直接调用exec并将sql语句作为参数也可以直接插入
success = query.exec("insert into dept values(66, 'SALES', 'SHANGHAI')");
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "插入失败:" << lastError.driverText() << lastError.databaseText();
return;
}
6. 执行update操作
方法1:直接调用execl并将sql语句作为参数执行
success = query.exec("update dept set loc='MEIGUO' where deptno=99");
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "update failed" << lastError.driverText() << lastError.databaseText();
return;
}
方法2:使用带有占位符占位符的sql语句
query.prepare("update dept set loc=? where deptno=?");
query.bindValue(0, "JAPAN");
query.bindValue(1, 77);
success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "update failed" << lastError.driverText() << lastError.databaseText();
return;
}
7. 执行delete操作
方法1:直接调用execl并将sql语句作为参数执行
query.exec("delete from dept where deptno=99");
方法2:使用带有占位符的sql语句
query.prepare("delete from dept where deptno=? or loc=?");
query.bindValue(0, 77);
query.bindValue(1, "SHANGHAI");
success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "update failed" << lastError.driverText() << lastError.databaseText();
return;
}
8. 事务处理
1 开启事务
query.exec("START TRANSACTION");
2 设置自动提交和手动提交---->默认情况下mysql是自动提交的
query.exec("SET AUTOCOMMIT=0"); //手动提交
query.exec("SET AUTOCOMMIT=1"); //自动提交
3 事务的提交和回滚操作
query.exec("COMMIT");
query.exec("ROLLBACK");
测试方法: 先开启一个新的事务, 并设置为手动提交, 然后插入数据, 最后回滚, 看数据是否已经插入到数据库中;然
后在修改为提交, 查看数据是否已经插入到数据库中.
测试代码如下:
query.exec("START TRANSACTION");
query.exec("SET AUTOCOMMIT=0"); //手动提交
success = query.exec("insert into dept values(99, 'SALES', 'SHANGHAI')");
if(!success)
{
QSqlError lastError = query.lastError();
qDebug() << "update failed" << lastError.driverText() << lastError.databaseText();
//回滚事务
query.exec("ROLLBACK");
return;
}
//提交事务
query.exec("COMMIT");
9. 关闭数据库
//关闭数据库
db.close();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!