Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >sqlite3的C语言使用(一)

sqlite3的C语言使用(一)

作者头像
phith0n
发布于 2020-10-15 14:03:16
发布于 2020-10-15 14:03:16
3.3K00
代码可运行
举报
运行总次数:0
代码可运行

    前一天我讲了如何在VC中连接sqlite的库,从今天开始就分几个专题详细学习一下sqlite的一些API。当然我也是才接触sqlite3,这些题也都是我的作业题,如果有什么错误大家可以联系我,共同进步。

0.准备工作

    在代码头上加上这样一个宏定义:typedef struct sqlite3 sqlite3; 以后我们就可以将sqlite3视为一个新数据类型,表示一个sqlite3数据库句柄。

    明确一下今天我们写的这个程序的目的(也就是我的作业题):

通讯录管理软件。

通讯者信息包括:姓名、性别、手机、Email、地址。

软件功能:添加、查询、删除、全部输出。 

1.sqlite3_open 打开或新建一个数据库文件

| 函数原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); |

|:----|

    filename:数据库文件地址

    ppDb:sqlite3数据库类型句柄。

    函数作用是打开一个数据库文件,如果文件不存在,则创建之。所以我们的程序开头就是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int _tmain(int argc, _TCHAR* argv[])
{
	bool flag = true;
	sqlite3 * db;
	char szErr[256];
	char * pErr;
	int n;
	int rc = sqlite3_open("addresslist.db",&db);
	if (rc != SQLITE_OK)
	{
		printf("打开数据库出错\n");
		return 0;
	}

2.sqlite3_exec 执行sql语句。(一般用来执行不用返回值的sql语句,如create table、update等)

| 函数原型 int sqlite3_exec( sqlite3 *, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */ ); |

|:----|

    第一个参数是sqlite3数据库句柄,和sqlite3_open函数第2个参数一样。

    sql:执行的sql语句。

    第三个参数是个回调函数,在执行本函数后会执行回调函数,不用则填NULL。

    第四个参数是传给回调函数的参数,不用则填NULL。

    errmsg:出错信息,不用则填NULL。

    这个函数可以执行一些非查询类的sql语句,很方便。我们在主函数里用sqlite3_exec来创建一个表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	const char * sql = "CREATE TABLE IF NOT EXISTS addlist(  \
		per_id INTEGER PRIMARY KEY,  \
		per_name VARCHAR(16) NOT NULL,  \
		per_sex VARCHAR(2),  \
		per_number VARCHAR(20),  \
		per_email VARCHAR(256),  \
		per_address varchar(256));";
	rc = sqlite3_exec(db,sql,NULL,NULL,&pErr);
	if (rc != SQLITE_OK)
	{
		printf("创建表失败\n");
		return 0;
	}

    sql语句的意思大家应该都知道,IF NOT EXIST如果表addlist不存在则创建它,当我们第二次运行时执行这个语句也不会再创建表了。

3.接下来就可以等待用户的输入了,我们可以给用户一些选择,比如选1表示要添加联系人,选2表示删除联系人,选3表示查询联系人。这个就一个swich语句完了,我就不发代码了。

    再开始写函数,首先是添加联系人的函数AddPerson

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void AddPerson(sqlite3 * db)
{
	while (getchar() != '\n') ;
	char szName[16],szSex[8],szNum[32],szEmail[256],szAddress[256];
	printf("输入姓名(回车结束):");
	gets(szName);
	printf("输入性别(回车结束):");
	gets(szSex);
	printf("输入电话号码(回车结束):");
	gets(szNum);
	printf("输入e-mail(回车结束):");
	gets(szEmail);
	printf("输入地址(回车结束):");
	gets(szAddress);
	char sql[512];
	sprintf(sql,"INSERT INTO addlist VALUES(null,'%s','%s','%s','%s','%s');",
		szName,szSex,szNum,szEmail,szAddress);
	int rc = sqlite3_exec(db,sql,NULL,NULL,NULL);
	if (rc != SQLITE_OK)
	{
		printf("出错\n");
	}
	return ;
}

    没有用新的API,一个sqlite3_exec就解决了问题。

4.sqlite3_prepare 把一条SQL语句编译成字节码留给后面的执行函数(并不执行)

| 函数原型 int sqlite3_prepare( sqlite3 *db, /* Database handle */ const char *zSql, /* SQL statement, UTF-8 encoded */ int nByte, /* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ ); |

|:----|

    db:数据库句柄

    zSql:sql语句

    nByte:如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。

    pzTail:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符

    ppStmt:能够使用sqlite3_step()执行的编译好的准备语句的句柄,如果错误发生,它被置为NULL,如假如输入的文本不包括sql语句。调用过程必须负责在编译好的sql语句完成使用后使用sqlite3_finalize()删除它。

    我们这个函数将sql语句编译成二进制字节码,以便后面的函数使用,编译好的东西就是stmt(第五个参数)。别问我为什么,我也不知道,但要执行sql来查询就要编译。于是我们查询函数SelectPerson可以这么写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void SelectPerson(sqlite3 * db)
{
	char sql[256];
	int per_num;
	sqlite3_stmt * stmt;
	printf("输入要查询的联系人编号:\n");
	scanf("%d",&per_num);
	sprintf(sql,"select * from addlist where per_id='%d'",per_num);
	sqlite3_prepare(db,sql,-1,&stmt,NULL);

5.sqlite3_step 执行编译好的sql语句,获得结果的一行

| 函数原型 int sqlite3_step(sqlite3_stmt*); |

|:----|

    stmt:就是刚才执行sqlite3_prepare后得到的sql语句句柄。

    这个函数很简单,执行sql语句,得到返回结果的一行。当然这个得到不是说从返回值得到,而是一个抽象的得到,要真正得到具体数据,还得利用其它函数。

    因为是得到返回值的一行,所以说要用循环语句来得到所有行。当然如果只有一行就不用了。我们这里查询某个人的信息,结果应该只有一行,所以执行一次step就行。

    这是SelectPerson函数剩下的部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	if(sqlite3_step(stmt) == SQLITE_ROW)
	{
		printf("编号:%d 姓名:%s 性别:%s 电话:%s Email:%s 地址:%s\n",
			sqlite3_column_int(stmt,0),sqlite3_column_text(stmt,1),sqlite3_column_text(stmt,2),
			sqlite3_column_text(stmt,3),sqlite3_column_text(stmt,4),sqlite3_column_text(stmt,5));
	}
	else
	{
		printf("输入错误\n");
	}

	sqlite3_finalize(stmt);
	return;
}

6.如果要查询全部人的数据,sqlite3_step函数就要用while语句来循环读取了,我直接给代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void AllSelect(sqlite3 * db)
{
	sqlite3_stmt * stmt;
	sqlite3_prepare(db,"select * from addlist",-1,&stmt,NULL);
	while(sqlite3_step(stmt) == SQLITE_ROW)
	{
		printf("编号:%d 姓名:%s 性别:%s 电话:%s Email:%s 地址:%s\n",
			sqlite3_column_int(stmt,0),sqlite3_column_text(stmt,1),sqlite3_column_text(stmt,2),
			sqlite3_column_text(stmt,3),sqlite3_column_text(stmt,4),sqlite3_column_text(stmt,5));
	}
	sqlite3_finalize(stmt);
	return ;
}

7.sqlite3_finalize 销毁sql语句句柄。这个函数很简单就不给原型了,记住创建了以后一定要销毁就行。

8.到现在,我们已经完成了3个任务了,添加联系人、查询联系人、列出所有联系人,最后再写一个删除联系人的函数就完成任务了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void DelPerson(sqlite3 * db)
{
	int n;
	char sql[256];
	printf("输入要删除的联系人编号:");
	scanf("%d",&n);
	sprintf(sql,"delete from addlist where per_id=%d",n);
	int rc = sqlite3_exec(db,sql,NULL,NULL,NULL);

	if(SQLITE_OK == rc)
	{
		printf("执行成功\n");
	}
	else
	{
		printf("删除失败\n");
	}
	return ;
}

    一个sqlite3_exec函数解决问题。

9.总结

    这个题目写完了,我也介绍了一些常用的sqlite3的API,并没有想象中那么复杂。这是运行的截图,代码我不发了,如果想要可以联系我。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQLite3 Cpp基本使用
文章目录 SQLite3 C++ #0 GitHub #1 环境 #2 安装sqlite3 #3 使用 #3.1 基本SQL语句 #3.2 sqlite3 API #3.3 Code SQLite3 C++ 0 GitHub example代码 SQLite3 C++ Demo Github 1 环境 macOS C++14 2 安装sqlite3 git clone https://github.com/sqlite/sqlite.git cd sqlite && mkdir bld && cd bld
Autooooooo
2021/12/07
1.3K0
SQLite3 Cpp基本使用
sqlite3的C语言使用(三)
估计这是sqlite系列最后一篇,sqlite的基本功能这一篇写完了就应该差不多了,不过还有更多高级功能大家可以自己去发现。上一篇
phith0n
2020/10/15
1.6K0
Sqlite 接口封装(c++)
Freedom123
2024/03/29
2880
【SQLite】C++链接SQLite读数据乱码问题(非中文)
前言: 使用C++调用SQLite数据库进行数据读取,调用sqlite3_prepare_v2进行语句合法检查后,使用sqlite3_column_count获取列数,然后调用sqlite3_step进行多次读取,使用sqlite3_column_text获取具体数据。 具体问题: sqlite3_column_text的返回值为 const unsigned char*,于是我用const unsigned char*存,具体代码如下: //如果返回SQLITE_ROW则,进行多次执行 for
半生瓜的blog
2023/05/13
6890
iOS开发之SQLite--C语言接口规范(四) —— Result Values From A Query
  数据库的在上一篇博客中《SQLite之C语言接口规范(三)——Binding Values To Prepared Statements》用到了如何从查询结果中取出结果值。今天的博客就详细的介绍一下sqlite3_column_*()的方法。在SQLite数据库C语言接口中,从查询结果中取出不同类型的值需要不同的接口函数。   一. sqlite3_column_*()介绍     1.下图是sqlite3_column_*()所包含的方法,由下图容易的看出取出不同类型的值需要不同的接口函数。可以取出的
lizelu
2018/01/11
9500
iOS开发之SQLite--C语言接口规范(四) —— Result Values From A Query
SQLite3使用笔记(2)——插入
如同上一篇文章SQLite3使用笔记(1)——查询所述,使用SQLite进行查询操作同样有两种方式。对于比较简单的表格插入,使用sqlite3_exec()接口就可以了:
charlee44
2022/05/23
6800
sqlite3的C语言使用(二)
前一天我列举了一些SQLite3库带的API,是SQLite的初级用法,今天我只讲一个API,但是用法会比前一次更好一点,便利一点。
phith0n
2020/10/15
1.6K0
Sqlite 读写blob数据(c++)
参考:https://www.cnblogs.com/wengzilin/archive/2012/03/28/2420796.html
Freedom123
2024/03/29
3020
C++操作sqlite3数据库示例代码
一个简单的使用sqlite3数据库的电话薄,很简单适合初学者看看,而且里面并没有很多容错处理很容易看懂的。
大师级码师
2021/09/19
1.2K0
玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数
SQLite是一个跨平台的轻量级数据库,支持C/C++开发,可用于嵌入式中,关于C/C++使用SQLite的简单实例,之前这篇文章,已经介绍过一种简单的使用方式。本篇来介绍另一种更加高效的调用方式。
xxpcb
2022/12/29
1.8K0
iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements
  在前面的博客中已经介绍了如何连接SQLite数据库,并且简单的查询和遍历结果集。在前面用到了sqlite3_stmt *stmt,也就是预编译后的SQL语句。在本篇博客中会了解一下sqlite3_stmt,然后了解一下变量的绑定。变量绑定,简单的说就是往预编译后的SQL语句中传入相应的值。   一. sqlite3_stmt 的生命周期   这个对象的实例代表着一个被编译成二进制的SQL语句。每个SQL语句都必须经过预编译转换成sqlite3_stmt才能被执行。在iOS开发中,Application或
lizelu
2018/01/11
1.3K0
iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements
iOS使用sqlite可以实现简单的收藏夹功能
在这个类里首先导入一个头文件和你建好的model类 (实现收藏本质是存model类)
用户7108768
2021/09/22
2900
学习SQLite之路(五) C/C++ SQLite开发实例
  介绍一种乌班图中使用sqlite的用法,非常简单,下面的例子是在乌班图12.04中实现的: 1,先安装两个东西: sudo apt-get install sqlite sqlite3 sudo apt-get install libsqlite3-dev  // 不然可能会报 没有头文件 sqlite3.h 2,C/C++接口:一般用到下面这三个,详情请参考sqlite官方文档。 (1)sqlite3_open(const char *filename, sqlite3 **ppDb):     打开
xcywt
2018/01/11
1.9K0
学习SQLite之路(五) C/C++ SQLite开发实例
【SQLite】C++链接SQLite数据库
C++链接SQLite数据库 相关参考: C++操作SQLITE获得查询结果集的几种方法总结 sqlite3: sqlite3_step 函数 SQLite3数据库API手册 好像还参考了一位老哥的文章,但是我记不清了,也有可能是我记错了。 为了更便于使用,我将它封装成了一个类。 common.h #ifndef COMMON_H__ #define COMMON_H__ #include <iostream> #include <unistd.h> #include <sqlite3.h> #in
半生瓜的blog
2023/05/13
9680
ios在SQLite3基本操作
首先是设置项目文件。在项目中加入iPhone版的sqlite3的数据库的开发包。在项目下的Frameworks点击右键。然后选择libsqlite3.0.dylib文件。
全栈程序员站长
2022/07/05
7740
【IOS开发基础系列】数据持久化专题
iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data。
江中散人_Jun
2023/10/16
4040
【IOS开发基础系列】数据持久化专题
SQLite3使用笔记(1)——查询
SQLite是一个嵌入式SQL数据库引擎。与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程。SQLite 直接读写普通磁盘文件。具有多个表、索引、触发器和视图的完整SQL数据库包含在单个磁盘文件中。
charlee44
2022/05/23
1.5K0
Sqlite3详细解读
"代码下载:SQLite3_2013_0402详细版.zip" http://vdisk.weibo.com/s/Gb9Qi
py3study
2020/01/07
3.9K0
C/C++ 通过SQLiteSDK增删改查
SQLite,作为一款嵌入式关系型数据库管理系统,一直以其轻量级、零配置以及跨平台等特性而备受青睐。不同于传统的数据库系统,SQLite是一个库,直接与应用程序一同编译和链接,无需单独的数据库服务器进程,实现了数据库的零配置管理。这种设计理念使得SQLite成为许多嵌入式系统、移动应用和小型项目中的首选数据库引擎。
王瑞MVP
2023/11/26
4750
C/C++ 通过SQLiteSDK增删改查
C++ 通过SQLite实现命令行工具
本文介绍了一个基于 C++、SQLite 和 Boost 库的简单交互式数据库操作 Shell。该 Shell 允许用户通过命令行输入执行各种数据库操作,包括添加、删除主机信息,设置主机到特定主机组,以及显示主机和主机组列表。通过调用 SQLite3 库实现数据库连接和操作,以及使用 Boost 库进行字符串解析和格式化。该交互式 Shell 提供了一些基本的命令,使用户能够方便地管理主机信息和组织结构。代码结构清晰,易于理解,可根据需要扩展和定制功能。
王瑞MVP
2023/11/26
1860
C++ 通过SQLite实现命令行工具
相关推荐
SQLite3 Cpp基本使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验