SQLiteC/C++接口详细介绍之sqlite3类(六)
快速前往文章列表:SQLite—系列文章目录
上一篇:SQLiteC/C++接口详细介绍之sqlite3类(五)
下一篇:SQLiteC/C++接口详细介绍之sqlite3类(七)
19. sqlite3_changes与sqlite3_changes64
是SQLite中用于获取前一条SQL语句所影响的行数的API函数。其返回值为int型和sqlite3_int64型,用于不同位数的系统,其中sqlite3_changes是32位返回类型,sqlite3_changes64是64位返回类型。其用法非常简单,只需要在执行完一条更新数据库的SQL语句(比如INSERT、DELETE、UPDATE)之后调用这两个函数即可得到所影响的行数。需要注意的是,这个值只对最近执行的一条SQL语句有效,并在下一条SQL语句执行前被重置。
如:
#include <stdio.h>
#include <sqlite3.h>
int main() {sqlite3 *db;sqlite3_open(":memory:", &db); // 在内存中创建一个数据库char *sql = "CREATE TABLE test (id INTEGER PRIMARY KEY, info TEXT);""INSERT INTO test (info) VALUES ('Hello, World!');" // 创建表和插入一条数据sqlite3_exec(db, sql, 0, 0, 0); // 执行SQL语句int nrow = 0, ncol = 0;char **result;sqlite3_get_table(db, "SELECT * FROM test", &result, &nrow, &ncol, 0); // 查询表中的所有数据printf("Rows affected by the last SQL statement: %d\n", sqlite3_changes(db)); // 输出上一条SQL语句影响的行数sqlite3_close(db);return 0;
}
在这个示例中,我们创建了一个内存中的SQLite数据库,并创建了一个表和插入了一条数据。然后我们使用sqlite3_get_table函数查询了表中的所有数据,并输出了上一条SQL语句(即SELECT语句)所影响的行数。
注意的是,sqlite3_changes和sqlite3_changes64函数在查询语句(比如SELECT语句)中将返回0。
20. sqlite3_collation_needed与sqlite3_collation_needed16
sqlite3_collation_needed和sqlite3_collation_needed16是SQLite库中的回调函数,用于在执行SQL语句时请求注册协作关系函数,以更好地处理特定的数据比较及排序情况。
它们的定义如下:
```c
typedef void (*sqlite3_collation_needed_callback)(void*,sqlite3*,int,const char*);
typedef void (*sqlite3_collation_needed_callback16)(void*,sqlite3*,int,const void*);
```
这两个函数的作用是向第二个参数sqlite3中注册一个回调函数,当SQLite查询需要协作关系函数时将自动调用这个回调函数。根据当前环境,调用的是sqlite3_collation_needed还是sqlite3_collation_needed16。这两个函数的第一个参数是一个void*指针,指向sqlite3_collation_needed_callback或sqlite3_collation_needed_callback16所要调用的协作解析函数,第二个参数是一个void*指针,指向SQLite上下文对象,第三个参数是Callback函数提供的字符编码方式(sqlite3_collation_needed16是多字节编码方式),第四个参数是Callback函数请求注册的协作解析函数的名字。
这个函数的实现需要传入一个可选的参数指针,如果需要注册协作关系函数,则应该检查这个指针,如果它是非空值,则应该调用sqlite3_create_collation注册协作解析函数。
下面给出一个简单的示例,它会在执行SQL语句时注册一个协作关系函数:
#include <stdio.h>
#include <sqlite3.h>
int myCollation(void *data, int len1, const void *string1, int len2, const void *string2)
{return strncmp((const char*)string1, (const char*)string2, (len1 < len2) ? len1 : len2);
}
int main() {sqlite3 *db;sqlite3_open(":memory:", &db); // 在内存中创建一个数据库sqlite3_collation_needed(db, NULL, myCollation); // 注册协作关系函数char *sql = "CREATE TABLE t1 (x TEXT);""INSERT INTO t1(x) VALUES('123');""SELECT * FROM t1 ORDER BY x COLLATE myCollation;"; // 使用自定义的协作关系函数排序sqlite3_exec(db, sql, NULL, NULL, NULL); // 执行SQL语句sqlite3_close(db);return 0;
}
在这个示例中,我们创建了一个内存中的SQLite数据库,并注册了一个名为myCollation的协作解析函数。然后,我们使用这个自定义排序规则对表t1中的数据进行排序。
注意:sqlite3_collation_needed和sqlite3_collation_needed16的主要区别在于,sqlite3_collation_needed所使用的字符编码方式是单字节的,而sqlite3_collation_needed16所使用的字符编码方式是多字节的,因此,它们注册的协作解析函数所接收的参数类型也不同。另外,sqlite3_collation_needed和sqlite3_collation_needed16只需要注册一次,之后所有查询将使用相同的协作解析函数。
21.sqlite3_commit_hook
SQLite库中的回调函数,用于在提交事务前执行自定义代码。
它的定义如下:
typedef int (*sqlite3_commit_hook_callback)(void *);
这个函数的作用是向SQLite数据库中注册一个回调函数,当执行每次提交事务前,将自动调用该回调函数。这个函数有一个void*类型的参数指针,可以将任何用户指定的数据对象传给该函数进行操作。这个函数的返回值是一个int类型的整数,如果返回值为1,则提交事务,否则回滚事务。例如,当在回调函数中检测到错误时,应该返回0来回滚事务。
如:
#include <stdio.h>
#include <sqlite3.h>
int myCommitHook(void *data) {printf("Before committing transaction\n");return 1; // 返回1表示提交事务
}
int main() {sqlite3 *db;sqlite3_open(":memory:", &db); // 在内存中创建一个数据库sqlite3_commit_hook(db, myCommitHook, NULL); // 注册提交事务时的回调函数char *sql = "CREATE TABLE t1 (x TEXT);""BEGIN;""INSERT INTO t1(x) VALUES('123');""COMMIT;";sqlite3_exec(db, sql, NULL, NULL, NULL); // 执行SQL语句sqlite3_close(db);return 0;
}
在这个示例中,我们创建了一个内存中的SQLite数据库,并注册了一个名为myCommitHook的回调函数。然后,我们使用这个回调函数在提交事务前输出一条信息。
注意:sqlite3_commit_hook的主要作用是监视和控制事务,因此它只能在事务处理期间使用。如果没有启用事务,则sqlite3_commit_hook不会被调用。另外,一次提交事务操作会调用sqlite3_commit_hook回调函数一次,如果要执行多个操作时,需要在每次操作之前都调用sqlite3_commit_hook注册一个回调函数。
参考:
1.《C-language Interface Specification for SQLite》
相关文章:

SQLiteC/C++接口详细介绍之sqlite3类(六)
快速前往文章列表:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(五) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(七) 19. sqlite3_changes与sqlite3_changes64 是SQLite中用…...
编码技巧:多条件判断拼接字符串
在写代码业务逻辑的时候,有时候需求稍微变化一下都让代码变的很麻烦,如果只在现有代码基础上硬改,可能会让可读性降低,本文通过一个例子来演示字符串拼接的变化。 一开始的业务逻辑比较简单,是固定条件加一个需要判断…...

气压计LPS25HB开发(1)----轮询获取气压计数据
气压计LPS25HB开发----1.轮询获取气压计数据 概述视频教学样品申请源码下载产品特性通信模式速率生成STM32CUBEMX串口配置IIC配置SA0地址设置串口重定向参考程序SA0设置模块地址获取ID复位操作BDU设置设置速率轮询读取数据演示 概述 本文将介绍如何使用 LPS25HB 传感器来读取数…...
这个不需要吗 HttpServletRequest req
这个不需要吗 HttpServletRequest req 在这个特定场景下,您在OnlineStudentFeignService接口中确实不需要直接使用HttpServletRequest对象。因为Feign是一个声明式的HTTP客户端,它的设计目标是简化服务间的远程调用,它并不直接处理原始的HTT…...

【算法与数据结构】深入解析二叉树(一)
文章目录 📝数概念及结构🌠 树的概念🌉树的表示🌠 树在实际中的运用(表示文件系统的目录树结构) 🌉二叉树概念及结构🌠概念🌉数据结构中的二叉树🌠特殊的二叉…...

深入浅出:Objective-C中使用MWFeedParser下载豆瓣RSS
摘要 本文旨在介绍如何在Objective-C中使用MWFeedParser库下载豆瓣RSS内容,同时展示如何通过爬虫代理IP技术和多线程提高爬虫的效率和安全性。 背景 随着信息量的激增,爬虫技术成为了获取和处理大量网络数据的重要手段。Objective-C作为一种成熟的编程…...

Java日志框架Log4j 2详解
有时希望能够以文件的形式记录执行过程中出现的异常信息,甚至记录程序正常运行的关键步骤,以便日后查看,那么该如何处理呢? 答:显然,可以自行编程实现这个需求,但是,从更注重效率和性能的方面考虑&#x…...

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型
摘要 本次剪枝实战是基于下面这篇论文去复现的,主要是实现对BN层的γ/gamma进行剪枝操作,本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文:Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…...

OSI(Open Systems Interconnection)模型和TCP/IP模型
OSI模型 OSI模型是一个概念模型,由国际标准化组织(ISO)在1984年提出,用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层,每一层都有其特定的功能,从下至上依次是: 物理层&#x…...
git基础命令(二)
目录 git revert 撤消上一次提交的更改但是会创建一个新的提交来撤消该提交所做的更改git show 显示提交详细信息git mv 重命名文件git rm 从工作树和索引中移除文件git clean 从工作树中移除未跟踪文件git checkout 将文件恢复到工作树git reset 撤销更改、移动 HEAD 指针以及…...

从零开始学习typescript系列 1:typescript 基本了解之是什么,为什么,以及怎么用
初识ts 基本了解 设计者,实现者:微软发行时间:2012年10月1日GitHub:https://github.com/microsoft/TypeScriptts和js关系:ts是js的扩展,ts语法包含js ts是新语言吗? 不是,在js基…...

【数学建模】线性规划
针对未来可能的数学建模比赛内容,我对学习的内容做了一些调整,所以先跳过灰色关联分析和模糊综合评价的代码,今天先来了解一下运筹规划类——线性规划模型。 背景: 某数学建模游戏有三种题型,分别是A,B&am…...

MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2
MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,在物联网和消息传递系统中广泛应用。MQTT 提供了三个不同的 QoS(Quality of Service)等级,用于确保消息的可靠性和传输效率。本文将详细…...

搭建个人智能家居 3 -第一个设备“点灯”
搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome,今天我们开始在这个智能家居中添加我们的第一个设备(一颗LED灯),如果环境…...

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
tar -xzf prometheus-2.7.0-rc.1.linux-amd64.tar.gzcd prometheus-2.7.0-rc.1.linux-amd64/./prometheus --config.fileprometheus.yml --web.listen-address:5555 Prometheus 默认监听端口号为 9090,为了不与系统上的其它进程监听端口冲突,我们在启动…...
(delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节(创建对象 )
7.1.4 创建对象 与其他流行的编程语言比较之后,让我们回到 Pascal,看看如何使用类。 一旦定义了类,我们就可以创建一个该类型的对象,代码片段如下(本节所有代码提取自 Dates1 示例)那样:…...
unity学习笔记 Restsharp 使用心得
Restsharp Restsharp安装使用注意事项api方式的流式调用--子线程中执行代码无响应的问题问题描述问题解决其他问题 Restsharp 安装 可以在github上下载dll文件然后导入到unity中 https://github.com/adrenak/RestSharp.Unity 也可以百度直接搜Restsharp然后下载相关的文件导入…...

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)
1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…...
Python:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码
Python:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码 引言:功能概述步骤一:提取PDF标题步骤二:生成目录和页码,合并PDF技术亮点 代码步骤一:提取PDF标题(Step_…...

vue 基于elementUI/antd-vue, h函数实现message中嵌套链接跳转到指定路由 (h函数点击事件的写法)
效果如图: 点击message 组件中的 工单管理, 跳转到工单管理页面。 以下是基于vue3 antd-vue 代码如下: import { message } from ant-design-vue; import { h, reactive, ref, watch } from vue; import { useRouter } from vue-router; c…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...