Qt连接MySQL数据库常用操纵
1、MySQL数据库的设置首先添加Qt程序需要访问MySQL数据库的用户,添加MySQL用户,在MySQL8.0之后,默认的加密方式为:caching_sha2_password,低版本的Navicat连接数据库时间报如下错误提示
https://i-blog.csdnimg.cn/direct/27c1c98c53f14f3a9842cae6d65489af.png
高版本连接器无此报错。办理错误的方法,只需要设置密码加密类型为:mysql_native_password,即可。
关于用户密码加密方式的介绍,可以查看这篇文章:深入分析MySQL中的mysql_native_password与ALTER USER命令:提拔数据库安全性的利器_mysql native password-CSDN博客
添加MySQL访问用户:
-- 创建MySQL用户
create user 'qtuser'@'%' identified with mysql_native_password by '123456';
-- 给用户赋予数据库操作权限
grant all privileges on *.* to 'qtuser'@'%';
-- 刷新权限
flush privileges; 已有用户设置用户加密类型语句为:
-- 修改用户的密码加密方式为caching_sha2_password
alter user 'qtuser'@'%' identified with caching_sha2_password by '123456';
-- 刷新用户权限
flush privileges; 2、Qt连接并操纵MySQL数据库
要在工程的pro中添加
QT += sql
(1)数据库连接
如果要实现重新连接网络之后自动重连数据库,需要设置db.setConnectOptions("MYSQL_OPT_RECONNECT=1");
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setPort(3306);
db.setHostName("192.168.10.180");
db.setUserName("qtuser");
db.setPassword("123456");
db.setDatabaseName("world");
db.setConnectOptions("MYSQL_OPT_RECONNECT=1");//断网重联
if(db.open())
{
qDebug()<<"connect success";
}
else {
qDebug()<<"connect failed!"<<db.lastError().text();
} (2)插入数据
如果要实现向数据库中插入中文,需要在插入前设置插入字符类型
db.exec("SET NAMES 'UTF8'");
db.exec("SET NAMES 'UTF8'");//防止插入的中文数据为乱码
QSqlQuery query(db);
QString sqlStr = "insert into city(Name,CountryCode,District,Population)values(:Name,:CountryCode,:District,:Population);";
query.prepare(sqlStr);
query.bindValue(":Name","洛阳");
query.bindValue(":CountryCode","AFG");
query.bindValue(":District","河南");
query.bindValue(":Population",7079100);
if(query.exec()){
qDebug()<<"insert success!";
}else{
qDebug()<<"insert failed:"<<query.lastError().text();
} (3)查询数据
QVector<CityStruct>rec;
QSqlQuery query(db);
query.prepare("select * from city where CountryCode=:CountryCode order by ID desc;");
query.bindValue(":CountryCode",mCode);
if(query.exec())
{
while (query.next()) {
CityStruct city;
city.ID = query.record().value("ID").toInt();
city.Name = query.record().value("Name").toString();
city.CountryCode = query.record().value("CountryCode").toString();
city.District = query.record().value("District").toString();
city.Population = query.record().value("Population").toInt();
rec.push_back(city);
}
}
return rec; (4)更新数据
db.exec("SET NAMES 'UTF8'");
QSqlQuery query(db);
query.prepare("update city set Name=:Name where ID=:ID;");
query.bindValue(":Name","上海");
query.bindValue(":ID",4084);
if(query.exec()){
qDebug()<<"udpate success!";
}else{
qDebug()<<"update failed:"<<query.lastError().text();
} 3、可能出现的报错环境
(1)无法加载驱动器
安装的有MySQL,有些环境下运行之后会出现无法加载MySQL驱动器,如下的报错
https://i-blog.csdnimg.cn/direct/bee68e566be245f685df576a674cb937.png
明显可用的驱动器有QMYSQL,但是照旧提示“QMYSQL driver not loaded”,需要重新下载MySQL连接驱动器,所在:MySQL :: Download MySQL Connector/C (Archived Versions)
https://i-blog.csdnimg.cn/direct/7c1230c7fb0f4572ae38c7f801345487.png
解压之后,只需要把libmysql.dll和libmysql.lib拷贝到Qt安装目次中的bin下面即可。
https://i-blog.csdnimg.cn/direct/dc723652aff34e4a88ae1c665e1c5600.png
(2)连接失败(SSL connection error)
https://i-blog.csdnimg.cn/direct/ae09e501632648678bfa7ee3ee3810e4.png
需要打卡MySQL的设置文件my.ini,在设置文件中加入跳过ssl验证的设置
#disable ssl
skip_ssl https://i-blog.csdnimg.cn/direct/5f7c345da600472bbd55fda04817c81f.png
https://i-blog.csdnimg.cn/direct/be329ffbb5c340049e4e1b6a35064e5a.png
(3)在命令行中显示的是乱码
在登录的时间设置字符集登录,命令如下:
mysql --default-character-set=utf8mb4 -u username -p 以上不能办理乱码问题,查看数据库的字符集,登录数据库之后,输入命令如下:
https://i-blog.csdnimg.cn/direct/9e063e27b7d64c8dbfcc7ea25c4510d9.png
如果其中有些参数不是utf8mb4,需要修改MySQL的设置文件
default-character-set=utf8mb4
default-character-set=utf8mb4
character-set-server=utf8mb4
# 用来控制字符集客户端握手的跳过行为。
# 当这个选项被设置为1时,MySQL服务器在握手阶段将不会尝试使用客户端提供的字符集,而是使用服务器默认的字符集。
# 这通常用于解决客户端与服务器之间字符集不兼容的问题。
skip-character-set-client-handshake=1
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]