【SQLite3】常用API

SQLite3常用API

数据库的打开和关闭

数据库的打开(sqlite3_open函数)

sqlite3_open() 函数用于打开一个 SQLite 数据库文件的函数,函数原型如下:

int sqlite3_open(const char *filename,   /* 数据库文件的文件名,如果为 ":memory:" 则表示创建内存中数据库 */sqlite3 **ppDb          /* 返回指向数据库连接句柄的指针 */
);

这个函数使用指定的数据库文件名(或 :memory:)打开一个新的数据库连接,并且把连接句柄返回给调用者如果连接成功,将会返回 SQLITE_OK 编码(0),否则将会返回其他错误代码
需要注意的是,SQLite 数据库文件不存在时将会自动创建。如果 filename 参数为 NULL ,该函数返回 SQLITE_MISUSE (错用 SQLite 调用)错误。ppDb 参数是一个二级指针,它将存储一个指向打开的数据库连接的指针,该指针需要在后续的 SQLite 操作中使用
例如,以下是在 C 语言中打开一个 SQLite 数据库的示例代码:

#include <stdio.h>
#include <sqlite3.h>int main() {sqlite3 *db;/*打开数据库*/int rc = sqlite3_open("test.db", &db);if (rc == SQLITE_OK) {printf("已成功打开数据库\n");sqlite3_close(db); // 关闭数据库连接} else {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}return 0;
}

在此示例中,打开名为 “test.db” 的 SQLite 数据库连接,并检查是否成功
如果连接成功,则输出 "已成功打开数据库" 消息,然后关闭连接,否则将会输出错误信息。

数据库的关闭(sqlite3_close函数)

sqlite3_close() 函数用于关闭指定数据库连接的函数。函数原型如下:

int sqlite3_close(sqlite3*);

该函数接收一个被打开的数据库连接指针,如果成功关闭返回 SQLITE_OK 编码(0),否则返回其他错误代码。
在使用完SQLite数据库连接之后,应该释放它以避免资源泄漏和内存占用。调用 sqlite3_close() 函数将关闭数据库连接,并释放所有相关的资源,包括已编译的语句等。如果在关闭连接之前还有未完成的事务,则会自动回滚这些事务
例如,以下是在 C 语言中关闭 SQLite 数据库连接的示例代码:

#include <sqlite3.h>int main() {sqlite3 *db;int rc = sqlite3_open("test.db", &db);// 执行一些数据库操作// ...rc = sqlite3_close(db);if (rc == SQLITE_OK) {printf("Closed database successfully\n");} else {fprintf(stderr, "Can't close database: %s\n", sqlite3_errmsg(db));}return 0;
}

在此示例中,在执行所需的 SQLite 操作之后,使用 sqlite3_close() 函数关闭数据库连接。如果没有出现错误,则输出 “Closed database successfully” 消息,否则将会输出错误信息

执行SQL语句(sqlite3_exec函数)

sqlite3_exec函数介绍

sqlite3_exec() 函数用于在 SQLite 数据库连接上执行一条或多条 SQL 语句,并调用一个回调函数处理执行结果。该函数的原型如下:

int sqlite3_exec(sqlite3*,                                  /* 执行 SQL 命令的数据库连接 */const char *sql,                           /* 待执行的 SQL 命令 */int (*callback)(void*,int,char**,char**),  /* 在执行命令时的回调函数 */void *,                                    /* 作为第一个参数传递给回调函数的指针 */char **errmsg                              /* 用于存储错误消息的指针 */
);

该函数接收一个打开的数据库连接 sqlite3*,待执行的 SQL 命令 sql,以及一个回调函数 callback,可以选择性地传递一个指向用户数据的指针作为回调函数的第一个参数
该句话的意思是,回调函数的参数列表(签名)决定了该函数在被调用时应接收哪些参数,并指定了它们的数据类型和顺序。
回调函数必须符合以下格式:

int (*callback)(void*, int, char**, char**);
  • 第一个参数 void*,是使用者传递给 sqlite3_exec() 调用的 void* 参数。
  • 第二个参数 int,是查询结果所返回的列数。
  • 第三个参数 char**,是包含每个结果集元素值的字符串数组。
  • 第四个参数 char**,是包含每个结果集元素的列名称的字符串数组。这通常会在 SELECT 语句中返回。

回调函数的返回值应为整数,并且通常全部返回0表示执行成功。如果需要提前终止查询或在回调函数过程中发现错误,可以返回非零值
errmsg 是用于保存 sqlite3_exec() 返回的错误消息的指针。
当函数成功执行 SQL 命令时,将会返回 SQLITE_OK 编码(0),否则将会返回其他错误代码。如果在执行命令时发生错误,则 errmsg 将被设置为一个非空值,其中包含有关错误的详细信息。如果 errmsg 未被设置,则表示该函数执行成功。

sqlite3_exec()函数应用

使用sqlite3_exec()函数创建表

以下是一个使用 sqlite3_exec() 函数执行 SQL 命令的示例代码:

#include <sqlite3.h>
#include <stdio.h>int main(int argc, char* argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;/*打开数据库*/rc = sqlite3_open("test.db", &db);if (rc) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;} else {fprintf(stdout, "Opened database successfully\n");}/*创建表的SQL语句*/char *sql = "CREATE TABLE COMPANY(""ID INT PRIMARY KEY     NOT NULL,""NAME           TEXT    NOT NULL,""AGE            INT     NOT NULL);";/*执行SQL语句*/rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Table created successfully\n");}/*关闭数据库文件*/sqlite3_close(db);return 0;
}

述代码中,首先调用sqlite3_open()函数打开一个名为"test.db"的数据库连接,然后使用CREATE TABLE语句创建一张名为"COMPANY"的表格。
该表格包含三列,分别是"id"、“name"和"age”。
其中,id列被定义为主键(PRIMARY KEY),且不能为NULL。
接下来,通过调用sqlite3_exec()函数执行SQL语句,
将该语句传递给SQLite引擎进行解析和执行。
如果执行成功,则输出"Table created successfully",
否则输出具体的错误消息。

使用sqlite3_exec()函数向表中插入数据

创建好表格以后我们就可以向其添加数据了:

#include <sqlite3.h>
#include <stdio.h>int main(int argc, char* argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;/*打开数据库*/rc = sqlite3_open("test.db", &db);if (rc) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;} else {fprintf(stdout, "Opened database successfully\n");}/*创建表的SQL语句*/char *sql = "INSERT INTO COMPANY (ID,NAME,AGE) VALUES (1, '张三', 32);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (2, '李四', 33);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (3, '王五', 30);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (4, '王博', 32);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (5, '李为', 33);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (6, '赵倩', 30);";/*执行SQL语句*/rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {fprintf(stdout, "Records created successfully\n");}/*关闭数据库文件*/sqlite3_close(db);return 0;
}

在上述代码中,需要先调用sqlite3_open()函数打开数据库连接。然后,使用INSERT INTO语句将一条记录插入到"COMPANY"表格中。该记录包含三个字段,分别是"id"、“name"和"age”,对应的值分别为1、'张三’和32。最后,通过sqlite3_exec()函数执行SQL语句,并根据返回值判断操作是否成功。

使用sqlite3_exec()函数查询数据
#include <sqlite3.h>
#include <stdio.h>// 回调函数
int callback(void *data, int argc, char **argv, char **azColName) {int i;printf("callback:\n");for(i = 0; i < argc; i++) {printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}int main () {sqlite3 *db;char *zErrMsg = 0; // 存储错误消息的指针int rc;rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}const char* sql = "SELECT * from COMPANY";rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Operation done successfully\n");}sqlite3_close(db);return rc;
}

在此示例中,我们定义了一个回调函数 callback(),该函数用于处理 sqlite3_exec() 执行结果。
接下来,我们打开一个名为 “test.db” 的 SQLite 数据库连接,并执行 SELECT 命令。
最后,我们通过检查 rczErrMsg 的返回值,判断查询是否成功并处理执行结果。

void *data的作用是什么?

void *data是sqlite3_exec()函数的第四个参数,它是一个用户定义的指针类型,提供了一个通用的方法来传递额外的数据给回调函数。sqlite3_exec()函数的高级用法
示例代码:

#include <sqlite3.h>
#include <stdio.h>// 回调函数
int callback(void *data, int argc, char **argv, char **azColName) {int i;if(argv[0][0] == '1')printf("%s\n", (char *)data);for(i = 0; i < argc; i++) {printf("%s\t", argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}int main () {sqlite3 *db;char *zErrMsg = 0; // 存储错误消息的指针int rc;rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}char *str = "ID\t名字\t年龄";char *sql = "SELECT * from COMPANY";rc = sqlite3_exec(db, sql, callback, str, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Operation done successfully\n");}sqlite3_close(db);return rc;
}

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

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

相关文章

.net6+ 在单文件应用程序中获取程序集位置

一般来说,获取执行程序集的位置&#xff0c;您可以调用: var executableDirectory System.Reflection.Assembly.GetExecutingAssembly().Location;如果发布为单个文件, 会提示如下警告 warning IL3000: System.Reflection.Assembly.Location always returns an empty string…

解析Java中1000个常用类:EnumMap类,你学会了吗?

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

python破解字母已知但大小写未知密码

python穷举已知字符串中某个或多个字符为大写的所有情况 可以使用递归函数来实现这个功能。以下是一个示例代码&#xff1a; def generate_uppercase_combinations(s, index0, current):if index len(s):print(current)returngenerate_uppercase_combinations(s, index 1, …

图神经网络dgl和torch-geometric安装

文章目录 搭建环境dgl的安装torch-geometric安装 在跑论文代码过程中&#xff0c;许多小伙伴们可能会遇到一些和我一样的问题&#xff0c;就是文章所需要的一些库的版本比较老&#xff0c;而新版的环境跑代码会报错&#xff0c;这就需要我们手动的下载whl格式的文件来安装相应的…

数字信号处理及MATLAB仿真(3)——量化的其他概念

上回书说到AD转换的两个步骤——量化与采样两个步骤。现在更加深入的去了解以下对应的概念。学无止境&#xff0c;要不断地努力才有好的收获。万丈高楼平地起&#xff0c;唯有打好基础&#xff0c;才能踏实前行。 不说了&#xff0c;今天咱们继续说说这两个步骤&#xff0c;首先…

cloudflare tunnels tcp

这里是官网的说明Cloudflare Tunnel Cloudflare Zero Trust docs 根据实际情况安装环境 tunnels除了http,https协议是直接暴露公网&#xff0c;tcp是类似ssh端口转发。 在需要内网穿透的局域网找一条机子部署代理 我这边是window cloudflared tunnel login #生成一个身份校…

计算机网络 5.4中继器 5.5集线器

第四节 中继器 一、认识中继器 1.作用&#xff1a;对信号整形、放大&#xff0c;使之传播更远的距离。 2.特点&#xff1a; ①由中继器连接起来的两端必须采用相同介质访问控制协议。 ②理论上中继器的使用是无限的&#xff0c;但实际只能在规定的范围内有效工作&#xff0…

windows上传app store的构建版本简单方法

我们在上传app store上架&#xff0c;或上传到testflight进行ios的app测试的时候&#xff0c;需要mac下的上传工具上传ipa文件到app store的构建版本上。 然而windows电脑这些工具是无法安装的。 因此&#xff0c;假如在windows上开发hbuilderx或uniapp的应用&#xff0c;可以…

Mobile ALOHA: 你需不需要一个能做家务的具身智能机器人

相信做机器人的朋友最近一段时间一定被斯坦福华人团队这个Mobile ALOHA的工作深深所震撼&#xff0c;这个工作研究了一个能做饭&#xff0c;收拾衣服&#xff0c;打扫卫生的服务机器人&#xff0c;完成了传统机器人所不能完成的诸多任务&#xff0c;向大家展示了服务机器人的美…

一文全解Nginx

一文全解Nginx 一文全解 Nginx 1. 技术介绍 Nginx&#xff08;发音为"engine-x"&#xff09;是一个高性能的开源 Web 服务器软件&#xff0c;同时也可以用作反向代理、负载均衡器和 HTTP 缓存。它最初由俄罗斯的 Igor Sysoev 开发&#xff0c;并于 2004 年首次公开…

在Qt中使用C++编程与传统C++编程的区别

引言 C作为一种强大的编程语言&#xff0c;被广泛应用于系统编程、游戏开发、嵌入式系统等领域。而Qt作为一个跨平台的应用开发框架&#xff0c;通过其丰富的功能库和高效的开发工具&#xff0c;使得C开发变得更加高效和便捷。本文将深入探讨在Qt中使用C编程与传统C编程的区别…

el-date-picker 设置默认值为当前日期

this.listQuery.Date new Date().toISOString().substr(0, 10); <el-date-picker v-model"listQuery.Date" format"yyyy-MM-dd" value-format"yyyy-MM-dd" type"date" placeholder"选择日期" change"getList()&qu…

【MySQL】4.MySQL 的数据类型

MySQL 的数据类型 一.数据类型分类在这里插入图片描述二.注意点1.char VS varchar2.datetime VS timestamp3.enum 和 set 的使用方法 一.数据类型分类 二.注意点 1.char VS varchar char 的意义是直接开辟固定大小的空间&#xff0c;浪费磁盘空间&#xff0c;但是效率高varcha…

WEB05Web开发HTMLCSS

Web前端开发 什么是 Web &#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 Web 网站的工作流程 W3C 万维网联盟&#xff08; World Wide Web Consortium &#xff09;&#xff0c;创建于1994年1…

ESP32-C3模组上跑通AES-GCM(1)

本文内容参考: mbedtls学习笔记 AES GCM_aes128 gcm的aad是什么-CSDN博客 https://www.cnblogs.com/testlearn/p/16547583.html 对称加密和非对称加密,一文讲解明白!-CSDN博客 深入理解高级加密标准(Advanced Encryption Standard)_aes在线加密-CSDN博客 特此致谢! …

OpenEarthMap:全球高分辨率土地覆盖制图的基准数据集(开源来下载!!!)

OpenEarthMap由220万段5000张航拍和卫星图像组成&#xff0c;覆盖6大洲44个国家97个地区&#xff0c;在0.25-0.5m的地面采样距离上人工标注8类土地覆盖标签。我们提供8类标注:裸地、牧场、已开发空间、道路、树木、水、农业用地和建筑。类选择与现有的具有亚米GSD的产品和基准数…

std::unordered_map和std::map在性能上有何不同

std::unordered_map和std::map在性能上的不同主要体现在以下几个方面&#xff1a; 1. 底层数据结构 std::unordered_map&#xff1a;基于哈希表实现&#xff0c;通过哈希函数计算元素的存储位置。哈希表能够直接通过哈希值快速定位到元素的位置&#xff0c;从而实现高效的查找…

30、PHP 实现 左旋转字符串、翻转单词顺序列

题目&#xff1a; PHP 实现 左旋转字符串 描述&#xff1a; 汇编语言中有一种移位指令叫做循环左移&#xff08;ROL&#xff09;&#xff0c;现在有个简单的任务&#xff0c; 就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S&#xff0c;请你把其循环左移K位后的…

电源纹波相关

什么是纹波&#xff1f;什么是噪声&#xff1f; 这种叠加在直流稳定量上的交流分量就称为纹波。 纹波的危害 电源纹波能影响设备性能和稳定性 纹波会导致电器上产生谐波&#xff0c;降低电源的使用效率&#xff1b; 高频电源纹波可能会产生浪涌电压或电流&#xff0c;影响设…

android deep links即scheme uri跳转以及googlePlay跳转配置

对于googlePlay的Custom URL就是googlePlay上APP网址&#xff1a; https://play.google.com/store/apps/details?idcom.yourapp如果是国内一些应用&#xff0c;则考虑market://包名等方式&#xff0c;自行百度。 对于Android URI Scheme&#xff1a; 首先需要在Manifest xm…