SQLiteC/C++接口详细介绍之sqlite3类(六)

news2024/12/27 16:28:07

   快速前往文章列表: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://www.coloradmin.cn/o/1517355.html

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

相关文章

手机安装Kali Linux

在数字化时代&#xff0c;信息安全和隐私保护显得尤为重要。Kali Linux&#xff0c;作为一款专业的渗透测试和安全审计工具&#xff0c;因其强大的功能和丰富的资源库而受到广大安全研究者和爱好者的青睐。然而&#xff0c;我们通常只能在传统的电脑设备上安装和使用Kali Linux…

外卖小程序-购物车模块表结构设计和后端代码

表结构设计 添加购物车代码 Service public class ShoppingCartServiceImpl implements ShoppingCartService {Autowiredprivate ShoppingCartMapper shoppingCartMapper;Autowiredprivate DishMapper dishMapper;Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物…

在Linux/Ubuntu/Debian中使用7z压缩和解压文件

要在 Ubuntu 上使用 7-Zip 创建 7z 存档文件&#xff0c;你可以使用“7z”命令行工具。 操作方法如下&#xff1a; 安装 p7zip&#xff1a; 如果你尚未在 Ubuntu 系统上安装 p7zip&#xff08;7-Zip 的命令行版本&#xff09;&#xff0c;你可以使用以下命令安装它&#xff1a;…

某夕夕商品数据抓取逆向之webpack扣取

逆向网址 aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbQ 逆向链接 aHR0cHM6Ly93d3cucGluZHVvZHVvLmNvbS9ob21lL2JveXNoaXJ0 逆向接口 aHR0cHM6Ly9hcGl2Mi5waW5kdW9kdW8uY29tL2FwaS9naW5kZXgvdGYvcXVlcnlfdGZfZ29vZHNfaW5mbw 逆向过程 请求方式&#xff1a;GET 参数构成 【anti_content】…

PHP中的反序列化漏洞

PHP中的反序列化漏洞 目录 PHP 中的序列化与反序列化 概述 序列化 基本类型的序列化 对象的序列化 反序列化 示例序列化与反序列化 反序列化漏洞 - PHP 中的魔术方法 - Typecho_v1.0 中的反序列化漏洞 POP链的构造思路 pop链案例 反序列化逃逸 字符串逃逸&#xff…

GoLang:云原生时代致力于构建高性能服务器的后端语言

Go语言的介绍 概念 Golang&#xff08;也被称为Go&#xff09;是一种编程语言&#xff0c;由Google于2007年开始设计和开发&#xff0c;并于2009年首次公开发布。Golang是一种静态类型、编译型的语言&#xff0c;旨在提供高效和可靠的软件开发体验。它具有简洁的语法、高效的编…

C# wpf 使用GDI实现截屏

wpf截屏系列 第一章 使用GDI实现截屏&#xff08;本章&#xff09; 第二章 使用GDI实现截屏 第三章 使用DockPanel制作截屏框 第四章 实现截屏框热键截屏 第五章 实现截屏框实时截屏 第六章 使用ffmpeg命令行实现录屏 文章目录 wpf截屏系列前言一、导入gdi32方法一、NuGet获取…

【LeetCode: 102. 二叉树的层序遍历 + bfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

国产化三防笔记本丨亿道国产加固笔记本FT-2000/4处理器

国产化加固笔记本是指采用国产操作系统和处理器&#xff0c;通过技术手段对其进行硬件加固、软件加密、数据安全等多方面加强处理的产品。这种笔记本电脑通常被用于政府项目、金融行业等对安全性要求极高的领域。 在国产化加固笔记本中&#xff0c;硬件加固是重要的一环。为了保…

架构实战--以海量存储系统讲解热门话题:分布式概念

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

腾讯云轻量服务器地域选择教程,2024最新地域选择攻略

腾讯云服务器地域怎么选择&#xff1f;不同地域之间有什么区别&#xff1f;腾讯云哪个地域好&#xff1f;地域选择遵循就近原则&#xff0c;访客距离地域越近网络延迟越低&#xff0c;速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素&#xff0c;地域节点选择…

Github主页设置贪吃蛇详细教程

先看最终实现结果&#xff1a; 有条贪吃蛇放在主页还是蛮酷的哈哈哈。接下来我来讲一讲怎么在Github主页添加一条贪吃蛇。 首先要修改自己的Github的主页&#xff0c;我们得有一个特殊的仓库——这个仓库必须与你的Github用户名保持一致&#xff0c;并且需要公开&#xff0c…

ArcGIS全系列实战视频教程——9个单一课程组合+系列直播回放

《ArcGIS全系列实战视频教程》是由9个单一课程组合合成。组成一条ArcGIS入门实战各项专题深入应用学习全链条&#xff0c;让你学有方向、学有目的&#xff0c;系统全面掌握ArcGIS。 ArcGIS全系列实战视频教程——9个单一课程组合https://edu.csdn.net/combo/detail/2569 《Ar…

unity2D生成9*9格子

1.创建一个空对象和格子 2将格子做成预制体&#xff08;直接将格子拖到这里即可&#xff0c;拖了过后删掉原来的格子&#xff09; 3.创建脚本并将脚本拖到空对象上 using System.Collections; using System.Collections.Generic; using UnityEngine;public class CreateMap : M…

增删卜易——八宫六十四卦

之前看倪海厦的《天纪》笔记里面提到了六十四卦世应,觉得不知道这个世应是啥意思。很长时间就没看了,偶然间看到了张文江教授写的一本书《潘雨廷先生谈话录》提到了《卜筮正宗》,“卜筮最后的判断是非理性转义,其他一切都只是形式”,“明人的著作,从京氏易出,如今天几日…

GitHub 服务器

GitHub 服务器 公司中&#xff0c;我们可以搭建中央服务器让项目组开发人员共享代码&#xff0c;但是如果我们的开发人员都是通过互联网进行协作&#xff0c;而不是在同一个地方&#xff0c;那么开发时&#xff0c;程序文件代码的版本管理就显得更加重要&#xff0c;这就需要搭…

企业数据流动安全管理软件(深度解析文章)

企业数据重要性不言而喻&#xff0c;而同时数据的流动和共享也带来了安全风险&#xff0c;如何确保企业数据在流动过程中的安全性&#xff0c;也成为了企业需要面临的重要问题。 企业数据流动安全管理软件的主要功能是监控和管理企业数据的流动过程。 它能够对企业内部的数据…

OpenCASCADE开发指南<八>:OCC 数据结构分析之二三维几何数据

数据结构,指的是数据元素之间的相互关系,尤其是数据的逻辑结构。选择数据结构的主要依据是数据的逻辑结构[6]。 因此&#xff0c; 本章将主要描述三种数据的逻辑结构。这三种数据包括&#xff1a;二维几何数据、三维几何数据和拓扑数据。 1 数据结构模块的整体框架 OCC 的第二…

GPT实战系列-如何让LangChain的Agent选择工具

GPT实战系列-如何让LangChain的Agent选择工具 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…

ts文件怎么无损转换mp4?这样设置转换模式~

TS格式&#xff08;Transport Stream&#xff09;的起源可追溯到数字电视广播领域。设计初衷是解决视频、音频等多媒体数据在传输和存储中的问题。采用一系列标准技术&#xff0c;TS格式让视频信号能够以流的形式传输&#xff0c;因此在数字电视、广播等领域得到广泛应用。 MP4…