首页 > 数据库 >【SQLite3】常用API

【SQLite3】常用API

时间:2024-07-09 21:29:47浏览次数:18  
标签:常用 函数 int 数据库 db sqlite3 API rc SQLite3

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;
}

标签:常用,函数,int,数据库,db,sqlite3,API,rc,SQLite3
From: https://blog.csdn.net/2201_75563094/article/details/140250938

相关文章

  • 常用的排序算法(C语言)
    1、冒泡排序(BubbleSort)冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮......
  • 常用的设计模式
    常用设计模式1.单例模式立即加载实例化:饿汉式单例模式在类装载到JVM时就完成了实例化,也就是说,当类被加载到JVM时,单例对象就已经被创建出来了。这种方式也被称为“饱汉模式”或“静态常量方式”。线程安全:由于饿汉式单例模式在类加载时就完成了实例化,并且这个实例是静态的,......
  • 【Python_GUI】tkinter常用组件——文本类组件
    文本时窗口中必不可少的一部分,tkinter模块中,有3种常用的文本类组件,通过这3种组件,可以在窗口中显示以及输入单行文本、多行文本、图片等。Label标签组件Label组件的基本使用Label组件是窗口中比较常用的组件,通常用于添加文字或图片,还可以定义Label组件中文字和图片的排列方式......
  • Linux常用命令
    1.1ls语法:ls[选项][⽬录或⽂件]功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。-a列出⽬录下的所有⽂件,包括以.开头的隐含⽂件。-d将⽬录象⽂件⼀样显⽰,⽽不是显⽰其下的⽂件。如:ls‒d指定⽬录-k以k字节的形式表......
  • 使用Python Flask快速构建一个api server
    使用flask快速构建一个apiserver代码如下:fromflaskimportFlask,jsonify,requestapp=Flask(__name__)#定义一个路由,当访问根路径时返回欢迎信息@app.route('/')defhome():return'Hello,thisisasimpleAPI!'#定义一个路由,接受GET请求并返回JSON响......
  • APICloud+ cosClient快速构建APP
    APICloud简介APICloud是一个移动低代码开发平台,对于不同的需求场景提供了不同的功能模块,并快速构建企业级应用。cosClient模块简介cosClient是腾讯云对象存储(COS)针对APICloud平台桥接原生SDK封装的模块,可以使用cosClient快速接入并使用COS的功能,目前支持Android、iOS。在APIC......
  • 深入解析:api-ms-win-net-isolation-l1-1-0.dll的角色与丢失修复指南
    api-ms-win-net-isolation-l1-1-0.dll是一个Windows操作系统中的动态链接库(DLL)文件,它与网络隔离功能相关,属于WindowsAppContainer和WindowsSandbox功能的一部分。这个DLL文件负责处理网络请求的隔离,确保应用程序在AppContainer或Sandbox环境中只能访问授权的网络资源,这对于增......
  • [Java SE] Java-文件系统-常用文件路径的获取方法
    1获取相对路径/***获取相对路径【推荐】*使用Java提供的Path类和Paths类来获取相对路径。*例如,假设有两个路径a和b,我们可以使用Path类的relativize()方法来获取相对路径,该方法返回一个相对路径的Path对象。*/@TestpublicvoidgetRelativePathTest1(){ Pathpath......
  • Core WebAPI 中 Program.cs和Startup.cs认识 (高频考点)
    1.Program.cs认识publicclassProgram{publicstaticvoidMain(string[]args){//Build方法构建出一个web应用程序,然后去运行CreateWebHostBuilder(args)//调用下面的方法,返回一个IWebHostBuilder对象.Build()//用......
  • C++OCR API减轻人们文字录入的负担
    曾几何时,许多大企业会设立文字录入专员的岗位。相信有不少人第一份实习工作就是录入资料,文档、发票、证件等形形色色的文件堆积如山,日积月累的敲击键盘,一张一张的录入电脑系统。这种工作是枯燥的,可以练就文字录入的速度,但是就现在的科技发展的形势来看,录入的工作还是交给OCR来......