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》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2871040.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

用Windows server2022实现批量装机(原理server系列通用)

本篇文章将手把手教会大家从Windows server的安装到批量安装环境的部署&#xff08;我将使用vmware进行操作&#xff0c;物理机过程相同&#xff09; Windows server2022系统镜像可以从msdn和hellowindows下载 MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn) &#xff08…

数据仓库核心:揭秘事实表与维度表的角色与区别

文章目录 1. 引言2. 基本概念2.1 事实表&#xff08;Fact Table&#xff09;2.2 维度表&#xff08;Dimension Table&#xff09; 3. 两者关系4. 为什么要有做区分5. 写在最后 1. 引言 前篇我们深入探讨了Hive数据仓库中的表类型&#xff0c;包括内部表、外部表、分区表、桶表…

HarmonyOS鸿蒙开发常用4种布局详细说明

介绍一下鸿蒙开发常用4种布局 1、线性布局 2、层叠布局 3、网格布局 4、列表布局 ​1. 线性布局&#xff08;Column/Row&#xff09; 线性布局&#xff08;LinearLayout&#xff09;是开发中最常用的布局&#xff0c;通过线性容器Row&#xff08;行&#xff09;和Column&…

【数据结构七】堆与PriorityQueue详解

堆 在Java中有一种数据结构基于队列&#xff0c;并保证操作的数据带有优先级&#xff0c;该数据结构应该提供了两个最基本的操作&#xff0c;一个是返回最高优先级对象&#xff0c;一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)。它的底层使用了堆这种数据结…

数学与计算机(2)- 线性代数

原文&#xff1a;https://blog.iyatt.com/?p13044 1 矩阵 NumPy 中 array 和 matrix 都可以用于储存矩阵&#xff0c;后者是前者的子类&#xff0c;array 可以表示任意维度&#xff0c;matrix 只能是二维&#xff0c;相当于矩阵专用&#xff0c;在一些矩阵的运算操作上较为直…

openEular入门操作(仅供学习哦~)

如何登录Linux&#xff1f; shell简介 修改密码 Linux用户 bash shell快捷操作 进入openEular&#xff0c;输入账号密码。 命令ip addr 进入putty&#xff0c;输入查到的ip&#xff0c;使用ssh。即可远程登录 修改密码&#xff0c; 修改用户&#xff08;passwd 用户名字&…

Secure MIMO Communication Relying on Movable Antennas

文章目录 IV. SIMULATION RESULTSA. Simulation SetupB. Convergence Behaviour of the Proposed AlgorithmsC. Baseline SchemesD. Performance Analysis Compared to Baseline Schemes IV. SIMULATION RESULTS 在本节中&#xff0c;仿真结果验证了所提出算法的有效性&#x…

Python 多线程大批量处理文件小程序

说明 平时偶尔需要进行重复性的对文件进行重命名、格式转化等。假设以文件复制功能作为目标&#xff0c;设计一个小程序使用多线程对文件进行批量复制。&#xff08;其实以后主要目标是针对Realsense的raw文件进行批量的转化&#xff0c;并借助多线程加速&#xff09; 代码 i…

FileZillaClient连接被拒绝,无法连接

1.ECONNREFUSED - 连接被服务器拒绝 2、无法连接FZ时&#xff0c;判断没有ssh 更新源列表&#xff1a; sudo apt-get update 安装 openssh-server &#xff1a;sudo apt-get install openssh-server 查看是否启动ssh&#xff1a;sudo ps -e | grep ssh

html5cssjs代码 023 公制计量单位进位与换算表

html5&css&js代码 023 公制计量单位进位与换算表 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;用于展示公制计量单位的进位与换算表。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8&quo…

【全面了解自然语言处理三大特征提取器】RNN(LSTM)、transformer(注意力机制)、CNN

目录 一 、RNN1.RNN单个cell的结构2.RNN工作原理3.RNN优缺点 二、LSTM1.LSTM单个cell的结构2. LSTM工作原理 三、transformer1 Encoder&#xff08;1&#xff09;position encoding&#xff08;2&#xff09;multi-head-attention&#xff08;3&#xff09;add&norm 残差链…

OpenHarmony4.0对RK3566的烧写过程

前面已经编译的过程搞了比较长的时间,因为遇到了不少问题,老是编译出错,后来经过努力还是编译成功了。 我这里主要针对RK3566的Purple Pi OH开发板,如下图: 因为开源鸿蒙里没有针对这个板的特殊配置,需要下载下面这个文件: purple-pi-oh-patch.zip 这个文件里包含了可…

暄桐二期《集字圣教序》21天教练日课又跟大家见面啦

林曦老师的直播课&#xff0c;是暄桐教室的必修课。而教练日课是丰富多彩的选修课&#xff0c;它会选出书法史/美术史上重要的、有营养的碑帖和画儿&#xff0c;与你一起&#xff0c;高效练习。而且暄桐教练日课远不止书法、国画&#xff0c;今后还会有更多有趣的课程陆续推出&…

NSSCTF 403,444,2145,3845,404,445

[SWPUCTF 2021 新生赛]简简单单的逻辑 py文件&#xff0c;使用pycharm打开进行分析 其中&#xff0c;hex()[2:]&#xff1a;将十进制转化为十六进制 zfill(2)&#xff1a;位数不足2&#xff0c;前补0 这里即将flag的ASCII码与key进行异或&#xff0c;再将每位转化为十六进制…

蓝桥杯第 6 场 小白入门赛 2.猜灯谜(for + 数组)

思路&#xff1a;注意是环形排列的灯笼&#xff0c;它的谜底是相邻两个灯笼的数字之和。这道题要用到两个数组&#xff0c;ans存答案&#xff0c;a存原数据。数据读入部分就不用说了&#xff0c;重点就是单独写明ans[0]和ans[n-1]两个取值&#xff0c;其他的用for循环数组就可以…

AtCoder Beginner Contest 345 A - E 题解

A - Leftrightarrow 思路 判断第一个字符是否为&#xff0c;最后一个字符是否为&#xff0c;都满足的话&#xff0c;再判断中间字符是否都为 代码 #include<iostream> using namespace std; #define int long longbool check(string s){int ns.size();if(s[0]!<) …

Jz32从上往下打印二叉树

//add()和remove()方法在失败的时候会抛出异常(不推荐) // 用offer 和poll 替代 import java.util.ArrayList; import java.util.*; /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public …

Oracle 部署及基础使用

1. Oracle 简介 Oracle Database&#xff0c;又名 Oracle RDBMS&#xff0c;简称 Oracle Oracle系统&#xff0c;即是以Oracle关系数据库为数据存储和管理作为构架基础&#xff0c;构建出的数据库管理系统。是目前最流行的客户/服务器&#xff08;client/server&#xff09;或…

洛谷P8972 『GROI-R1』 一切都已过去(树上前缀和+运算符重载)

『GROI-R1』 一切都已过去 题目背景 悦关上窗&#xff0c;拉上帘布。 果然还是想不起来啊。 隐约记得曾和什么人一起做过这样的事。 仰面躺下&#xff0c;手执一只木笺。 「究竟如何&#xff0c;才能拥有“过去”啊……」 她闭上双眼。 「6 岁前的记忆……究竟如何才能…

十、MySQL主从架构配置

一、资源配置 主库&#xff1a;192.168.134.132 从库&#xff1a;192.168.134.133 从库&#xff1a;192.168.134.134 二、主从同步基本原理&#xff1a; master用户写入数据&#xff0c;会生成event记录到binary log中&#xff0c;slave会从master读取binlog来进行数据同步…