Qt 如何操作数据库SQL模块


内容提要

介绍数据库相关内容,了解连接数据库方法,掌握数据库的4种基本操作

主要内容

  1. 如何连接数据库
  2. 数据库的4大基本操作

1.如何连接数据库

1.1 先了解数据库驱动的作用

  Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,数据库驱动起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。

以下是Qt支持的数据库驱动

如何查看当前版本Qt支持的数据库驱动

step1 新建一个项目Qt widgets项目,名称为myDataBaseDrivers,基类为QWidget

step2 在项目的.pro文件中,增加一条语句

QT += sql

step3 在 widget.h 中,添加以下代码

1 #include <QtSql/QSqlDatabase> 2 #include <QDebug>

step4 在 widgetpp 中,添加以下代码

qDebug() << QSqlDatabase::drivers();

此时程序应该是这样的

step5 Ctrl+r 运行程序,观察运行结果

从结果可以看出,没有MYSQL数据库的驱动,那我现在想使用这个数据库是不行的,需要添加这个驱动。

1.2 连接数据库

要想连接数据库,我们可以通过QSqlDatabase类实现。连接的方法也很简单,参考下面的代码

1 // 创建一个数据库连接,指定数据库驱动 2 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

设置数据库信息

1 // 数据库连接需要设置的信息 2 db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑 3 db.setDatabaseName("ceshi");// 数据库名 4 db.setUserName("root");// 用户名 5 db.setPassword("123456");// 密码 6 db.setPort(3306);// 端口号

连接数据库

1 // 连接数据库 2 bool ok = db.open(); 3 4 if (ok) 5 8 else 9

此时程序应该是这样的

Ctrl+r的运行结果是这样的

  另外需要注意的是,QSqlDatabase::?addDatabase()函数的第一个参数,是指定数据库的类型,如“QPSQL”,“QMYSQL”,第二个参数是 connectionName。如果在多线程里访问数据库,每个线程都需要使用不同的 connectionName,否则可能会出现错误。

为了便于使用,将上面的数据库连接封装成一个函数

widget.h文件修改,增加两个函数声明

1 private: 2 void createConnectionByName(const QString &connectionName); //使用自定义 connectionName 创建连接 3 QSqlDatabase getConnectionByName(const QString &connectionName); // 使用自定义 connectionName 获取连接

widgetpp文件修改,实现上述两个函数

1 //使用自定义 connectionName 创建连接 2 void Widget::createConnectionByName(const QString &connectionName) else 20 21 } 22 23 // 使用自定义 connectionName 获取连接 24 QSqlDatabase Widget::getConnectionByName(const QString &connectionName)

函数调用

1 // 创建名为 firstConnect 的数据库连接 2 createConnectionByName("firstConnect");

修改后代码应该是这样的

2.数据库的4大基本操作

Qt里要执行SQL语句和浏览查询结果,通常使用QSqlQuery这个类来实现。

QSqlQuery常用函数整理

数据库SQL的几个常用的基本语法

2.1 增

增操作就是想数据库中插入输入,在做增操作前,我们需要先建立一个数据库表,用于做增删改查操作测试。核心SQL语句是

insert into 表名 (字段名1,字段名2,...字段名N) value (值1,值2,...值N)

step1 在前面代码的基础上,向 widget.h 文件中,增加一个头文件

#include <QSqlQuery>

step2 在 widgetpp 中,增加创建数据库表的语句

1 // 实例化QSqlQuery,用于执行sql语句 2 QSqlQuery query(db); 3 // 创建一个表 4 query.exec("create table newUser (id int primary key,username varchar(20))");

创建的这个表很简单,只有id和uername两项信息

step3 在 widget.h 增加函数声明

1 private: 2 void insertUserName(QSqlDatabase db,const int &userid, const QString &name); // 增操作

step4 在 widgetpp 实现增函数,用名称绑定的方式实现

1 /* 2 * 功能描述:数据增操作 3 * 向数据库中插入一条数据记录,名称绑定的方式实现 4 * @param QSqlDatabase:数据库连接 5 * @param id:用户id 6 * @param username:用户名 7 */ 8 void Widget::insertUserName(QSqlDatabase db,const int &userid, const QString &name)

step5 向数据库表中增加数据,实现增操作

1 // [2]增操作 2 qDebug() << " insert operation start"; 3 insertUserName(db,1,"xiaoqiao"); 4 insertUserName(db,2,"wang"); 5 query.exec("INSERT INTO newUser (id, username) VALUES (3, 'alex')"); 6 insertUserName(db,4,"lili"); 7 8 queryAllUser(db); // 查询增操作结果 9 qDebug() << " insert operation end " << "\n ";

插入一条数据记录可以使用名称绑定的方式,也是可以直接使用一条SQL语句的方式,当需要插入多条数据时,可以考虑用名称绑定的方式,这样不需要每次都写非常长的数据库指令,相对来说方便一些。

此是代码应该是这样的

step6 ctrl+r 运行程序 使用后面查操作,可以看到增加到数据库的新数据记录

2.2 删

删操作就是从数据库中删除数据记录,核心SQL语句是

delete fr 表名 where 删除条件

step1 在 widget.h 增加函数声明

1 private: 2 void deleteUser(QSqlDatabase db,const QString &username);// 删操作

step2 在 widgetpp 实现删函数,用名称绑定的方式实现

1 /* 2 * 功能描述:数据删操作 3 * 从数据库中删除一条数据,名称绑定的方式实现 4 * @param QSqlDatabase:数据库连接 5 * @param username:用户名 6 */ 7 void Widget::deleteUser(QSqlDatabase db,const QString &username)

step3 调用刚才写的代码,实现删除记录操作

1 // [4]删操作 2 qDebug() << " delete operation start"; 3 deleteUser(db,"alex"); 4 query.exec(" DELETE FR newUser WHERE username='wang' "); 5 6 queryAllUser(db); 7 qDebug() << " query operation end" << "\n ";

两种方式删除记录,名称绑定的方式和直接使用SQL语句的方式

此时代码应该是这样的

step4 ctrl+r 运行程序

使用后面查操作,可以看到删操作后,数据库的记录变化

2.3 改

改操作就是修改数据库记录,核心SQL语句是

update 表名 set 字段名1=新值1,字段名2=新值2 where 条件语句

step1 在 widget.h 增加函数声明

1 private: 2 void updateUser(QSqlDatabase db,const int &id,const QString &username); // 更操作,修改数据

step2 在 widgetpp 实现该操作函数

1 /* 2 * 功能描述:更新数据 3 * 修改传入的 id 的 username 4 * @param QSqlDatabase:数据库连接 5 * @param id:用户id 6 * @param username:用户名 7 */ 8 void Widget::updateUser(QSqlDatabase db,const int &id,const QString &username)

step3 调用刚才写的代码,实现查询记录操作

1 // [5]改操作,根据id修改数据 2 qDebug() << " update operation start"; 3 qDebug() << " before update id 1: "; 4 queryAllUser(db); 5 6 updateUser(db,1,"yase");// ID为1,数据修改为 yase 7 query.exec(" update newUser set username='newname' WHERE id=4"); 8 9 qDebug() << " after update id 1: "; 10 queryAllUser(db); 11 qDebug() << " update operation end" << "\n ";

此时代码应该是这样的

step4 ctrl+r 运行程序,查看结果

2.4 查

查操作就是查询数据库记录,核心SQL语句是

select * fr 表名
select 字段名1,字段名2 fr 表名 where 查询条件

step1 在 widget.h 增加函数声明

1 private: 2 void queryAllUser(QSqlDatabase db); // 查操作,查询所有数据记录 3 void selectQueryUser(QSqlDatabase db,const QString &username); // 查操作,直接执行SQL语句方式 4 void preparedQueryUser(QSqlDatabase db,const QString &username);// 查操作,名称绑定方式

step2 在 widgetpp 实现查询函数

查询所有数据

1 /* 2 * 功能描述:数据查操作,查询所有数据 3 * 执行SQL语句的方式,查询所有的用户数据记录 4 * @param QSqlDatabase:数据库连接 5 */ 6 void Widget::queryAllUser(QSqlDatabase db) 15 }

查询一条数据,直接用sql的方式

1 /* 2 * 功能描述:查询一条数据记录 3 * 数据查操作,SQL语句的方式实现 4 * @param QSqlDatabase:数据库连接 5 * @param username:用户名 6 */ 7 void Widget::selectQueryUser(QSqlDatabase db,const QString &username) 17 }

查询一条数据,名称绑定的方式

1 /* 2 * 功能描述:查询一条数据记录 3 * 数据查操作,名称绑定的方式实现 4 * @param QSqlDatabase:数据库连接 5 * @param username:用户名 6 */ 7 void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) 19 }

step3 调用刚才写的代码,实现查询记录操作

查询所有数据

1 qDebug() << " query all data start "; 2 queryAllUser(db); // 查询所有数据 3 qDebug() << " query all data end " << "\n ";

名称绑定的方式查询一条数据记录

preparedQueryUser(db,"wang");

直接用SQL语句的方式查询一条数据记录

selectQueryUser(db,"lili"); // 直接执行sql语句方式

此时代码应该是这样的

step4 ctrl+r 运行程序

以上只是简单的实现增删改查操作,实际开发应用的时候,会比这个复杂,但是基本的实现过程是一样的,想了解数据库的其他操作,可以找找数据库相关的文档看一下。

添附

myDataBaseDrivers 项目 widget.h 源码

1 #ifndef WIDGET_H 2 #define WIDGET_H 3 4 #include <QWidget> 5 #include <QtSql/QSqlDatabase> 6 #include <QDebug> 7 #include <QSqlQuery> 8 9 QT_BEGIN_NAMESPACE 10 namespace Ui 11 QT_END_NAMESPACE 12 13 class Widget : public QWidget 14 ; 35 #endif // WIDGET_H

myDataBaseDrivers 项目 widgetpp 源码

1 #include "widget.h" 2 #include "ui_widget.h" 3 4 Widget::Widget(QWidget *parent) 5 : QWidget(parent) 6 , ui(new Ui::Widget) 7 72 73 74 /* 75 * 功能描述:更新数据 76 * 修改传入的 id 的 username 77 * @param QSqlDatabase:数据库连接 78 * @param id:用户id 79 * @param username:用户名 80 */ 81 void Widget::updateUser(QSqlDatabase db,const int &id,const QString &username) 88 89 90 /* 91 * 功能描述:数据查操作,查询所有数据 92 * 执行SQL语句的方式,查询所有的用户数据记录 93 * @param QSqlDatabase:数据库连接 94 */ 95 void Widget::queryAllUser(QSqlDatabase db) 104 } 105 106 /* 107 * 功能描述:查询一条数据记录 108 * 数据查操作,SQL语句的方式实现 109 * @param QSqlDatabase:数据库连接 110 * @param username:用户名 111 */ 112 void Widget::selectQueryUser(QSqlDatabase db,const QString &username) 122 } 123 124 /* 125 * 功能描述:查询一条数据记录 126 * 数据查操作,名称绑定的方式实现 127 * @param QSqlDatabase:数据库连接 128 * @param username:用户名 129 */ 130 void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) 142 } 143 144 145 146 /* 147 * 功能描述:数据删操作 148 * 从数据库中删除一条数据,名称绑定的方式实现 149 * @param QSqlDatabase:数据库连接 150 * @param username:用户名 151 */ 152 void Widget::deleteUser(QSqlDatabase db,const QString &username) 158 159 160 /* 161 * 功能描述:数据增操作 162 * 向数据库中插入一条数据记录,名称绑定的方式实现 1 * @param QSqlDatabase:数据库连接 164 * @param id:用户id 165 * @param username:用户名 166 */ 167 void Widget::insertUserName(QSqlDatabase db,const int &userid, const QString &name) 174 175 176 /* 177 * 功能描述:创建数据库连接 178 * 使用自定义 connectionName 创建连接 179 * @param connectionName:连接的名称 180 */ 181 void Widget::createConnectionByName(const QString &connectionName) else 199 200 } 201 202 /* 203 * 功能描述:获取数据库连接 204 * 使用自定义 connectionName 获取连接 205 * @param connectionName:连接的名称 206 * @return 返回一个数据库连接 207 */ 208 QSqlDatabase Widget::getConnectionByName(const QString &connectionName) 212 213 214 215 Widget::~Widget() 216






上一篇:Qt QVector 详解:从底层原理到高级用法

下一篇:C/C++ 操作ini文件(SinpleIni 跨平台库)


Qt
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图