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访问用户:
-- 创建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!";
}
(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!";
}