news 2026/6/9 23:36:21

SQLite3常用API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQLite3常用API

数据库的打开和关闭

数据库的打开(sqlite3_open函数)

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

intsqlite3_open(constchar*filename,/* 数据库文件的文件名,如果为 ":memory:" 则表示创建内存中数据库 */sqlite3**ppDb/* 返回指向数据库连接句柄的指针 */);
  • 这个函数使用指定的数据库文件名(或:memory:)打开一个新的数据库连接,并且把连接句柄返回给调用者如果连接成功,将会返回SQLITE_OK编码(0),否则将会返回其他错误代码
  • 需要注意的是,SQLite 数据库文件不存在时将会自动创建。如果filename参数为NULL,该函数返回SQLITE_MISUSE(错用 SQLite 调用)错误。ppDb参数是一个二级指针,它将存储一个指向打开的数据库连接的指针,该指针需要在后续的 SQLite 操作中使用
  • 例如,以下是在 C 语言中打开一个 SQLite 数据库的示例代码:
#include<stdio.h>#include<sqlite3.h>intmain(){sqlite3*db;/*打开数据库*/intrc=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);return1;}return0;}
  • 在此示例中,打开名为 “test.db” 的 SQLite 数据库连接,并检查是否成功
  • 如果连接成功,则输出"已成功打开数据库"消息,然后关闭连接,否则将会输出错误信息。

数据库的关闭(sqlite3_close函数)

  • sqlite3_close()函数用于关闭指定数据库连接的函数。函数原型如下:
intsqlite3_close(sqlite3*);
  • 该函数接收一个被打开的数据库连接指针,如果成功关闭返回SQLITE_OK编码(0),否则返回其他错误代码
  • 在使用完SQLite数据库连接之后,应该释放它以避免资源泄漏和内存占用。调用sqlite3_close()函数将关闭数据库连接,并释放所有相关的资源,包括已编译的语句等。如果在关闭连接之前还有未完成的事务,则会自动回滚这些事务
  • 例如,以下是在 C 语言中关闭 SQLite 数据库连接的示例代码:
#include<sqlite3.h>intmain(){sqlite3*db;intrc=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));}return0;}
  • 在此示例中,在执行所需的 SQLite 操作之后,使用sqlite3_close()函数关闭数据库连接。如果没有出现错误,则输出 “Closed database successfully” 消息,否则将会输出错误信息

执行SQL语句(sqlite3_exec函数)

sqlite3_exec函数介绍

  • sqlite3_exec()函数用于在 SQLite 数据库连接上执行一条或多条 SQL 语句,并调用一个回调函数处理执行结果。该函数的原型如下:
intsqlite3_exec(sqlite3*,/* 执行 SQL 命令的数据库连接 */constchar*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>intmain(intargc,char*argv[]){sqlite3*db;char*zErrMsg=0;intrc;/*打开数据库*/rc=sqlite3_open("test.db",&db);if(rc){fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}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);return0;}
  • 上述代码中,首先调用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>intmain(intargc,char*argv[]){sqlite3*db;char*zErrMsg=0;intrc;/*打开数据库*/rc=sqlite3_open("test.db",&db);if(rc){fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}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);return0;}
  • 在上述代码中,需要先调用sqlite3_open()函数打开数据库连接。然后,使用INSERT INTO语句将一条记录插入到"COMPANY"表格中
  • 该记录包含三个字段,分别是"id"、“name"和"age”,对应的值分别为1、'张三’和32。最后,通过sqlite3_exec()函数执行SQL语句,并根据返回值判断操作是否成功
使用sqlite3_exec()函数查询数据
#include<sqlite3.h>#include<stdio.h>// 回调函数intcallback(void*data,intargc,char**argv,char**azColName){inti;printf("callback:\n");for(i=0;i<argc;i++){printf("%s = %s\n",azColName[i],argv[i]?argv[i]:"NULL");}printf("\n");return0;}intmain(){sqlite3*db;char*zErrMsg=0;// 存储错误消息的指针intrc;rc=sqlite3_open("test.db",&db);if(rc!=SQLITE_OK){fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}constchar*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);returnrc;}
  • 在此示例中,我们定义了一个回调函数callback(),该函数用于处理sqlite3_exec()执行结果。
    接下来,我们打开一个名为 “test.db” 的 SQLite 数据库连接,并执行 SELECT 命令
  • 最后,我们通过检查rczErrMsg的返回值,判断查询是否成功并处理执行结果
void *data的作用是什么?
  • void *data是sqlite3_exec()函数的第四个参数,它是一个用户定义的指针类型,提供了一个通用的方法来传递额外的数据给回调函数。sqlite3_exec()函数的高级用法
  • 示例代码:
#include<sqlite3.h>#include<stdio.h>// 回调函数intcallback(void*data,intargc,char**argv,char**azColName){inti;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");return0;}intmain(){sqlite3*db;char*zErrMsg=0;// 存储错误消息的指针intrc;rc=sqlite3_open("test.db",&db);if(rc!=SQLITE_OK){fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}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);returnrc;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 17:13:08

Labview 与阿特拉斯开放式通讯:网口读取扭矩值全解析

Labview与阿特拉斯开放式通讯 网口读取扭矩值 包括Labview程序、阿特拉斯调试软件、开放式通讯测试软件、开放式通讯协议、PM4000手册。在工业自动化和设备监测领域&#xff0c;准确读取扭矩值至关重要。今天咱们就来唠唠如何通过 Labview 与阿特拉斯开放式通讯&#xff0c;利用…

作者头像 李华
网站建设 2026/6/9 16:14:30

等级设定:企业应如何定义等级标准、本地策略与特殊路由优化路径

定义传输资源等级标准、部署本地化传输策略、实施特殊需求路由优化管理 摘要 为企业IT部门、信息化负责人及运维团队提供价值&#xff1a;通过可视化运行监控系统&#xff0c;结合等级设定的传输资源管理体系&#xff0c;支撑系统规划、标准化交付与平台化运维&#xff0c;实…

作者头像 李华
网站建设 2026/6/9 16:13:32

C语言fscanf用法详解:如何从文件读取格式化数据

$fscanf是C标准库中用于从文件流进行格式化输入的核心函数&#xff0c;它根据指定的格式字符串从文件中读取数据并存入对应变量。对于需要精确解析文本文件内容的开发者而言&#xff0c;掌握其用法能极大提升数据处理的效率和可靠性。本文将深入探讨其具体用法、关键细节和常见…

作者头像 李华
网站建设 2026/6/9 16:13:12

findwindowexa函数用法详解与常见问题解决指南

在Windows编程中&#xff0c;findwindowexa是一个关键但常被误解的API函数。它用于在复杂的窗口层次结构中精确定位子窗口&#xff0c;对于自动化测试、UI操作和外部程序控制等场景至关重要。理解其工作原理和正确用法&#xff0c;能有效避免许多常见的编程陷阱。 findwindowex…

作者头像 李华
网站建设 2026/6/9 16:10:36

CNN输出尺寸设计指南:从原理到实战,告别尺寸不匹配!

CNN输出尺寸设计指南&#xff1a;从原理到实战&#xff0c;告别尺寸不匹配&#xff01; 引言 在构建卷积神经网络&#xff08;CNN&#xff09;时&#xff0c;你是否曾为复杂的输出尺寸计算而头疼&#xff1f;是否在模型拼接时频繁遭遇“尺寸不匹配”的错误&#xff1f;输出尺…

作者头像 李华
网站建设 2026/6/9 17:28:19

深入浅出CNN感受野:从数学原理到实战避坑指南

深入浅出CNN感受野&#xff1a;从数学原理到实战避坑指南 引言 在卷积神经网络&#xff08;CNN&#xff09;的世界里&#xff0c;“感受野”是一个既基础又至关重要的概念。它决定了网络“看到”输入图像的视野范围&#xff0c;直接影响着特征提取的能力与模型性能。你是否曾…

作者头像 李华