1 简介
参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=87
说明:本文简单说明在Qt中操作数据库,用MySql数据库进行试验。
Qt 提供了QtSql模块来提供平*立的基于 SQL 的数据库操作。
2 MySql的安装及简单使用
视频对应的资源文件已经说得很清楚了,这里就不单独进行说明了。给出下载的链接:
链接:https://pan.baidu.com/s/1ZThzPvYs41dlGeAid--agg
提取码:zony
sql语句也不在这里进行说明,去查询相关的资料即可。
3 测试及说明
先创建一个工程:
使用QSqlDatabase::drivers();函数查看Qt支持的数据库驱动,可以看到支持:("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")这些数据库。
1、简单的使用
接下来,我要以root用户操作test数据库,对test数据库的表进行操作:
大致步骤如下:
(1)添加sql模块
在.pro文件中添加语句:QT += core gui sql
(2)添加MySql数据库
1 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
(3)连接数据库
1 db.setHostName("127.0.0.1"); //数据库服务器IP 2 db.setUserName("root"); //数据库用户名 3 db.setPassword("123456"); //密码 4 db.setDatabaseName("test"); //使用哪个数据库
(4)打开数据库
1 if (db.open() == false) { 2 QMessageBox::warning(this, "错误", db.lastError().text()); 3 return; 4 }
(5)执行sql语句
1 //操作sql语句 2 QSqlQuery query; 3 query.exec("create table student(id int primary key, name varchar(255), age int, score int);");
执行的时候可能会报以下错误:
这时,我们将MySql的安装路径下的文件拷贝到Qt的安装目录下,关闭Qt,再次打开执行就不会报错了:
上述步骤的完整代码:
1 Widget::Widget(QWidget *parent) : 2 QWidget(parent), 3 ui(new Ui::Widget) 4 { 5 ui->setupUi(this); 6 7 //打印qt支持的数据库驱动 8 qDebug() << QSqlDatabase::drivers(); 9 10 //添加MySql数据库 11 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 12 //连接数据库 13 db.setHostName("127.0.0.1"); //数据库服务器IP 14 db.setUserName("root"); //数据库用户名 15 db.setPassword("123456"); //密码 16 db.setDatabaseName("test"); //使用哪个数据库 17 //打开数据库 18 if (db.open() == false) { 19 QMessageBox::warning(this, "错误", db.lastError().text()); 20 return; 21 } 22 //操作sql语句 23 QSqlQuery query; 24 query.exec("create table student(id int primary key, name varchar(255), age int, score int);"); 25 }
运行测试:
2、使用方式2
在添加MySql时,我们给数据库连接一个名字,addDatabase函数的第二个参数,这样可以为一个数据库建立多个连接。
1 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "mydb");
通过这种方式,我们使用QSqlQuery执行MySql语句时,必须指定数据库名字:
1 1 //操作sql语句 2 2 QSqlQuery query(db); 3 3 query.exec("insert into student(id, name, age, score) values(1, ‘mike‘, 18, 59);");
3、批量插入
(1)方式一:
1 //odbc风格 2 //预处理语句 3 query.prepare("insert into student(name, age, score) values(?, ?, ?);"); 4 // 给字段设置内容 5 QVariantList nameList; 6 nameList << "xiaoming" << "xiaokong" << "xiaojiang"; 7 QVariantList ageList; 8 ageList << 22 << 21 << 24; 9 QVariantList scoreList; 10 scoreList << 89 << 99 << 78; 11 //给字段绑定相应的值,必须按顺序绑定 12 query.addBindValue(nameList); 13 query.addBindValue(ageList); 14 query.addBindValue(scoreList); 15 //执行预处理命令 16 query.execBatch();
QSqlQuery::prepare()函数对这条 SQL 语句进行预处理,问号 ? 相当于占位符,预示着以后我们可以使用实际数据替换这些位置。
QSqlQuery::addBindValue()我们将实际数据绑定到这个预处理的 SQL 语句上。
QSqlQuery::execBatch()批量执行 SQL,之后结束该对象。
(2)方式二:
1 //oracle风格:占位符 + 自定义名字 2 query.prepare("insert into student(name, age, score) values(:name, :age, :score)"); 3 //给字段设置内容 4 QVariantList nameList; 5 nameList << "xiaoa" << "xiaob" << "xiaoc"; 6 QVariantList ageList; 7 ageList << 21 << 19 << 24; 8 QVariantList scoreList; 9 scoreList << 77 << 66 << 70; 10 //给字段绑定对应的值,不需要指定顺序 11 query.bindValue(":name", nameList); 12 query.bindValue(":score", scoreList); 13 query.bindValue(":age", ageList); 14 //执行预处理命令 15 query.execBatch();
推荐使用方式二。
后续还需继续补充。