首页 > 数据库 >SQLite库笔记:API函数编程

SQLite库笔记:API函数编程

时间:2024-08-04 11:25:42浏览次数:16  
标签:SQLite int 编程 ret char API sqlite3 pDb errmsg

本文主要介绍SQLite库的一些核心API函数,和实现数据库增删查改功能的C语言示例程序代码。

目录

1. API函数原型

1.1 sqlite3_open

1.2 sqlite3_close

1.3 sqlite3_free

1.4 sqlite3_errmsg

1.5 sqlite3_exec

1.6 sqlite3_get_table

1.7 sqlite3_free_table

2. 返回码定义

3. 示例程序

3.1 数据库表设计

3.2 代码

3.3 编译运行


1. API函数原型

SQLite库有两百多个API,下面列出几个核心的API。

1.1 sqlite3_open

函数声明    

int sqlite3_open(const char *filename, sqlite3 **ppDb);

描述  

打开数据库文件

参数

filename[输入]  

数据库文件名 (UTF-8)

ppDb[输出]  

 SQLite db句柄

返回值

0-成功,其它-失败

1.2 sqlite3_close

函数声明    

int sqlite3_close(sqlite3* pDb);

描述  

关闭数据库db句柄

参数

pDb[输入]

数据库db句柄

返回值

0-成功,其它-失败

1.3 sqlite3_free

函数声明    

void sqlite3_free(void* ptr);

描述  

释放指针数据

参数

Ptr[输入]

指针数据

返回值

1.4 sqlite3_errmsg

函数声明    

const char *sqlite3_errmsg(sqlite3* pDb);

描述  

获取具体的错误信息

参数

pDb[输入]

数据库db句柄

返回值

错误信息字符串

1.5 sqlite3_exec

函数声明    

int sqlite3_exec(sqlite3*db, const char *sql,

                        int (*callback)(void*,int,char**,char**), void *arg, char **errmsg);

描述  

运行SQL语句

参数

db[输入]

一个打开的数据库db句柄

Sql[输入]

要执行的SQL语句

callback [输入]

回调函数

arg[输入]

回调函数的第一个参数

errmsg[输出]

错误信息

返回值

0-成功,其它-失败

1.6 sqlite3_get_table

函数声明    

int sqlite3_get_table(sqlite3 *db, const char *zSql, char ***pazResult,

                                int *pnRow, int *pnColumn, char **pzErrmsg);

描述  

运行SQL查询语句

参数

db[输入]

一个打开的数据库db句柄

zSql[输入]

要执行的SQL语句

pazResult[输出]

查询的结果

pnRow[输出]

查询结果的行数

pnColumn[输出]

查询结果的列数

pzErrmsg[输出]

错误信息

返回值

0-成功,其它-失败

1.7 sqlite3_free_table

函数声明    

void sqlite3_free_table(char **result);

描述  

释放SQL查询结果指针

参数

result [输入]

查询的结果

返回值

2. 返回码定义

sqlite3.h中常遇到的返回码

含义

SQLITE_OK (0)

成功

SQLITE_ERROR (1)

通用返回码

SQLITE_INTERNAL (2)

内部故障

SQLITE_PERM (3)

无法提供新创建的数据库的请求访问模式

SQLITE_ABORT (4)

操作中断

SQLITE_BUSY (5)

由于其它数据库连接的并发活动,无法读写

SQLITE_LOCKED (6)

连接冲突,写操作失败

3. 示例程序

3.1 数据库表设计

元素

类型

说明

id

int

货物ID

name

char(16)

货物名称

supplier

char(16)

供应商

ymdhms

datetime

年-月-日 时:分:秒

unit

int

单价

num

int

数量

sum

int

总价

3.2 代码

下面的代码实现了数据库的基本功能操作,包括:

  • 创建数据库文件test.db
  • 创建数据库表purchase
  • 向数据库表中插入数据
  • 修改数据库表的数据
  • 删除数据库表中特定ID的数据
  • 查询数据库表中数据条目数量
  • 查询数据库表中所有数据
/*  This is a demo using the SQLite library API functions.
 *  More details about SQLite: https://www.sqlite.org/
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "sqlite3.h"

#define DEBUG_PRINTF(format, ...)   printf("<%s, %d> "format" ", __func__, __LINE__, ## __VA_ARGS__)
#define ARRAY_SIZE(_arr)		    (sizeof((_arr)) / sizeof((_arr)[0]))
#define PURCHASE_DB_FILE			"test.db"

typedef struct _purchase_para{
	int id;
	char name[16];
	char supplier[16];
	char ymdhms[24];
	int unit;
	int num;
	int sum;
}purchase_para;

int iDBInit(sqlite3 **ppDb)
{
	char *err = NULL;
	char sql[256] = {0};
	int ret;

	/* database init */
	ret = sqlite3_open(PURCHASE_DB_FILE, ppDb);
	if (ret != SQLITE_OK) {
		DEBUG_PRINTF("sqlite3_open ret:%d, msg:%s\n", ret, sqlite3_errmsg(*ppDb));
		sqlite3_close(*ppDb);
		return -1;
	}

	snprintf(sql, sizeof(sql), 
		"create table if not exists purchase \
			(id int, \
			name char(16), \
			supplier char(16), \
   			ymdhms datetime,\
			unit int, \
			num int, \
			sum int, \
   			primary key(id, ymdhms));"
		);
	ret = sqlite3_exec(*ppDb , sql , NULL , NULL , &err);
	if (ret != SQLITE_OK) {
		DEBUG_PRINTF("sqlite3_exec ret:%d, %s\n", ret, err);
		sqlite3_free(err);
	}

	return 0;
}

void vDBFree(sqlite3 *pDb)
{
	if (pDb != NULL) {
		sqlite3_close(pDb);
		pDb = NULL;
	}
}

/* insert data */
int iDBInsert(sqlite3 *pDb, purchase_para *pdata)
{
	char sql[256] = {0};
	char *errmsg = NULL;
	int ret;

	if (pDb == NULL || pdata == NULL) {
		return -1;
	}

	snprintf(sql, sizeof(sql), 
			"insert into purchase(id, name, supplier, ymdhms, unit, num, sum) \
			values(%d, '%s', '%s', '%s', %d, %d, %d);", 
			pdata->id, pdata->name, pdata->supplier, pdata->ymdhms, 
			pdata->unit, pdata->num, pdata->sum);

	ret = sqlite3_exec(pDb , sql , NULL , NULL , &errmsg);
	if (ret != SQLITE_OK) {
		DEBUG_PRINTF("sqlite3_exec ret:%d, %s\n", ret, errmsg);
		sqlite3_free(errmsg);
	}
	return ret;
}

/* modify data if id matches */
int iDBUpdateByID(sqlite3 *pDb, purchase_para *pdata)
{
	char sql[256] = {0};
	char *errmsg = NULL;
	int ret;

	if (pDb == NULL || pdata == NULL) {
		return -1;
	}

	snprintf(sql, sizeof(sql), 
		"update purchase set name = '%s', supplier = '%s', ymdhms = '%s', \
        unit = %d, num = %d, sum = %d where id == %d;",
		pdata->name, pdata->supplier, pdata->ymdhms, 
		pdata->unit, pdata->num, pdata->sum, pdata->id);

	ret = sqlite3_exec(pDb , sql , NULL , NULL , &errmsg);
	if (ret != SQLITE_OK) {
		DEBUG_PRINTF("sqlite3_exec ret:%d, %s\n", ret, errmsg);
		sqlite3_free(errmsg);
	}
	return ret;
}

/* delete data if id matches */
int iDBDelByID(sqlite3 *pDb, int id)
{
	int ret = 0;
	char sql[64] = {0};
	char *errmsg = NULL;
	
	if (pDb == NULL) {
		return -1;
	}

	snprintf(sql, sizeof(sql), 
		"delete from purchase where id == %d;vacuum;", id);
	
	ret = sqlite3_exec(pDb , sql , NULL , NULL , &errmsg);
	if (ret != SQLITE_OK) {
		DEBUG_PRINTF("<%s> sqlite3_exec ret:%d, %s\n", __func__, ret, errmsg);
		sqlite3_free(errmsg);
	}
	return ret;
}

/* query the number of database data items */
int iDBQueryCnt(sqlite3 *pDb, int *cnt)
{
	int ret = 0;
	int row = 0;
	int column = 0;
	char **result;
	char sql[64] = {0};
	char *errmsg = NULL;
	
	snprintf(sql, sizeof(sql), "select count(*) from purchase;");

	ret = sqlite3_get_table(pDb , sql , &result , &row , &column , &errmsg);
	if (ret != SQLITE_OK) {
		DEBUG_PRINTF("<%s> sqlite3_exec ret:%d, %s\n", __func__, ret, errmsg);
		sqlite3_free(errmsg);
	}
	else {
		*cnt = atoi(result[1]);
		DEBUG_PRINTF("select successfully, row:%d, col:%d, cnt:%d\n", row, column, *cnt);		
	}
	sqlite3_free_table(result);
	return ret;
}

/* query all data in the database */
int iDBQueryAll(sqlite3 *pDb)
{
	int ret = 0;
	int row = 0;
	int column = 0;
	int i, j;
	char **result;
	char sql[64] = {0};
	char *errmsg = NULL;
	
	snprintf(sql, sizeof(sql), "select * from purchase;");

	ret = sqlite3_get_table(pDb , sql , &result , &row , &column , &errmsg);
	if (ret != SQLITE_OK) {
		DEBUG_PRINTF("<%s> sqlite3_exec ret:%d, %s\n", __func__, ret, errmsg);
		sqlite3_free(errmsg);
	}
	else {
		DEBUG_PRINTF("select successfully, row:%d, col:%d, data:\n", row, column);
		for(i = 0; i <= row; i++)
		{
			for(j = 0; j < column; j++)
			{
				printf("%s, ", result[i * column + j]);
			}
			printf("\n");
		}	
	}
	sqlite3_free_table(result);
	return ret;
}

测试示例

static void vTestInsert(sqlite3 *pDb)
{
	int i;
	int errcnt = 0;
	struct tm *timeinfo = NULL;
	time_t time_now;
	purchase_para data[] = {
		/*{1, "pencil", "sunny", "2024-07-10 12:06:35", 2, 100, 200},*/
		{1, "pencil", "sunny",  "", 2,  100, 200},
		{2, "pen",    "sky",    "", 10, 100, 1000},
		{3, "eraser", "lily",   "", 1,  80,  80},
		{4, "ruler",   "sunny", "", 2,  200, 400},
	};

	time(&time_now);
	timeinfo = localtime(&time_now);

	for(i = 0; i < ARRAY_SIZE(data); i++)
	{
		timeinfo->tm_mon = (timeinfo->tm_mon - i) % 12;
		strftime(data[i].ymdhms, ARRAY_SIZE(data[i].ymdhms), "%Y-%m-%d %H:%M:%S", timeinfo);
		if (iDBInsert(pDb, &data[i]) != 0) {
			errcnt++;
		}
	}
	DEBUG_PRINTF("insert %s\n", (errcnt == 0) ? "succ" : "fail");
}

static void vTestModify(sqlite3 *pDb)
{
	int ret;
	struct tm *timeinfo = NULL;
	time_t time_now;
	purchase_para data = {3, "eraser", "lily", "", 2, 80, 160};

	/* change the ymdhms to the current date and time */
	time(&time_now);
	timeinfo = localtime(&time_now);
	strftime(data.ymdhms, ARRAY_SIZE(data.ymdhms), "%Y-%m-%d %H:%M:%S", timeinfo);

	/* update data */
	ret = iDBUpdateByID(pDb, &data);
	DEBUG_PRINTF("modify %s\n", (ret == 0) ? "succ" : "fail");
}

int main(int argc, char* argv[])
{
	sqlite3 *ptrDb = NULL;
	int cnt = 0;
	int ret;

	if (iDBInit(&ptrDb) != 0) {
		return -1;
	}

	/* Query the number of database data items  */
	iDBQueryCnt(ptrDb, &cnt);
	/* Query all data in the database */
	iDBQueryAll(ptrDb);

	/* Insert some data */
	vTestInsert(ptrDb);
	/* modify data if id=3 */
	vTestModify(ptrDb);
	iDBQueryAll(ptrDb);

	/* delete data if id=4 */
	ret = iDBDelByID(ptrDb, 4);
	DEBUG_PRINTF("delete data %s\n", (ret == 0) ? "succ" : "fail");

	iDBQueryAll(ptrDb);

	vDBFree(ptrDb);
    return 0;
}

3.3 编译运行

将SQLite库编译生成的include和lib文件夹拷贝到工程目录下,编译加上-lsqlite3链接参数。编译示例如下:

运行结果:

标签:SQLite,int,编程,ret,char,API,sqlite3,pDb,errmsg
From: https://blog.csdn.net/starlight_0/article/details/140879923

相关文章

  • 【花雕学编程】Arduino FOC 之机械臂三维位置跟踪
    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用ArduinoIDE(集成开发环境)来编写、......
  • 编程小白如何变成编程战士
    当然,让我们进一步细化和丰富这份职业发展升级指南,确保它覆盖了更多的维度和细节,帮助你全方位地提升自己,无论是技术、管理还是个人品牌建设方面。下面是更加详尽的升级版建议:###技术深度与广度扩展-**深入技术前沿**:关注最新的技术趋势,如量子计算、边缘计算或元宇宙开发,了解......
  • 谈一谈编程到底应该怎么学?-暨2023年 CSP-J2轮爆零总结
    谈一谈编程到底应该怎么学?-暨2023年CSP-J2轮爆零总结转自https://mp.weixin.qq.com/s/_Fi64pYrZ6tHfKaNDb3xAA今年的信息学奥赛复赛结果已经基本出来了,整个行业讨论最多的就是今年的爆0问题。据说一个省,总共1900多人参加J组复赛,有800个0分。其它各省也都是爆0很多。但是同......
  • 全面弄懂少儿编程与信息学奥赛-V1.0版
    全面弄懂少儿编程与信息学奥赛-V1.0版本次讲述话题都为作者自己学编程以及所在专业,行业,以及教学经验和实践来原创撰写,不保证100%正确,但是保证99%的相对正确,同样,我希望任何人去看待任何问题都理性思考,独立思考,自己去评判别人说的是否有道理,这个世界上任何事都没有绝对的对与错,但......
  • 从编程小白到编程大神:大学新生的最佳入门攻略
    大学生活即将开始,作为一名编程小白,你或许对编程世界充满了好奇和向往,但也有些许的忐忑。编程是一门充满挑战的学科,但也是一项能为你打开无数可能性的大门的技能。本文将为你提供一份详细的攻略,帮助你从零开始,逐步成长为一名编程大神。一、明确学习目标在开始编程之旅之前,明确......
  • 初级python代码编程学习----简单计算器代码学习 入门必看
    简单计算器的代码今天来点最简单的python代码。让有兴趣的网友可以快速尝试入门。 defadd(x,y):returnx+ydefsubtract(x,y):returnx-ydefmultiply(x,y):returnx*ydefdivide(x,y):ify==0:return"Error!Divisionb......
  • 深圳大学-电信院-C程序设计实验-指针编程
    实验目的一、了解并掌握使用指针进行编程的方法;二、了解并掌握指针作为函数参数时函数的编写与调用方法。实验要求本次实验不要求提交正式实验报告,但要求实验完成后,将程序及程序的运行结果依次拷贝到一个word文档中,统一形成一个.doc文档后提交至Blackboard。文档名可用......
  • Lua 脚本编程基础
    引言Lua是一种轻量级的脚本语言,用标准C编写,设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。由于其简洁和高效,Lua在游戏开发、嵌入式系统、网络编程等领域得到了广泛应用。Lua语言特点轻量级:Lua的解释器可以轻松嵌入到任何应用程序中。简洁:Lua......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(4) 3、5、9
    题单:2024“钉耙编程”中国大学生算法设计超级联赛(4)时间:07_2905多层血条思路就是模拟,上层和下层分开表示,如果dmg大于血条长度就全都置0,反之就要从上层开始置\('.'\)代码stringblood="ABCDE";stringstr[3];voidsolve(){cin>>n>>m>>hp>>dmg;str[0]......
  • 腾讯云AI代码助手评测:智能编程新时代,你准备好了吗?
    文章目录引言开发环境介绍腾讯云AI代码助手使用实例案例1案例2案例3获得的帮助与提升建议结语引言随着人工智能技术的不断发展,越来越多的开发者开始尝试利用AI工具来提高编程效率。腾讯云作为国内领先的云计算服务提供商,也推出了自己的AI生成代码插件。「腾讯云A......