Qt连接MySQL数据库常用操纵

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

1、MySQL数据库的设置

首先添加Qt程序需要访问MySQL数据库的用户,添加MySQL用户,在MySQL8.0之后,默认的加密方式为:caching_sha2_password,低版本的Navicat连接数据库时间报如下错误提示

高版本连接器无此报错。办理错误的方法,只需要设置密码加密类型为:mysql_native_password,即可。
关于用户密码加密方式的介绍,可以查看这篇文章:深入分析MySQL中的mysql_native_password与ALTER USER命令:提拔数据库安全性的利器_mysql native password-CSDN博客
添加MySQL访问用户:
  1. -- 创建MySQL用户
  2. create user 'qtuser'@'%' identified with mysql_native_password by '123456';
  3. -- 给用户赋予数据库操作权限
  4. grant all privileges on *.* to 'qtuser'@'%';
  5. -- 刷新权限
  6. flush privileges;
复制代码
已有用户设置用户加密类型语句为:
  1. -- 修改用户的密码加密方式为caching_sha2_password
  2. alter user 'qtuser'@'%' identified with caching_sha2_password by '123456';
  3. -- 刷新用户权限
  4. flush privileges;
复制代码
2、Qt连接并操纵MySQL数据库

要在工程的pro中添加
  1. QT += sql
复制代码

(1)数据库连接

如果要实现重新连接网络之后自动重连数据库,需要设置db.setConnectOptions("MYSQL_OPT_RECONNECT=1");
  1.     QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
  2.     db.setPort(3306);
  3.     db.setHostName("192.168.10.180");
  4.     db.setUserName("qtuser");
  5.     db.setPassword("123456");
  6.     db.setDatabaseName("world");
  7.     db.setConnectOptions("MYSQL_OPT_RECONNECT=1");//断网重联
  8.     if(db.open())
  9.     {
  10.         qDebug()<<"connect success";
  11.     }
  12.     else {
  13.         qDebug()<<"connect failed!"<<db.lastError().text();
  14.     }
复制代码
(2)插入数据

如果要实现向数据库中插入中文,需要在插入前设置插入字符类型
db.exec("SET NAMES 'UTF8'");
  1.     db.exec("SET NAMES 'UTF8'");//防止插入的中文数据为乱码
  2.     QSqlQuery query(db);
  3.     QString sqlStr = "insert into city(Name,CountryCode,District,Population)values(:Name,:CountryCode,:District,:Population);";
  4.     query.prepare(sqlStr);
  5.     query.bindValue(":Name","洛阳");
  6.     query.bindValue(":CountryCode","AFG");
  7.     query.bindValue(":District","河南");
  8.     query.bindValue(":Population",7079100);
  9.     if(query.exec()){
  10.         qDebug()<<"insert success!";
  11.     }else{
  12.         qDebug()<<"insert failed:"<<query.lastError().text();
  13.     }
复制代码
(3)查询数据

  1.     QVector<CityStruct>rec;
  2.     QSqlQuery query(db);
  3.     query.prepare("select * from city where CountryCode=:CountryCode order by ID desc;");
  4.     query.bindValue(":CountryCode",mCode);
  5.     if(query.exec())
  6.     {
  7.          while (query.next()) {
  8.              CityStruct city;
  9.              city.ID = query.record().value("ID").toInt();
  10.              city.Name = query.record().value("Name").toString();
  11.              city.CountryCode = query.record().value("CountryCode").toString();
  12.              city.District = query.record().value("District").toString();
  13.              city.Population = query.record().value("Population").toInt();
  14.              rec.push_back(city);
  15.          }
  16.     }
  17.     return rec;
复制代码
(4)更新数据

  1.     db.exec("SET NAMES 'UTF8'");
  2.     QSqlQuery query(db);
  3.     query.prepare("update city set Name=:Name where ID=:ID;");
  4.     query.bindValue(":Name","上海");
  5.     query.bindValue(":ID",4084);
  6.     if(query.exec()){
  7.         qDebug()<<"udpate success!";
  8.     }else{
  9.         qDebug()<<"update failed:"<<query.lastError().text();
  10.     }
复制代码
3、可能出现的报错环境

(1)无法加载驱动器

 安装的有MySQL,有些环境下运行之后会出现无法加载MySQL驱动器,如下的报错

明显可用的驱动器有QMYSQL,但是照旧提示“QMYSQL driver not loaded”,需要重新下载MySQL连接驱动器,所在:MySQL :: Download MySQL Connector/C (Archived Versions)

解压之后,只需要把libmysql.dll和libmysql.lib拷贝到Qt安装目次中的bin下面即可。

(2)连接失败(SSL connection error)


需要打卡MySQL的设置文件my.ini,在设置文件中加入跳过ssl验证的设置
  1. #disable ssl
  2. skip_ssl
复制代码


(3)在命令行中显示的是乱码

在登录的时间设置字符集登录,命令如下:
  1. mysql --default-character-set=utf8mb4 -u username -p
复制代码
以上不能办理乱码问题,查看数据库的字符集,登录数据库之后,输入命令如下:

如果其中有些参数不是utf8mb4,需要修改MySQL的设置文件
  1. [client]
  2. default-character-set=utf8mb4
  3. [mysql]
  4. default-character-set=utf8mb4
  5. [mysqld]
  6. character-set-server=utf8mb4
  7. # 用来控制字符集客户端握手的跳过行为。
  8. # 当这个选项被设置为1时,MySQL服务器在握手阶段将不会尝试使用客户端提供的字符集,而是使用服务器默认的字符集。
  9. # 这通常用于解决客户端与服务器之间字符集不兼容的问题。
  10. skip-character-set-client-handshake=1
  11. collation-server = utf8mb4_unicode_ci
  12. init_connect='SET NAMES utf8mb4'
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表