Qt-数据库操作

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  测试及说明

先创建一个工程:

Qt-数据库操作

使用QSqlDatabase::drivers();函数查看Qt支持的数据库驱动,可以看到支持:("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")这些数据库。

1、简单的使用

接下来,我要以root用户操作test数据库,对test数据库的表进行操作:

Qt-数据库操作

 大致步骤如下:

(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);");

执行的时候可能会报以下错误:

Qt-数据库操作

这时,我们将MySql的安装路径下的文件拷贝到Qt的安装目录下,关闭Qt,再次打开执行就不会报错了:

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 }
View Code

运行测试:

Qt-数据库操作

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();

推荐使用方式二。

后续还需继续补充。

Qt-数据库操作

上一篇:spark 双master 一直处于standby的异常情况


下一篇:sql进阶join