c++应用实例二:使用Qt进行MySQL数据库编程

写在开始

上周由于种种原因,鸽了一篇,本周开启c++应用实例的第二篇——数据库编程。数据库分为很多种有大型、中小型等,大型数据库基本是收费的,个人的项目也不会用到。但是大部分数据库的SQL语句是类似的,只有微小差别,大多数c++参考资料上的数据库教程是关于access的,这是微软自带的数据库比较基础、容易上手、规模偏小用来入门数据库比较合适,但实际项目中较少使用。相对与access,MySQL是比较全面的数据库,功能丰富,使用范围比较广泛,本篇文章将介绍基于c++/Qt的MySQL数据库编程。

安装MySQL数据库

MySQL是开源免费的,你可以到官网上下载对应的版本,包括源码版和windows安装包,源码对应命令行安装,需要手动配置my.ini文件,建议参考对应教程,本文只针对windows下的软件安装介绍。

虽然现在MySQL已经更新到了8.0的版本,但是我在安装8.0版本的时候遇到了许多问题,即使通过命令行的方式成功安装,在c++程序中连接数据库时仍旧遇到了阻碍。我使用的Qt版本是Qt 5.6.2与之对应的MySQL版本我选择了MySQL 5.5,再此给出该版本的下载链接一定要注意!,虽然网上很多教程说安装的MySQL软件位数与要与Qt位数一致,但是我要提醒的是,这样说并不严谨,应该是与你的编译的目标软件的位数相同。比如我使用的VS+Qt插件来编写软件,编译软件选择的是32位,但是我的Qt和VS都是64位,此时我应该选择的MySQL软件应该是32位而不是64位,不然就会出现dll加载失败导致链接不上数据库的问题!网上关于该问题的说法都是什么Qt自带的dll文件不能用啦,需要下载Qt源码自己编译得到dll文件了,我只能说有点走弯路了,软件包自带的dll文件没理由不能用,出现问题一定要理性分析,最不可能出问题的地方就是成熟的软件平台。

MySQL测试

安装完成相应的MySQL数据库之后,打开cmd测试数据库是否安装成功,输入

1
$ mysql

在cmd窗口会出现相应的欢迎提示语,命令行的句首也会变成mysql,也许你的命令行会报错,此时可以更换别的登陆方式,在命令窗口输入:

1
$ mysql -u root -p

按照提示输入密码(就是安装mysql时你设置的),然后就成功登陆了,如下图所示:

下面介绍几条常用的mySQL语句(不要忘记在语句的最后面要加;)

1、新建数据库

1
create database 数据库名;

如果新建成功在你的MySQL文件夹中的data子文件夹中应该会生成一个新的子文件夹名字为你的数据库名字
2、链接数据库,表示之后的操作都在这一个数据库中完成

1
use 数据库名;

3、新建表,表是指数据库中存储数据的文件,使用以下mySQL语句:

1
create table 表的名字(name1 type1(range),name2 type(range2)...);

语句执行成功之后在数据库子文件夹中会出现以表的名字命名的文件,后缀名为.frm,新建表时括弧里的是字段名和数据类型及其范围。其中,字段名是自定义的,注意不要与mysql的关键字重复,不然会疯狂报错,然后找不到原因,数据类型有int、float、double、date、string等等,类型括弧里面是数据的约束,比如int(5)代表5位整数,不够的话前面补0,double(5,2)代表双精度小数,5位整数,2位小数。

4、显示表中数据
选择全部数据

1
select * from tablename;

条件筛选,筛选符合rule条件的数据集

1
select * from tablename where rule;

5、插入数据
向表中插入一条数据(记录)

1
insert  into tablename(field1,field2...)values(value1,value2...);

C++/Qt中的MySQL数据库编程

0、包含头文件

1
2
3
4
5
6
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlError>
#include <QSqlTableModel>
#include <QSqlRecord>

1、链接数据库

1
2
3
4
5
6
7
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QMYSQL");//数据库类型
db.setHostName("localhost");
db.setDatabaseName("base1");//链接的数据库名
db.setUserName("用户名");
db.setPassword("密码");
db.open(); //成功返回true,失败返回false

2、使用SQL语句

1
2
3
4
5
6
QSqlQuery mpdQuery(db);
QString strSql = QString("insert into %1(Timee, Tout, Tin, PWM, Flow, Loadd, SW,Duty) values('%2', %3, %4, %5, %6, %7, %8, %9)").arg(
tableName, time.toString("yyyy-MM-dd hh:mm:ss"), QString::number(TO), QString::number(TI),
QString::number(P), QString::number(F), QString::number(L), QString::number(S), QString::number(U)
);//sql语句,与c++中的变量组合
mpdQuery.exec(strSql); //成功返回true,失败返回false

3、从结果集中提取c++变量

1
2
3
4
5
6
7
8
9
10
11
QString strSql = QString("select * from tab3 limit 1");  //选择数据库中第一条数据
QSqlQuery mpdQuery(db);
mpdQuery.exec(strSql); //执行SQL语句
mpdQuery.next(); //执行一次next,即选择第一条记录
QSqlRecord re=mpdQuery.record(); //提取记录
int timeNumber = re.indexOf("time"); // 获取列名为time的列号,从0开始
QDateTime startTime = re.value(timeNumber).toDateTime(); //将数据转换为DateTime型,还有int,double string等等
while(mpdQuery.next()) //遍历结果集中的数据
{

}

小节

数据库编程有其独特的编程语言即SQL语句,通过以上介绍的c++中使用SQL语句编程实现数据的强大功能,需要注意的是每次操作后都对应一个结果集,使用QSqlQuery::next()函数进行遍历。