Qt 如何操作数据库SQL模块
内容提要
介绍数据库相关内容,了解连接数据库方法,掌握数据库的4种基本操作
主要内容
- 如何连接数据库
- 数据库的4大基本操作
- 增
- 删
- 改
- 查
1.如何连接数据库
1.1 先了解数据库驱动的作用
Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,数据库驱动起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。
以下是Qt支持的数据库驱动
如何查看当前版本Qt支持的数据库驱动
step1 新建一个项目Qt widgets项目,名称为myDataBaseDrivers,基类为QWidget
step2 在项目的.pro文件中,增加一条语句
QT += sqlstep3 在 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_HmyDataBaseDrivers 项目 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下一篇:C/C++ 操作ini文件(SinpleIni 跨平台库)
Qt