当前位置: 首页 > news >正文

【Qt】数据库(一)SQLITE创建、增删查改

填坑1:如何连续插入

汇总SQlite语句
创建表格:create table <table_name> (f1 type1, f2 type2,…);
增:insert into <table_name> values (value1, value2,…);
改:update <table_name> set <f1=value1>, <f2=value2>… where ;
查:select , , … from <table_name>;
删:delete from <table_name> where =
删全部:delete from <table_name>

Step1:准备工作

创建项目
在qmake中(.pro文件)引入依赖:QT += sql
image.png
引入头文件

#include <QSqlDatabase>   //创建数据库
#include <QSqlError>
#include <QSqlQuery>      //针对数据库进行一些操作
#include <QMessageBox>    //提示弹窗,这个可以不加

Step2:创建(配置)和关闭

2.1 创建(打开)数据库

在类中创建一个bool型的函数,创建并配置一个数据库

bool MainWindow::createConnection()//创建并配置数据库
{//建立了一个QSqlDatabase对象,后续的操作要使用这个对象QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");//Sqlite数据库database.setHostName("127.0.0.1");//连接地址database.setDatabaseName("MyDataBase_sqlite.db");//命名数据库database.setUserName("ShengQiang");//用户名database.setPassword("123456");//密码if (!database.open()) {//如果数据库连接失败,则弹出QMessageBox::critical(0, "Cannot open database","Unable to establish a database connection", QMessageBox::Cancel);return false;}else{//如果数据库连接成功,则弹出QMessageBox::information(0, "Succeed", "Good Luck!",QMessageBox::Ok);}return true;
}

通常我们需要不断判断数据库是否已创建,而不是一直创建一个数据库,所以我们可以通过if判断数据库是否已经创建了。
image.png

2.2 关闭数据库

数据库操作完成后,最好关闭。下次用到了再重新打开。

database.close();//database是自己创建的数据库变量

Step3:操作(增删查改)

3.1 创建表格

创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。

QSqlQuery sql_query;
QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
sql_query.prepare(create_sql);
if(!sql_query.exec())
{qDebug() << "Error: Fail to create table." << sql_query.lastError();
}
else
{qDebug() << "Table created!";
}

代码解释:
(1)第一行定义一个QSqlQuery对象。
(2)第二行是一个QString,其中的内容是SQLite语句。对数据库的操作,都是用SQLite的语句完成的,把这些指令以QString类型,通过prepare函数,保存在QSqlQuery对象中。也可将指令,以QString形式直接写在exec()函数的参数中,例如:

sql_query.exec("create table student (id int primary key, name varchar(30), age int)");

创建表格语句:create table <table_name> (f1 type1, f2 type2,…);
create table是创建表格的语句,也可用大写CREATE TABLE;student是表格的名称,可以任意取;括号中是表格的格式,上述指令表明,表格中有三列,第一列的名称(表头)是id,这一列储存的数据类型是int,第二列名称是name,数据类型是字符数组,最多有30个字符(和char(30)的区别在于,varchar的实际长度是变化的,而char的长度始终是给定的值),第三列的名称是age,数据类型是int。
如果sql_query.exec()执行成功,则创建表格成功。

3.2 增

在刚才创建的表格中,插入一行数据。

    database.open();QSqlQuery sql_query;//在插入数据时,不需要手动指定id字段的值,因为SQLite会为您自动生成。您只需要绑定其他字段的值QString insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)";sql_query.prepare(insert_sql);//sql_query.addBindValue(10);sql_query.addBindValue("Wang");sql_query.addBindValue(25);if(!sql_query.exec()){qDebug() << sql_query.lastError();}else{qDebug() << "inserted Wang!";}//第二种插入方法
//    if(!sql_query.exec("INSERT INTO student VALUES(9, \"Li\", 23)"))
//    {
//        qDebug() << sql_query.lastError();
//    }
//    else
//    {
//        qDebug() << "inserted Li!";
//    }//    database.close();

插入语句:insert into <table_name> values (value1, value2,…);
insert into是插入语句,student是表格名称,values()是要插入的数据。这里,我们插入了2组数据。插入第一组数据的时候,用addBindValue来替代语句中的?,替代的顺序与addBindValue调用的顺序相同。插入第二组数据的时候,则是直接写出完整语句。

3.3 改

例3:更新数据(修改数据)
QString update_sql = "update student set name = :name where id = :id";
sql_query.prepare(update_sql);
sql_query.bindValue(":name", "Qt");
sql_query.bindValue(":id", 1);
if(!sql_query.exec())
{qDebug() << sql_query.lastError();
}
else
{qDebug() << "updated!";
}

语句:update <table_name> set <f1=value1>, <f2=value2>… where ;
更新(修改)的语句是update…set…,其中student是表格名称,name是表头名称(即第二列),:name是待定的变量,where用于确定是哪一组数据,:id也是待定变量。
bindValue(" ", " ")函数用来把语句中的待定变量换成确定值。

3.4 查

3.4.1 查部分数据

QString select_sql = "select id, name from student";
if(!sql_query.exec(select_sql))
{qDebug()<<sql_query.lastError();
}
else
{while(sql_query.next()){int id = sql_query.value(0).toInt();QString name = sql_query.value(1).toString();qDebug()<<QString("id:%1    name:%2").arg(id).arg(name);}
}

语句select , , … from <table_name>;
select是查询指令; 等等是要查询的变量(即表头),中间用逗号隔开;from …指定表格。
上述语句是说查询student表中的 id 和 name 。执行查询之后,用sql_query.value(int)来获得数据。同样地,value(0)表示第一个数据,即 id,value(1)表示name。注意:value()函数的返回值类型是QVariant,因此要用toInt()等函数转换成特定的类型。
3.4.2 查全部数据

QString select_all_sql = "select * from student";
sql_query.prepare(select_all_sql);
if(!sql_query.exec())
{qDebug()<<sql_query.lastError();
}
else
{while(sql_query.next()){int id = sql_query.value(0).toInt();QString name = sql_query.value(1).toString();int age = sql_query.value(2).toInt();qDebug()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);}
}

语句select * from <table_name>;
查询所有数据用 * 表示。用while(sql_query.next())用来遍历所有行。同样用value()获得数据。
3.4.3 查询最大id

QString select_max_sql = "select max(id) from student";
int max_id = 0;
sql_query.prepare(select_max_sql);
if(!sql_query.exec())
{qDebug() << sql_query.lastError();
}
else
{while(sql_query.next()){max_id = sql_query.value(0).toInt();qDebug() << QString("max id:%1").arg(max_id);}
}

3.5 删

3.5.1 删除一条数据

QString delete_sql = "delete from student where id = ?";
sql_query.prepare(delete_sql);
sql_query.addBindValue(0);
if(!sql_query.exec())
{qDebug()<<sql_query.lastError();
}
else
{qDebug()<<"deleted!";
}

语句delete from <table_name> where =
delete用于删除条目,用where给出限定条件。例如此处是删除 id = 0的条目。
3.5.2 清空表格(删除所有)

QString clear_sql = "delete from student";
sql_query.prepare(clear_sql);
if(!sql_query.exec())
{qDebug() << sql_query.lastError();
}
else
{qDebug() << "table cleared";
}

相关文章:

【Qt】数据库(一)SQLITE创建、增删查改

填坑1&#xff1a;如何连续插入 汇总SQlite语句 创建表格&#xff1a;create table <table_name> (f1 type1, f2 type2,…); 增&#xff1a;insert into <table_name> values (value1, value2,…); 改&#xff1a;update <table_name> set <f1value1>,…...

【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)

在本篇文章中&#xff0c;我们将详细解读力扣第165题“比较版本号”。通过学习本篇文章&#xff0c;读者将掌握如何使用多种方法来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解&#xff0c;以便于理解。 问题描述 …...

用PhpStudy在本地电脑搭建WordPress网站教程(2024版)

对新手来说&#xff0c;明白了建站3要素后&#xff0c;如果直接购买域名、空间去建站&#xff0c;因为不熟练&#xff0c;反复测试主题、框架、插件等费时费力&#xff0c;等网站建成可能要两三个月&#xff0c;白白损失这段时间的建站费用。那么新手怎么建测试网站来练手呢&am…...

高中数学:平面向量-题型总结及解题思路梳理

一、知识点及解题思路梳理 高中&#xff0c;2/3的向量题目是坐标向量题&#xff0c;1/3是几何向量题。但是&#xff0c;这1/3的几何向量题可以转换成坐标向量题。 二、练习 例题1 几何型向量题 例题2...

【玩转google云】Google Cloud Platform (GCP) (WAF)详解

目录 引言 一、什么是Web Application Firewall? 二、GCP WAF简介 三、GCP WAF的主要功能...

前端开发工程师——数据可视化

canvas canvas绘制线段 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthd…...

【代码随想录训练营】【Day 35】【贪心-2】| Leetcode 122, 55, 45

【代码随想录训练营】【Day 35】【贪心-2】| Leetcode 122, 55, 45 需强化知识点 贪心&#xff1a;跳跃游戏 题目 122. 买卖股票的最佳时机 II 动态规划贪心&#xff1a;只要股票第二天涨了&#xff0c;前一天就买&#xff0c;第二就买 class Solution:def maxProfit(sel…...

【深度学习】ultralytics, yolo seg,实例分割图绘制,核对yolo seg 的txt标记对不对

这段代码的作用是从指定路径读取图像和标签文件&#xff0c;然后在图像上绘制分割区域和相关点&#xff0c;并保存最终的图像。以下是每个函数的具体作用及其解释&#xff1a; read_labels(label_path): 读取指定路径的标签文件。标签文件的每一行表示一个物体的分割信息&#…...

如何保证员工在精益变革中始终保持积极的态度?

在当今日新月异的商业环境中&#xff0c;企业为了保持竞争力&#xff0c;需要不断寻求创新和变革。精益变革作为一种提升效率和质量的有效手段&#xff0c;已逐渐成为企业转型升级的关键。然而&#xff0c;变革往往伴随着挑战和不确定性&#xff0c;如何保证员工在精益变革中始…...

【Java面试】三、Redis篇(下)

文章目录 1、抢券场景2、Redis分布式锁3、Redisson实现分布式锁4、Redisson实现的分布式锁是可重入锁5、Redisson实现分布式锁下的主从一致性6、面试 1、抢券场景 正常思路&#xff1a; 代码实现&#xff1a; 比如优惠券数量为1。正常情况下&#xff1a;用户A的请求过来&a…...

GpuMall智算云:QwenLM/Qwen1.5/Qwen1.5-7B-Chat

Qwen 是阿里巴巴集团 Qwen 团队的大型语言模型和大型多模态模型系列&#xff0c;现在大型语言模型已经升级到 Qwen1.5 版本。 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 无论是语言模型还是多模态模型&#xff0c;都在大规模的多语言和多模…...

CentOS6.5 下编译 FreeSWITCH 1.2.23 版本

命题作文&#xff0c;慢慢来&#xff0c;一边做&#xff0c;一边记录。 老古董了&#xff0c;查资料很不容易&#xff0c;但朋友说不着急&#xff0c;这很好。 生命的意义在于折腾&#xff0c;不是吗&#xff1f; 先下载 CentOS6.5&#xff0c; 查了下资料&#xff0c;最后…...

2024年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 在Python中,hex(2023)的功能是?( ) A:将十进制数2023转化成十六进制数 B:将十进制数2023转化成八进制数 C:将十六进制数2023转化成十进制数 D:将八进制数2023转化成十进制数 答案:A …...

Redis篇 数据的编码方式和单线程模型

编码方式和单线程模型 一.redis中的数据类型二. Redis中查询编码方式命令三. 单线程模型四. 经典面试题,redis为何这么快?什么是IO多路复用? 一.redis中的数据类型 在redis中,数据类型大致分为5种 1.字符串类型 2.哈希 3.列表 4.集合 5.有序集合 redis底层在实现这些数据结构…...

(delphi11最新学习资料) Object Pascal 学习笔记---第13章第4节 (内存管理和接口)

13.4 内存管理和接口 ​ 在第11章中&#xff0c;我介绍了接口的内存管理的关键要素。与对象不同&#xff0c;接口是受管理且具有引用计数。如我所提到的&#xff0c;接口引用会增加所引用对象的引用计数&#xff0c;但您可以声明接口引用为弱引用以禁用引用计数&#xff08;但…...

【记录贴】docker镜像格式报错

1&#xff0c;错误内容 最近想要补一补docker的基础知识&#xff0c;跟着练习的时候&#xff0c;发现下面的错误。 换了其他镜像&#xff08;docker pull ubantu&#xff09;也存在同样的问题&#xff1a; 错误内容&#xff1a;docker: mediaType in manifest should be appli…...

设计模式 19 模板模式 Template Pattern

设计模式 19 模板模式 Template Pattern 1.定义 模板模式&#xff08;Template Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤的具体实现延迟到子类中。在模板模式中&#xff0c;定义了一个抽象类&#xff0c;其中包含了一个…...

PHP如何实现实时计算使用者消耗服务器资源费用?

最近几天遇到一个客户,提出一个很有意思的东西!当然客户的项目方案这里不方便说,这里就假定客户的项目是腾讯云?哈哈哈哈哈 以前客户的收费方案是按月、按季度、按年收费,现在半路杀出了很多程咬金,导致之前的收费方案有点儿贵,没啥性价比,那就搞一个看起来很“便宜”…...

在C++中自定义命名空间,在命名空间中定义string变量,同时定义一个函数实现单词逆置

代码 #include <iostream> #include <cstring> using namespace std; namespace my_space {string s;void reverse(string s);//定义逆置函数 } using namespace my_space; void my_space::reverse(string s){int lens.size();int i0;int jlen-1;while(i<j){//…...

【leetcode 141】环形链表——快慢指针(龟兔赛跑)

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...