【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.mfbz.cn/a/782019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP32CAM物联网教学02

ESP32CAM物联网教学02 物联网门锁 小智来到姑姑家门口&#xff0c;按了门铃&#xff1b;还在公司上班的姑姑用电脑给小智开了门&#xff0c;让他先进屋休息。小智对物联网门锁产生了兴趣&#xff1a;什么是物联网&#xff1f;为什么这么厉害&#xff1f; 初识物联网 我们在百…

【论文阅读笔记】Meta 3D AssetGen

【论文阅读笔记】Meta 3D AssetGen: Text-to-Mesh Generation with High-Quality Geometry, Texture, and PBR Materials Info摘要引言创新点 相关工作T23D基于图片的3d 重建使用 PBR 材料的 3D 建模。 方法文本到图像:从文本中生成阴影和反照率图像Image-to-3D:基于pbr的大型重…

python 比webdriver更好用的ChromiumPage

优点&#xff08;目前发现的&#xff09;&#xff1a; 不用配合selenium不用下载对应浏览器的webdriver&#xff0c;不用对应浏览器版本不用设置webdriver路径之类的设置目前没看到有出现像webdriver类似的浏览器被控制的提示&#xff0c;使用过程中好像也没被检测出来。每次不…

unity3d:Shader知识点,矩阵,函数,坐标转换,Tags,半透明,阴影,深度,亮度,优化

基本结构 Shader "MyShaderName" {Properties {// 属性}SubShader {// 针对显卡A的SubShaderPass {// 设置渲染状态和标签Tags { "LightMode""ForwardBase" }// 开始Cg代码片段CGPROGRAM// 该代码片段的编译指令&#xff0c;例如&#xff1a;#p…

【vite创建项目】

搭建vue3tsvitepinia框架 一、安装vite并创建项目1、用vite构建项目2、配置vite3、找不到模块 “path“ 或其相对应的类型声明。 二、安装element-plus1、安装element-plus2、引入框架 三、安装sass sass-loader1、安装sass 四、安装vue-router-next 路由1、安装vue-router42搭…

python基础篇(8):异常处理

在Python编程中&#xff0c;异常是程序运行时发生的错误&#xff0c;它会中断程序的正常执行流程。异常处理机制使得程序能够捕获这些错误&#xff0c;并进行适当的处理&#xff0c;从而避免程序崩溃。 1 错误类型 代码的错误一般会有语法错误和异常错误两种&#xff0c;语法错…

CTF常用sql注入(一)联合注入和宽字节

0x01 前言 给自己总结一下sql注入的常用姿势吧&#xff0c;记录一下学习 0x02 联合 联合注入的关键词是union SQL的union联合注入原理是联合两个表进行注入攻击&#xff0c;使用union select关键词来进行联合查询。 那么为什么我们在题目中一般是只写一个呢 因为 $sql &quo…

逆变器学习笔记(三)

DCDC电源芯片外围器件选型_dcdc的comp补偿-CSDN博客、 1.芯片的COMP引脚通常用于补偿网络&#xff1a; 芯片的COMP引脚通常用于补偿网络&#xff0c;在控制环路中发挥重要作用。COMP引脚接电容和电阻串联接地&#xff0c;主要是为了稳定控制环路、调整环路响应速度和滤波噪声…

cs231n作业1——SVM

参考文章&#xff1a;cs231n assignment1——SVM SVM 训练阶段&#xff0c;我们的目的是为了得到合适的 &#x1d44a; 和 &#x1d44f; &#xff0c;为实现这一目的&#xff0c;我们需要引进损失函数&#xff0c;然后再通过梯度下降来训练模型。 def svm_loss_naive(W, …

NAT 打洞

由于 ipv4 地址数量的有限性&#xff0c;导致实际网络部署模式中存在大量的 NAT 网络。对于 NAT 内部的主机&#xff0c;可以主动发起去公网的流量&#xff0c;但对于位于不同 NAT 内的两台主机而言&#xff0c;想要直接进行点对点的连接&#xff0c;就需要用到打洞技术了。 常…

Bash ——shell

Bash作为用户与操作系统之间的接口&#xff0c;让用户通过命令行输入各种指令来控制和操作计算机系统。 shell的两种解释&#xff1a; 1.linux命令解释器 Terminal 终端 ——》shell命令 ——》 Linux kernel &#xff08;内核&#xff09; Linux内核的作用&#xff1a; 1.…

AI与编程:一个学生的心路历程与思考

前言 大家好&#xff0c;本人是在一个在校的大学生&#xff0c;方向是前端语言。爱好是码代码和看一点小新闻&#xff0c;游戏也是喜爱的。其实本篇文章的想法是源于网上一些人对AI以及对前端的看法&#xff0c;看完网上的评论后我也是有感而发。本篇文章的讨论中心也是围绕着A…

IDA*——AcWing 180. 排书

IDA* 定义 IDA*&#xff08;Iterative Deepening A*&#xff09;是一种结合了深度优先搜索&#xff08;DFS&#xff09;的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题&#xff0c;尤其是当搜索空间很大或者搜索成本不确定时。 IDA* 是…

SprongBoot及其基础应用全套部署脚本和配置

POM.xml配置 </dependencies> <!--skywalking日志监控依赖--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version></dependency&g…

轻松驾驭开发之旅:Maven配置阿里云CodeUp远程私有仓库全攻略

文章目录 引言一、为什么选择阿里云CodeUp作为远程私有仓库&#xff1f;二、Maven配置阿里云CodeUp远程私有仓库的步骤准备工作配置Maven的settings.xml文件配置项目的pom.xml文件验证配置是否成功 三、使用阿里云CodeUp远程私有仓库的注意事项 引言 在软件开发的世界里&#…

软件工程(上)

目录 软件过程模型&#xff08;软件开发模型&#xff09; 瀑布模型 原型模型 V模型 构件组装模型 螺旋模型&#xff08;原型瀑布&#xff09; 基于构件的软件工程&#xff08;CBSE&#xff09; 快速应用开发模型&#xff08;RAD&#xff09; 统一过程&#xff08;UP&a…

Http Json参数到x-www-form-urlencoded参数的在线转换工具

Json参数到x-www-form-urlencoded参数的在线转换工具

C语言 printf 函数多种输出格式以及占位输出

一、输出格式 在C语言中&#xff0c;printf 函数提供了多种输出格式&#xff0c;用于控制不同类型数据的输出方式。 1.整数输出格式 %d&#xff1a;以十进制形式输出整数。 %o&#xff1a;以八进制形式输出整数&#xff08;无前导0&#xff09;。 %x 或 %X&#xff1a;以十六进…

CMD命令详细介绍 | 超详细版本!

文章目录 启动cmd命令用户启动使用管理员的账号启动 文件夹命令网络命令其他常用命令介绍常用快捷方式程序员相关命令 本文参考了博客园一篇帖子&#xff0c;ULR&#xff1a;cmd常用命令介绍(可收藏) - Mrwhite86 - 博客园 (cnblogs.com) CMD是Windows操作系统自带的命令行解释…

嵌入式C语言面试相关知识——内存管理(不定期更新)

嵌入式C语言面试相关知识——内存管理&#xff08;不定期更新&#xff09; 一、博客声明二、自问题目1、嵌入式系统的内存布局是怎么样的&#xff1f;2、动态内存分配在嵌入式系统中的使用有什么注意事项&#xff1f;3、什么是内存碎片&#xff0c;如何减少内存碎片&#xff1f…