Qt SQL模块是Qt中用来操作数据库的类,该类封装了各种SQL数据库接口,可以很方便的链接并使用,数据的获取也使用了典型的Model/View结构,通过MV结构映射我们可以实现数据与通用组件的灵活绑定,一般SQL组件常用的操作,包括,读取数据,插入数据,更新数据,删除数据,这四个功能我将分别介绍它是如何使用的。

SQL模块在使用时必须引入模块,需要在pro文件内增加QT += sql并在头文件内增加#include <QSqlDatabase>导入模块才可以正常使用。

初始化数据库: 初始化调用QSqlDatabase::addDatabase指定数据库类型,通过db.setDatabaseName()指定数据库文件名.

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <iostream>
#include <QStringList>
#include <QString>
#include <QVariant> // 初始化表结构
// https://www.cnblogs.com/lyshark
bool InitSQL()
{
// 指定数据库驱动类型
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
{
std::cout << db.lastError().text().toStdString()<< std::endl;
return false;
} // 执行SQL创建表
db.exec("DROP TABLE LyShark");
db.exec("CREATE TABLE LyShark ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL, "
"age INTEGER NOT NULL)"
); // 提交事务请求
bool ref = db.commit();
db.close();
return ref;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); bool ref = InitSQL();
std::cout << "init: " << ref << std::endl; return a.exec();
}

初始化表结构如下:

逐条插入数据: 逐条插入记录在Qt中可直接调用SQL模块提供的db.exec()函数,插入后最后需要调用db.commit()一次性提交事务.

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <iostream>
#include <QStringList>
#include <QString>
#include <QVariant> // 逐条插入数据
// https://www.cnblogs.com/lyshark
bool InsertSQL()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
{
std::cout << db.lastError().text().toStdString()<< std::endl;
return false;
} // 逐条插入数据
db.exec("INSERT INTO LyShark(name,age) ""VALUES ('admin',23)");
db.exec("INSERT INTO LyShark(name,age) ""VALUES ('zhangsan',25)");
db.exec("INSERT INTO LyShark(name,age) ""VALUES ('lisi',34)"); // 提交数据
bool ref = db.commit();
return ref;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); bool ref = InsertSQL();
std::cout << "insert = > " << ref << std::endl; return a.exec();
}

插入记录如下:

多条记录插入: 一次性插入多条数据记录,可调用query.prepare()绑定字段与SQL记录,绑定后即可通过循环批量插入记录.

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <iostream>
#include <QStringList>
#include <QString>
#include <QVariant> // 批量插入数据
// https://www.cnblogs.com/lyshark
bool InsertMultipleSQL()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
{
std::cout << db.lastError().text().toStdString()<< std::endl;
return false;
} // 定义字符串链表
QStringList user_name;
QStringList user_age; // 批量插入数据到链表中
user_name << "www.lyshark.com" << "https://www.cnblogs.com/lyshark" << "lyshark";
user_age << "22" << "33" << "44"; // 绑定数据记录
QSqlQuery query;
query.prepare("INSERT INTO LyShark(name,age) ""VALUES (:name, :age)"); // 判断两张表中字段数据量是否一致
if(user_name.size() == user_age.size())
{
// 循环插入数据
for(int x=0;x< user_name.size(); x++)
{
query.bindValue(":name",user_name[x]);
query.bindValue(":age",user_age[x]);
query.exec();
}
}
// 提交数据
db.commit();
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); bool ref = InsertMultipleSQL();
std::cout << "insert = > " << ref << std::endl; return a.exec();
}

批量插入数据如下:

查询表中记录: 查询记录可调用QSqlQuery query()得到记录条数,然后不断循环,每次循环调用一次query.next()获取一条,直到循环结束.

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <iostream>
#include <QStringList>
#include <QString>
#include <QVariant> // 查询数据记录
// https://www.cnblogs.com/lyshark
bool SelectSQL()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
{
std::cout << db.lastError().text().toStdString()<< std::endl;
return false;
} // 查询数据
QSqlQuery query("SELECT * FROM LyShark;",db);
QSqlRecord rec = query.record(); // 循环所有记录
while(query.next())
{
// 判断当前记录是否有效
if(query.isValid())
{
int id_ptr = rec.indexOf("id");
int id_value = query.value(id_ptr).toInt(); int name_ptr = rec.indexOf("name");
QString name_value = query.value(name_ptr).toString(); int age_ptr = rec.indexOf("age");
int age_value = query.value(age_ptr).toInt(); std::cout << "ID: " << id_value << "Name: " << name_value.toStdString() << "Age: " << age_value << std::endl;
}
}
return true;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); bool ref = SelectSQL();
std::cout << "select = > " << ref << std::endl; return a.exec();
}

循环输出的数据如下:

更新表中记录: 更新表中记录直接调用update语句即可,在调用之前通过QString sql拼接待修改语句并提交db.commit()事务即可完成更新.

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <iostream>
#include <QStringList>
#include <QString>
#include <QVariant> // 修改表中数据
// https://www.cnblogs.com/lyshark
bool UpdateSQL(QString uid, QString new_name)
{
// 指定数据库驱动类型
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./lyshark.db");
if (!db.open())
{
std::cout << db.lastError().text().toStdString()<< std::endl;
return false;
} // 执行SQL更新记录
QString sql = QString("update LyShark set name='%1' where id=%2;").arg(new_name).arg(uid);
db.exec(sql);
std::cout << "update => " << sql.toStdString() << std::endl; // 提交事务请求
bool ref = db.commit();
db.close();
return true;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); // 更新ID=6的记录更新为 www.cnblogs.com/lyshark
bool ref = UpdateSQL("6","www.cnblogs.com/lyshark");
std::cout << "update flag: " << ref << std::endl; return a.exec();
}

更新后表中记录如下:

C/C++ Qt 数据库QSql增删改查组件应用的更多相关文章

  1. ThinkPHP实现对数据库的增删改查

    好久都没有更新博客了,之前老师布置的任务总算是现在可以说告一段落了,今天趁老师还没提出其他要求来更新一篇博客. 今天我想记录的是我之前做项目,自己所理解的ThinkPHP对数据库的增删改查. 首先要说 ...

  2. Android学习---数据库的增删改查(sqlite CRUD)

    上一篇文章介绍了sqlite数据库的创建,以及数据的访问,本文将主要介绍数据库的增删改查. 下面直接看代码: MyDBHelper.java(创建数据库,添加一列phone) package com. ...

  3. Android 系统API实现数据库的增删改查和SQLite3工具的使用

    在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...

  4. Android SQL语句实现数据库的增删改查

    本文介绍android中的数据库的增删改查 复习sql语法: * 增 insert into info (name,phone) values ('wuyudong','111') * 删 delet ...

  5. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  6. 【转载】通过JDBC对MySQL数据库的增删改查

    通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...

  7. 利用API方式进行数据库的增删改查

    /* 将数据库的增删改查单独放进一个包 */ package com.itheima28.sqlitedemo.dao; import java.util.ArrayList; import java ...

  8. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. Asp.net MVC4 使用EF实现数据库的增删改查

    EF的使用 步骤: (1)将EF添加到项目:在Model右击添加新建项 找到ADO.NET实体数据模型,接着... (2)实现数据库的增删改查       查询 (因为在Model中已经添加EF实体了 ...

随机推荐

  1. STM32 PWM功能在关闭时GPIO电平不确定的情况

    刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况.在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确 ...

  2. 单片机入门stm32知识学习的先后顺序

    这里大概的罗列了一些学习STM32的内容,以及学习顺序.如果是新手的话,建议边看中文手册和学习视频;如果是已经入门的,个人建议自己做一个项目,不论项目大小,当然里面会涉及到自己已经学习过的,或者是自己 ...

  3. lvs 四层负载相关

    都打开 /etc/sysctl.conf 中的 net.ip4.ip_forward=1.开启路由转发功能. 分发器 : eth0:192.168.1.66 (VIP) eth1:192.168.2. ...

  4. pycharm基本使用与破解

    一.pycharm基本使用 pycharm这款ide软件虽然功能强大,但正因为他的强大,所以小白在刚使用这款软件时上手会有点难度,今天我们就来介绍一下ptcharm的基本使用. 1.基本配置 我们安装 ...

  5. java中使用Process执行linux命令

    代码如下 BufferedReader reader = null; String cmd = "netstat -anp|grep :8080";//命令中有管道符 | 需要如下 ...

  6. 痞子衡嵌入式:实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率. 上一篇文章 <聊聊i.MXRT1xxx上的普通GPIO与高速GP ...

  7. 第三课 Dubbo设计中的设计模式

    责任链模式  责任链模式在Dubbo中发挥的作用举足轻重,就像是Dubbo框架的骨架.Dubbo的调用链组织是用责任链模式串连起来的. 责任链中的每个节点实现Filter接口,然后由ProtocolF ...

  8. SpringCloud升级之路2020.0.x版-35. 验证线程隔离正确性

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 上一节我们通过单元测试验证了重试的正确性,这一节我们来验证我们线程隔离的正确性,主要包括: ...

  9. Linux驱动实践:带你一步一步编译内核驱动程序

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  10. js 函数和函数的参数

    /* * 函数 function *     - 函数也是一个对象 *     - 函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码) *     - 函数中可以保存一些代码在需要的时候 ...