​​SQLiteC/C++接口详细介绍之sqlite3类(十一)

返回目录:SQLite—免费开源数据库系列文章目录 

上一篇:​​SQLiteC/C++接口详细介绍之sqlite3类(十)

 下一篇:​​SQLiteC/C++接口详细介绍之sqlite3类(十二)(未发表)

33.sqlite3_free_table

sqlite3_free_table是SQLite3 C API提供的一个函数,用于释放由sqlite3_get_table函数获取的结果集中的内存。当SQLite3返回查询结果时,可能会根据结果集的行数和列数动态分配内存,用于存储查询结果。这时需要使用sqlite3_free_table函数来释放这些动态分配的内存。

该函数的具体形式为:

void sqlite3_free_table(char **result);

其中,result是一个指向结果集的指针,可以使用sqlite3_get_table函数获取。

需要注意的是,sqlite3_free_table函数只能释放sqlite3_get_table函数所分配的内存,不能释放其他任何内存块,否则可能会导致程序崩溃或者数据错误。下面是一个简单的示例,展示如何使用sqlite3_get_table函数获取SQLite3查询结果,并使用sqlite3_free_table函数释放相关的内存。

#include <sqlite3.h>
#include <stdio.h
int main(int argc, char* argv[]) {sqlite3* db;int rc;// 打开数据库rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {printf("Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 执行查询语句char* sql = "SELECT id, name, age FROM person";char** result;int nrow, ncol;rc = sqlite3_get_table(db, sql, &result, &nrow, &ncol, NULL);if (rc != SQLITE_OK) {printf("SQL error: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 输出结果for (int i = 0; i <= nrow; i++) {for (int j = 0; j < ncol; j++) {printf("%s\t", result[i * ncol + j]);}printf("\n");}// 释放内存sqlite3_free_table(result);// 关闭数据库sqlite3_close(db);return 0;
}

在上面的示例代码中,我们使用sqlite3_get_table函数执行一条SELECT语句,并将查询结果存储在result变量中。然后,使用两重循环遍历结果集,输出查询结果。

在使用完查询结果后,需要使用sqlite3_free_table函数释放result中的动态分配的内存,避免出现内存泄漏问题。

34.sqlite3_get_autocommit

用于查询当前数据库连接是否处于自动提交模式。

在SQLite3中,事务是由程序员来手动控制的,开发者可以在合适的时候调用BEGIN、COMMIT、ROLLBACK等命令来开始、提交或者回滚事务。而自动提交模式下,每个SQL语句都将会自动成为一个事务,如果执行成功,则自动提交;如果执行失败,则自动回滚。默认情况下,SQLite3的连接是处于自动提交模式下的,可以通过sqlite3_exec函数或者sqlite3_prepare函数来执行SQL语句。通过sqlite3_get_autocommit函数可以了解当前连接是否处于自动提交模式。

该函数的具体形式为:

int sqlite3_get_autocommit(sqlite3 *db);

其中,db是一个指向SQLite3数据库实例的指针。

返回值为1表示自动提交模式,返回值为0表示手动控制模式。

下面是一个简单的示例,展示如何使用sqlite3_get_autocommit函数查询当前数据库连接是否处于自动提交模式。

#include <sqlite3.h>
#include <stdio.h>
int main(int argc, char* argv[]) {sqlite3* db;int rc;// 打开数据库rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {printf("Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 执行查询操作int autocommit = sqlite3_get_autocommit(db);if (autocommit) {printf("Connection is in auto-commit mode.\n");} else {printf("Connection is not in auto-commit mode.\n");}// 关闭数据库sqlite3_close(db);return 0;
}

在上面的示例代码中,我们使用sqlite3_get_autocommit函数查询当前数据库连接是否处于自动提交模式。通过查询结果,输出到控制台上。

如果sqlite3_get_autocommit函数返回值为1,表示当前连接处于自动提交模式;如果返回值为0,表示当前连接处于手动控制模式。

35.sqlite3_get_clientdata

sqlite3_get_clientdata是SQLite3 C API提供的一个函数,它用于获取在一个特定连接上设置的客户端数据指针。客户端数据指针是开发人员可以将任何有用的信息与连接关联的一个指针,比如一个回调函数或其他结构体的指针。SQLite3库本身不会使用这个指针,而它将被传递给回调函数或其他应用程序代码,帮助管理连接特定的状态信息。

以下是sqlite3_get_clientdata函数的声明:

void* sqlite3_get_clientdata(sqlite3_context*);

其中,sqlite3_context*是由SQLite3回调函数提供的一个指向函数上下文的指针。

下面是一个简单的例子,展示如何在一个回调函数中将数据指针绑定到一个连接上,并如何在另一个回调函数中检索并使用该数据指针:```c

void my_func_callback(sqlite3_context* ctx, int argc, sqlite3_value** argv)
{// 检索指针并使用它my_data_t* data = (my_data_t*) sqlite3_get_clientdata(ctx);data->some_field = ...;// ...
}
void my_aggregate_step_callback(sqlite3_context* ctx, int argc, sqlite3_value** argv)
{// 检索指针并使用它my_data_t* data = (my_data_t*) sqlite3_get_clientdata(ctx);data->some_other_field += ...;// ...
}

// 初始化连接和绑定回调函数

my_data_t my_data = { 0 };
rc = sqlite3_create_function_v2(db, "my_function", 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC, &my_data, my_func_callback, NULL, NULL, NULL);
rc = sqlite3_create_function_v2(db, "my_aggregate", 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC, &my_data, NULL, my_aggregate_step_callback, NULL, NULL);

在上面的示例代码中,我们首先定义了与连接相关的数据结构——my_data_t,并将它的指针作为第五个参数传递到两个不同的回调函数中,这表明我们需要在连接上绑定一个数据指针。

然后调用sqlite3_create_function_v2函数来在数据库连接上绑定两个回调函数,第五个参数指定我们希望在连接上绑定的客户端数据指针。

然后在回调函数中调用sqlite3_get_clientdata函数来检索该指针,并使用它管理连接特定的状态。

36.sqlite3_limit

sqlite3_limit是SQLite3 C API提供的一个函数,它用于提前动态设置不同类型的限制。

SQLite3是一个嵌入式关系型数据库管理系统,非常适合于在嵌入式系统和移动设备中使用。为了避免在这些受限资源的系统上过度消耗内存和其他资源,SQLite3提供了一些限制类型,以减少对资源的占用。

SQLite3中的限制(limit)包括数据库上限、附加数据库上限、单一通道SQL语句占用内存限制、执行器线程的最大数量和单条SQL请求执行的语句数等等。sqlite3_limit函数允许开发人员动态地设置各种SQLite3限制类型的值。

以下是sqlite3_limit函数的声明:

int sqlite3_limit(sqlite3*, int id, int newVal);

其中,sqlite3是指向SQLite3数据库实例的指针,id是预先定义的的某个特定类型的限制选项,newVal是与该选项相关联的新值。

以下是一些预先定义的限制标识符和它们的意义:

|LIMIT ID|描述|
|---|---|
|SQLITE_LIMIT_LENGTH|SQL语句的最大长度|
|SQLITE_LIMIT_SQL_LENGTH|列名称、表名称、声明集合长度的SQL语句的最大长度|
|SQLITE_LIMIT_COLUMN|表中列的最大数目|
|SQLITE_LIMIT_EXPR_DEPTH|表达式树中的最大深度(递归层数)|
|SQLITE_LIMIT_COMPOUND_SELECT|select语句中联合查询的最大数量|
|SQLITE_LIMIT_VDBE_OP|虚拟机程序在sqlite3_prepare函数中指定的限制的连续操作数最大值|

下面是一个简单的示例,展示如何使用sqlite3_limit函数设置sqlite3的最大语句长度限制为65536:

#include <sqlite3.h>
#include <stdio.h>
int main(int argc, char* argv[]) {sqlite3* db;int rc;// 打开数据库rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {printf("Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 设置最大语句长度限制rc = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, 65536);if (rc != SQLITE_OK) {printf("Can't set limit: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 关闭数据库sqlite3_close(db);return 0;
}

在上面的示例代码中,我们使用sqlite3_limit函数设置SQLite3的最大可执行SQL语句长度为65536。如果设置操作成功,sqlite3_limit函数将返回SQLITE_OK;如果设置操作失败,将返回一个错误代码。

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

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

相关文章

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了&#xff0c;指针数组的存放指针的数组&#xff0c;那数组指针变量是什么呢&#xff1f; 显而易见&#xff0c;数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址&#xff0c;我们可以…

Helm的资源安装和基本使用

目录 一.Helm的出现 二.Helm工具 1.部署helm 2.helm可用命令介绍 三.chart 1.添加、查看、删除存储库 2.查找chart、查看chart信息、安装chart等 3.安装chart后产生的release 四.安装mysql举例 1.固定chart安装 2.自定义chart安装 一.Helm的出现 在前面的k8s部署po…

13. C++类的简单理解

全面理解C中的类 1. 类的访问属性&#xff1a;public&#xff0c;protect&#xff0c;private C中类的成员变量和函数都带有三种属性中的一种&#xff0c;假如没有特别声明&#xff0c;那么就默认是私有的&#xff08;除了构造函数&#xff09;。public表示是公开的&#xff…

[WUSTCTF2020]颜值成绩查询 --不会编程的崽

这题也是一个很简单的盲注题目&#xff0c;这几天sql与模板注入做麻了&#xff0c;也是轻松拿捏。 它已经提示&#xff0c;enter number&#xff0c;所有猜测这里后台代码并没有使用 " 闭合。没有明显的waf提示&#xff0c; 但是or&#xff0c;and都没反应。再去fuzz一…

二叉树OJ练习

本文旨在讲解有关二叉树的OJ题目&#xff0c;希望读完本文&#xff0c;能让读者都二叉树有更深一步的认识&#xff01; 正文开始&#xff01; 106. 根据二叉树创建字符串 算法思想&#xff1a; 根据题目的输出结果&#xff0c;可以观察出如下规律&#xff01; 1.若左右结点都…

Spring Boot整合STOMP实现实时通信

目录 引言 代码实现 配置类WebSocketMessageBrokerConfig DTO 工具类 Controller common.html stomp-broadcast.html 运行效果 完整代码地址 引言 STOMP&#xff08;Simple Text Oriented Messaging Protocol&#xff09;作为一种简单文本导向的消息传递协议&#xf…

sqllab第二十七A关通关笔记

知识点&#xff1a; 双引号闭合union select 大小写绕过 Union Select这里不能进行错误注入&#xff0c;无回显 经过测试发现这是一个双引号闭合 构造payload:id1"%09and%091"1 页面成功回显 构造payload:id0"%09uNion%09SElect%091,2,3%09"1 页面成功…

在雄安新区买新房要注意什么?有哪些注意事项?

雄安新区新建住宅均价每平方米11735元起&#xff0c;二手房每平方米8950元起。 整体价格非常有优势。 雄安新区房价走势与区域发展直接相关。 而且&#xff0c;雄安新区已经成立五周年了。 2022年&#xff0c;雄安新区多项重点项目将陆续竣工。 雄安新区城市基础设施建设已初具…

Linux之shell循环

华子目录 for循环带列表的for循环格式分析示例shell允许用户指定for语句的步长&#xff0c;格式如下示例 不带列表的for循环示例 基于C语言风格的for循环格式示例注意 while循环格式示例 until循环作用格式示例 循环控制breakcontinue详细语法示例 循环嵌套示例 for循环 for循…

深度学习——SAM(Segment-Anything)代码详解

目录 引言代码目录segment-anything 代码详解build_sam.pypredictor.pyautomatic_mask_generator.py 引言 从去年年初至今&#xff0c;SAM(Segment Anything )已经问世快一年了&#xff0c;SAM凭借其强大而突出的泛化性能在各项任务上取得了优异的表现&#xff0c;广大的研究者…

源码编译部署LAMP

编译部署LAMP 配置apache [rootzyq ~]#: wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz --2023-12-11 14:35:57-- https://downloads.apache.org/apr/apr-1.7.4.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104…

BUUCTF-WEB1

[ACTF2020 新生赛]Exec1 1.打开靶机 是一个ping命令 2.利用管道符“|” ping一下本地主机并查看ls ping 127.0.0.1 | ls 可以看到回显的内容是一个文件 127.0.0.1 | cat index.php #查看主机下index.php 127.0.0.1 | ls / #查看主机根目录下的文件 看的一个flag文件 …

数据仓库数据分层详解

数据仓库中的数据分层是一种重要的数据组织方式&#xff0c;其目的是为了在管理数据时能够对数据有一个更加清晰的掌控。以下是数据仓库中的数据分层详解&#xff1a; 原始数据层&#xff08;Raw Data Layer&#xff09;&#xff1a;这是数仓中最底层的层级&#xff0c;用于存…

jupyter闪退和自动跳转问题

1.闪退问题 当我们点击jupyter时&#xff0c;它会闪一下&#xff0c;然后无法进入&#xff0c;这个时候我们可以去prompt命令行输入jupyter notebook启动试试&#xff0c;如果还不行&#xff0c;我们可以根据报错去解决&#xff0c;一般csdn上都有对应情况&#xff0c;直接搜索…

Linux-新手小白速秒Hadoop集群全生态搭建(图文混编超详细)

在之前的文章中&#xff0c;我教会大家如何一步一步搭建一个Hadoop集群&#xff0c;但是只提供了代码&#xff0c;怕有些朋友会在一些地方产生疑惑&#xff0c;今天我来以图文混排的方式&#xff0c;一站式交给大家如何搭建一个Hadoop高可用集群包括&#xff08;HadoopHA&#…

el-select使用filterable下拉无法关闭得问题

这里推荐一个前端框架 sakuya / SCUI&#xff0c;他里面有个formTable&#xff0c;可以解决很多订单明细保存得问题。基本沿用element-plus的前端使用模式&#xff0c;让表单表格变的非常容易。 这个的供应商插件&#xff0c;当使用filterable后&#xff0c;点击表格重的选项&…

Redis Desktop Manager:一站式Redis数据库管理与优化

Redis Desktop Manager是一款功能强大的Redis桌面管理工具&#xff0c;也被称作Redis可视化工具。以下是其主要的功能特色&#xff1a; 连接管理&#xff1a;Redis Desktop Manager支持连接多个Redis服务器&#xff0c;用户可以在同一界面下管理多个数据库&#xff0c;大大提高…

记录一下在Pycharm中虚拟环境的创建

如果在Pycharm中要新建一个虚拟环境&#xff0c;那你可以在Terminal中选择Command Prompt&#xff0c;在这里面执行相关命令 一、安装了Anaconda&#xff0c;创建虚拟环境 当你使用解释器是Anaconda提供的时&#xff0c;你可以使用conda命令执行&#xff0c;见以下操作&#x…

前端Vue与uni-app中的九宫格、十二宫格和十五宫格菜单组件实现

在前端 Vue 开发中&#xff0c;我们经常会遇到需要开发九宫格、十二宫格和十五宫格菜单按钮的需求。这些菜单按钮通常用于展示不同的内容或功能&#xff0c;提供给用户快速访问和选择。 一、引言 在前端开发中&#xff0c;九宫格、十二宫格和十五宫格菜单按钮是一种常见的布局…

202206 CSP认证 | 角色授权

角色授权 fine&#xff0c;又是一道acwing上TLE但是平台通过了的&#xff0c;那就酱吧… 直接跟着题目来模拟的…先找到每个用户授予的所有角色&#xff0c;包括用户本身和它所属的用户组。 然后遍历这个角色集合&#xff0c;看是否有操作权限&#xff0c;种类权限以及资源名称…