Qt 5.9连接MySQL5.7(32/64位)
-
MySQL5.7安装好后将其安装路径lib下 libmysql.dll 和 libmysqld.dll 两个动态链接库文件复制到Qt 相应编译环境(我用的mingw53_32)安装目录bin下即可
-
注:因为QT的mingw编译器是32位的,如果安装的MySQL是64位的话需将上面那个libmysql.dll替换为此libmysql.dll ( 提取码:m9iz)
-
远程连接数据库配置:需关闭防火墙、停用开机密码,然后用命令提示符进入数据库执行以下SQL语句即可(如何执行?)
use mysql; grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
-
测试
#.pro QT += sql widgets
//.cpp #include "mainwindow.h" #include <QApplication> #include <QtSql/QSqlDatabase> #include <QSqlQuery> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("127.0.0.1"); //此为本地连接,可设主机IP db.setPort(3306); db.setDatabaseName("cpp_info"); //数据库名 db.setUserName("root"); db.setPassword("******"); //数据库密码 if(db.open()) { qDebug()<<"数据库连接成功!!!"; } /*操作数据库*/ return a.exec(); }
操作数据库(QSqlQuery类)
执行SQL语句(查)
- 以查询为例
QSqlQuery query(db); //此处db对象为上文使用QSqlDatabase类连接MySQL所创建 query.exec("select * from data"); //查询data表
浏览结果集方法
- 执行完exec()后,QSqlQuery的内部指针将位于第一条记录前面的位置(需调用一次next()函数将指针指向下一条也就是第一条记录)
//查询data表后 //定位到 query.next(); //下一条记录索引,如果下一条记录不存在时则返回false,以下函数同理不存在返回false query.previous(); //上一条 query.first(); //第一条 query.seek(index); //第index条 query.last(); //最后一条 //记录 query.record(); //返回当前指向的记录 query.at(); //返回当前记录的索引 query.size(); //返回结果集的总条数 //字段 query.value(n); //返回当前内部指针指向的记录的一个字段值,索引(n)从0开始
增、删、改
-
直接增加(插入)
//方法一 query.exec("insert into data(account,password) values('user', 'xxxxxx')");
-
使用占位符(名称绑定、位置绑定)
//方法二(名称绑定) QString account = "user", password = "xxxxxx"; query.prepare("insert into data(account,password) values(:account, :password)"); query.bindValue(":account", account); query.bindValue(":password", password); query.exec(); //执行 //方法三(位置绑定) QString account = "user", password = "xxxxxx"; query.prepare("insert into data(account,password) values(?, ?)"); query.addBindValue(account); query.addBindValue(password); query.exec(); //执行
-
增加多条记录(方法一、二皆可)
QVariantList account_list, password_list; //创建两个可以存储任意类型的列表对象 account_list << "user_1" << "user_2"; password_list << "111111" << "222222"; //方法一:名称绑定 query.prepare("insert into data(account,password) values(:account, :password)"); query.bindValue(":account", account_list); query.bindValue(":password", password_list); //方法二:位置绑定 query.prepare("insert into data(account,password) values(?, ?)"); query.addBindValue(account_list); query.addBindValue(password_list); query.execBatch(); //批处理执行,若出错返回false,可用lastError()返回错误信息,需#include<QSqlError>
-
删除
query.exec("delete from data where account = 'user'"); //删除user所对应的记录
-
修改(更新)
query.exec("update data set account = 'user_new' where account = 'user'");
-
注:删除和修改亦可使用占位符,和增加类似,就不做介绍了
事务
事务可以保证复杂操作的原子性,即对于一个数据库操作序列,这些操作要么全部做完,要么一条也不做,它是一个不可分割的工作单位,流程如下
- 使用QSqlDatabase::transaction() 来启动一个事务(必须在创建QSqlQuery的对象以前使用)
- 使用QSqlQuery类执行SQL语句
- 调用QSqlDatabase::rollback() 回滚 或是 调用QSqlDatabase::commit() 提交事务
参考书籍:Qt Creator快速入门(第三版)