news 2026/2/12 5:27:09

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/2/9 10:08:54

消防科普互动设备|消防装备和器材体验系统

在新时代消防安全教育不断深化的大背景下&#xff0c;单一的文字宣传与静态展示已难以满足公众对消防知识的深入理解与学习需求。为推动消防科普方式的转型升级&#xff0c;提高全民的防火应急意识与自我保护能力&#xff0c;消防装备和器材体验系统应运而生。该系统以实物展示…

作者头像 李华
网站建设 2026/2/5 16:39:10

消防数字展厅智能升级|AR消防巡检员体验系统

随着智能化、可视化技术的发展&#xff0c;传统的消防安全宣传与隐患排查方式正在经历深刻变革。AR消防巡检员体验系统应运而生&#xff0c;将增强现实&#xff08;AR&#xff09;技术与三维建模深度融合&#xff0c;通过平板设备识别场景壁画图像&#xff0c;引导体验者进入不…

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

人形机器人足球迈向2050目标:技术挑战与联盟变革

将人形足球推向新高度&#xff1a;专访RoboCup理事亚历山德拉罗西 RoboCup的核心目标是通过其各类联盟提供的挑战&#xff0c;促进和推进机器人技术与人工智能研究。足球比赛的终极目标是&#xff0c;到2050年&#xff0c;一支完全自主的人形机器人队伍能够击败最近一届国际足联…

作者头像 李华
网站建设 2026/2/7 10:36:06

需求分级:企业如何落实需求分类、运行标准与系统优先级分配

分类传输需求等级、执行传输资源运行标准、落实系统资源优先级分配 摘要 本文为企业IT部门、信息化负责人及运维团队提供可落地的需求分级方法论&#xff0c;通过建立传输需求分类规则、传输资源运行标准与系统资源优先级调度体系&#xff0c;支撑ICT系统规划、标准化交付与平…

作者头像 李华
网站建设 2026/2/4 11:15:05

内测招募|元空AI+OpenClaw(Clawdbot)办公智能体内测招募

能真・帮你搬砖的办公AI 来了~ 元空 AIOpenClaw (Clawdbot) 办公智能体正在限时内测招募中&#xff01; &#x1f4bb; 它能帮你解决哪些痛点&#xff1f; 元空AI办公智能体平台——Al做表、AIExcel、AIPPT、ChatDB、数据看板打造真正替你“干活”的 AI 个人助理&#xff0c;…

作者头像 李华
网站建设 2026/2/9 8:00:12

RAG-项目实战一(GraphRAG优化)

一.GraphRAG与传统RAG的区别 特性传统 RAGGraphRAG检索核心语义相似度&#xff08;向量距离&#xff09;语义 拓扑关系&#xff08;点线网&#xff09;理解深度只能找到“长得像”的片段能通过“多跳”发现隐含联系信息组织孤立的文档块&#xff08;Chunks&#xff09;结构化…

作者头像 李华