当前位置: 首页 > news >正文

基于Orangepi全志H616开发嵌入式数据库——SQLite

目录

一、SQLite数据库

1.1 SQLite 的特点:

1.2 SQLite 的使用场景:

1.3 SQLite数据库与传统MySQL数据库的区别:

二、SQLite数据库安装

2.1 SQLite数据库安装方式一:

2.2 SQlite数据库安装方式二:

三、SQLite数据库的命令用法

3.1 创建/打开一个数据库:

3.3.1 创建/打开数据库方式一:

3.3.2 创建/打开数据库方式二:

3.2 创建一张表格:

3.3 插入一条记录:

3.4 查看数据库的记录:

3.5 删除一条记录:

3.6 删除一张表格:

3.7 更改一条记录:

3.8 增加一列:

四、SQLite数据库的编程操作

4.1 创建/打开数据库函数sqlite3_open()原型和头文件:

4.2 创建/打开数据库示例用法:

4.3 关闭数据库函数sqlite_close()原型和头文件:

4.4 关闭数据库示例用法:

4.5 获取与最后一次数据库操作错误代码函数sqlite3_errcode()原型和头文件:

4.6 获取与最后一次数据库操作错误代码示例用法:

4.7 SQLite数据库C接口(结果代码):

4.8 数据库打开&关闭&出错案例:

4.9 执行SQL语句函数sqlite3_exec()原型和头文件:

4.10 callback回调函数原型:

4.11 使用sqlite3_exec()函数执行SQL语句案例:

4. 12 C代码创建表和插入数据:

五、SQLite数据库的其他编程操作

5.1 创建CREATE表:

5.2 插入数据INSERT到创建的表中:

5.3 查询数据SELECT操作:

5.4 更改数据UPDATE操作:

5.5 删除数据DELETE操作:


一、SQLite数据库

  • SQLite 是一个流行的嵌入式关系数据库管理系统,它使用单一的磁盘文件(或内存中的数据库)来存储整个数据库。SQLite 是一种轻量级的数据库,特别适合用于移动设备、嵌入式系统以及需要较小数据库支持的应用程序。它不需要配置、服务器或网络,并且易于部署和管理。

1.1 SQLite 的特点:

  1. 轻量级SQLite 的代码库非常小,可以很容易地集成到应用程序中。

  2. 独立性SQLite 不需要外部服务器或数据库引擎,它直接读写磁盘上的数据库文件。

  3. 跨平台SQLite 支持多种操作系统,包括 Windows、Linux、macOS 等。

  4. ACID 兼容SQLite 支持事务处理,具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)的特性。

  5. 易于使用SQLite 提供了简单的 SQL 语句接口,易于学习和使用。

  6. 高效SQLite 的查询优化器会自动选择最有效的算法来执行 SQL 语句。

1.2 SQLite 的使用场景:

  • 移动应用:由于 SQLite的轻量级和跨平台特性,它非常适合用于移动应用程序中,如 Android 和 iOS 应用。

  • 桌面应用SQLite 也可以用于桌面应用程序中,特别是那些需要本地数据存储的应用。

  • 嵌入式系统:在资源受限的嵌入式系统中,SQLite 因其低资源消耗和易于集成而广受欢迎。

  • 测试和开发SQLite 因其简单性和轻量级,也常被用于数据库测试和开发阶段。

1.3 SQLite数据库与传统MySQL数据库的区别:

基于嵌入式的数据库主要有:SQLiteFirebirdBerkeley DBeXtremeDB

Firebird 是关系型数据库,功能强大,支持存储过程,SQL兼容等

SQLite 关系型数据库,体积小,支持ACID事务

Berkeley DB 并没有数据库服务器的概念,他的程序直接链接到应用程序中

eXtremeDB 是内存数据库,运行效率高

二、SQLite数据库安装

2.1 SQLite数据库安装方式一:

sudo apt-get -y install sqlite

安装成功后执行sqlite就可以进入sqlite数据库命令行,但是此时安装的版本是2.8.17,一般现在sqlite3使用的场景更多,所以我想升级成sqlite3版本的,运行sudo apt-get -y install sqlite3指令出现找不到这个版本,只能去官网上下载了,于是引入安装方式二:

2.2 SQlite数据库安装方式二:

https://www.sqlite.org/download.html			//sqlite数据库官方网址

下载好之后将下载的安装包上传到香橙派:

1. 把下载的文件sqlite-autoconf-3460000.tar.gz		//上传到开发板
2. tar xvf sqlite-autoconf-3460000.tar.gz 		//解压
3. cd sqlite-autoconf-3460000 					//进入文件夹
4. ./configure --prefix=/usr/local 				//配置安装路径在/usr/local
5.  make 										//编译,时间会比较久大约10分钟
6. sudo make install 							//安装
7. 安装成功后输入sqlite3连入数据库					//安装数据库的版本是:3.46.0
8. 输入.exit退出数据库

三、SQLite数据库的命令用法

  • SQLite 是一个无服务器、零配置、自给自足的嵌入式 SQL 数据库引擎。它的使用非常简单,适合于小型项目和嵌入式设备。

3.1 创建/打开一个数据库:

3.3.1 创建/打开数据库方式一:
1. sqlite3				//进入数据库
2. .open test.db		//打开/创建一个数据库
3. .quit				//退出
4. 数据库退出后在命令当前路径创建数据库test.db

3.3.2 创建/打开数据库方式二:
1. sqlite3 test.db		//在命令运行当前窗口创建数据库test.db
2. .databases 			//在数据库命令下,列出当前打开的数据库
3. .quit 				//退出

3.2 创建一张表格:

create table stu(id Integer,name char,score Integer); 	//在这里“int”应该写成“Integer”,且写在变量名的后方

打开刚刚创建的test.db数据库,并在其中添加一张名为stu的表格,表格有三个字段:整型的id和score,char型的name

.tables		//查看当前打开的表格

3.3 插入一条记录:

insert into stu values(1,'LiMing',99);					//插入一条完整的字段insert into stu(name,score) values('ZhangSan',59); 		//插入部分字段内容

上面指令分别将:一个名为LiMing的同学的ID,name, scoer插入到了stu表格将一个名为ZhangSan的同学的name, scoer部分插入到stu表格

3.4 查看数据库的记录:

select * from stu; 				//查询所有字段的结果select name,score from stu; 	//查询数据库中部分字段的内容

3.5 删除一条记录:

delete from stu where id = 3;

3.6 删除一张表格:

drop table stu2;

3.7 更改一条记录:

update stu set name = 'ShiYaHao' where id = 1;		//根据后面的ID修改前面的name,把ID为1的内容的name该成'ShiYaHao'
update stu set name = 'RaoYun' where id = 2;		//根据后面的ID修改前面的name,把ID为2的内容的name该成'RaoYun'

3.8 增加一列:

alter table stu add column sex char;					//给stu表格增加性别列update stu set sex = 'men' where name = 'ShiYaHao';		//给'ShiYaHao'添加性别
update stu set sex = 'women' where name = 'RaoYun';		//给'RaoYun'添加性别

四、SQLite数据库的编程操作

以下是重要的 C&C++ / SQLite 接口程序,可以满足您在 C/C++ 程序中使用 SQLite 数据库的需求。如果您需要了解更多细节,请查看 SQLite 官方文档。

4.1 创建/打开数据库函数sqlite3_open()原型和头文件:

#include <sqlite3.h>int sqlite3_open(const char *filename, sqlite3 **ppDb);int 				函数返回值,如果操作成功,返回SQLITE_OK(0)。如果出现错误。返回一个错误代码。常见的错误代码包括		   					 		   SQLITE_CANTOPEN(不能打开数据库文件)和SQLITE_MISUSE(错误的使用方式)等。char *filename		要打开或创建的数据库文件的路径。如果为NULL或者指定为":memory:",则在内存中创建一个临时数据库sqlite3 **ppDb		用于存储指向数据库连接对象的指针的地址。在函数成功调用后,这个指针将指向一个新的sqlite3对象,可以用于后续的数据库操作。/*函数说明:sqlite3_open是SQLite库中的一个函数,用于打开或创建一个SQLite数据库文件,并返回一个指向该数据库的连接对象。*/

4.2 创建/打开数据库示例用法:

#include <stdio.h>
#include <sqlite3.h>int main()
{sqlite3 *db;                                                                  //声明数据库变量//int sqlite3_open(const char *filename, sqlite3 **ppDb);int ret = sqlite3_open("test.db", &db);                                       //打开数据库  if(ret != SQLITE_OK){printf("打开数据库错误: %s\n", sqlite3_errmsg(db));                         //输出错误信息sqlite3_close(db);                                                         //关闭数据库return 1;}   printf("数据库打开成功\n");sqlite3_close(db);                                                           //关闭数据库return 0;
}

4.3 关闭数据库函数sqlite_close()原型和头文件:

#include <sqlite3.h>int sqlite3_close(sqlite3 *db);int 			函数返回值,如果操作成功,返回SQLITE_OK(0)。如果出现错误。返回一个错误代码。常见的错误代码包括		   					 		  SQLITE_CANTOPEN(不能打开数据库文件)和SQLITE_MISUSE(错误的使用方式)等。sqlite3 *db		指向要关闭的数据库连接对象的指针。/*函数说明:sqlite3_close是SQLite库中的函数之一,用于关闭之前通过sqlite3_open打开的数据库连接。*/

4.4 关闭数据库示例用法:

#include <stdio.h>      // 包含标准输入输出库头文件
#include <sqlite3.h>    // 包含SQLite数据库操作库头文件int main()
{int ret;sqlite3 *db;                                                                //声明数据库对象    //int sqlite3_open(const char *filename, sqlite3 **ppDb);ret = sqlite3_open("test.db", &db);                                         //打开数据库  if(ret != SQLITE_OK){printf("打开数据库错误:%s\n",sqlite3_errmsg(db));                        //输出错误信息return 1;}else{printf("数据库打开成功!\n");}ret = sqlite3_close(db);                                                    //关闭数据库if(ret != SQLITE_OK){printf("关闭数据库错误:%s\n",sqlite3_errmsg(db));                        //输出错误信息return 1;}else{printf("数据库关闭成功!\n");}return 0;
}

4.5 获取与最后一次数据库操作错误代码函数sqlite3_errcode()原型和头文件:

#include <sqlite3.h>int sqlite3_errcode(sqlite3 *db);int 			函数返回值,返回与最后一次数据库操作相关的错误代码。如果之前的操作没有错误,将返回SQLITE_OK(0)。sqlite3 *db		已经打开的SQLite数据库连接对象。/*函数说明:sqlite3_errcode是SQLite库中的一个函数,用于获取与最后一次数据库操作相关的错误代码。*/

4.6 获取与最后一次数据库操作错误代码示例用法:

#include <stdio.h>
#include <sqlite3.h>int main()
{int ret;sqlite3 *db;                                                                                                                        //打开数据库//int sqlite3_open(const char *filename, sqlite3 **ppDb);ret = sqlite3_open("test.db", &db);if(ret != SQLITE_OK){printf("打开数据库错误:%s\n",sqlite3_errmsg(db));return 1;}else{printf("打开数据库成功\n");}//获取与最后一次数据库操作相关的错误代码//int sqlite3_errcode(sqlite3 *db);printf("最后一次数据库操作相关的错误代码:%d\n",sqlite3_errcode(db));//关闭数据库连接sqlite3_close(db);              return 0;
}

4.7 SQLite数据库C接口(结果代码):

[官方C接口结果代码](https://sqlite.org/c3ref/c_abort.html)

许多 SQLite 函数从此处显示的集合中返回一个整数结果代码,以指示成功或失败。

#define SQLITE_OK           0   /* Successful result */
/* beginning-of-error-codes */错误代码
#define SQLITE_ERROR        1   /* Generic error */一般错误
#define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */内部逻辑错误
#define SQLITE_PERM         3   /* Access permission denied */访问权限被拒绝
#define SQLITE_ABORT        4   /* Callback routine requested an abort */回调例程请求中止
#define SQLITE_BUSY         5   /* The database file is locked */数据库文件被锁定
#define SQLITE_LOCKED       6   /* A table in the database is locked */数据库中的某个表被锁定
#define SQLITE_NOMEM        7   /* A malloc() failed */malloc() 失败
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */尝试写入只读数据库
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt() */操作由 sqlite3_interrupt() 终止
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */发生某种磁盘 I/O 错误
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */数据库磁盘映像格式错误
#define SQLITE_NOTFOUND    12   /* Unknown opcode in sqlite3_file_control() */sqlite3_file_control() 中的未知操作码
#define SQLITE_FULL        13   /* Insertion failed because database is full */由于数据库已满,插入失败
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */无法打开数据库文件
#define SQLITE_PROTOCOL    15   /* Database lock protocol error */数据库锁定协议错误
#define SQLITE_EMPTY       16   /* Internal use only */仅供内部使用
#define SQLITE_SCHEMA      17   /* The database schema changed */数据库架构已更改
#define SQLITE_TOOBIG      18   /* String or BLOB exceeds size limit */字符串或 BLOB 超出大小限制
#define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */由于违反约束而中止
#define SQLITE_MISMATCH    20   /* Data type mismatch */数据类型不匹配
#define SQLITE_MISUSE      21   /* Library used incorrectly */库使用不正确
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */使用主机不支持的 OF 功能
#define SQLITE_AUTH        23   /* Authorization denied */授权被拒绝
#define SQLITE_FORMAT      24   /* Not used */不曾用过
#define SQLITE_RANGE       25   /* 2nd parameter to sqlite3_bind out of range */sqlite3_bind 的第二个参数超出范围
#define SQLITE_NOTADB      26   /* File opened that is not a database file */打开的文件不是数据库文件
#define SQLITE_NOTICE      27   /* Notifications from sqlite3_log() */来自 sqlite3_log() 的通知
#define SQLITE_WARNING     28   /* Warnings from sqlite3_log() */来自 sqlite3_log() 的警告
#define SQLITE_ROW         100  /* sqlite3_step() has another row ready */sqlite3_step() 已准备好另一行
#define SQLITE_DONE        101  /* sqlite3_step() has finished executing */sqlite3_step() 已完成执行
/* end-of-error-codes */

4.8 数据库打开&关闭&出错案例:

#include <stdio.h>      // 包含标准输入输出库头文件
#include <sqlite3.h>    // 包含SQLite数据库操作库头文件int main(int argc, char **argv)
{int ret;sqlite3 *db;if(argc < 2){                                                                   //参数错误printf("参数错误,Usage:%s xxx.db\n", argv[0]);return 1;}//int sqlite3_open(const char *filename, sqlite3 **ppDb);ret = sqlite3_open(argv[1],&db);                                                //打开数据库if(ret == SQLITE_OK){                                                           //打开成功    printf("打开%s数据库成功\n",argv[1]);}else{printf("打开%s数据库失败:%s\n",argv[1],sqlite3_errmsg(db));                  //打开失败if(ret == SQLITE_CANTOPEN){                                                 //数据库文件不存在或无法打开printf("数据库文件不存在或无法打开\n");}return 1;}            //int sqlite3_close(sqlite3 *db);sqlite3_close(db);                                                              //关闭数据库  printf("关闭%s数据库成功\n",argv[1]);printf("done\n");return 0;
}

4.9 执行SQL语句函数sqlite3_exec()原型和头文件:

#include <sqlite3.h>int sqlite3_exec(  sqlite3* db,                /* SQLite 数据库连接对象 */  const char *sql,            /* 要执行的 SQL 语句 */  int (*callback)(void*,int,char**,char**), /* 回调函数,用于处理 SELECT 查询的每行结果(如果 SQL 不返回结果,则为 																								NULL)*/  void *arg,                  /* 传递给回调函数的参数 */  char **errmsg               /* 用于存放错误信息(如果有的话)的指针的地址 */  
);int 		函数返回值,如果操作成功,返回SQLITE_OK(0)。如果出现错误,返回一个错误代码。常见的错误代码包括SQLITE_ERROR						 (SQL语句执行错误)和SQLITE_MISUSE(错误的使用方式)等。sqlite3*			已经打开的SQLite数据库连接对象。
char *sql			要执行的SQL语句。可以包含一个或多个SQL命令。sqlite_callback		回调函数,用于处理每个结果行。该函数的签名应该为int callback(void*, int, char**, char**),其中参数					 		 分别是用户定义的数据指针(data)、列数、列的数据数组、列的名称数组。void *arg			data 作为其第一个参数,传递给回调函数的用户定义的数据指针。
char **errmsg		用于存储错误消息的指针。如果执行过程中发生错误,该指针将指向包含错误消息的字符串。/*	函数说明:sqlite3_exec是SQLite库中的一个函数,用于执行一个或多个SQL语句,并通过回调函数处理结果。	*/

4.10 callback回调函数原型:

SQLite中,sqlite3_exec函数通常与回调函数一起使用,以处理执行SQL语句后的结果。回调函数是在每个结果行上调用的用户定义的函数,用于处理查询结果。

int callback(void *arg, int column_size, char *column_value[], char *column_name[]);int 		函数返回值,回调函数应该返回一个整数值,通常为0。如果返回非零值,sqlite3_exec函数将停止执行并返回相同的值。void *arg				是sqlite3_exec函数的第四个参数
int column_size			数据库的字段数
char *column_value[]	包含每一列的值的数组。
char *column_name[]		包含每一列名称的数组(字段名字).

4.11 使用sqlite3_exec()函数执行SQL语句案例:

#include <stdio.h>                                                                  //包含stdio.h头文件
#include <sqlite3.h>                                                                //包含sqlite3.h头文件/* 回调函数 */
int callback(void *arg, int column_size, char *column_value[], char *column_name[]) 
{int i;printf("%s\n",(char *)arg);                                                         //打印SQL语句for(i=0; i<column_size; i++){           printf("%s = %s\n",column_name[i],column_value[i]);                           //打印每一列的名称和值}printf("========================\n");return 0;
}int main(int argc, char **argv)
{int ret;sqlite3 *db;                                                                   //声明数据库对象char *errMessage = NULL;                                                       //声明错误信息指针                                                            if(argc < 2){printf("请输入数据库文件名 xxx.db\n");return -1;}//int sqlite3_open(const char *filename, sqlite3 **ppDb);ret = sqlite3_open(argv[1], &db);                                               //打开数据库    if(ret != SQLITE_OK){                                                           //数据库打开失败printf("打开数据库失败:%s\n",sqlite3_errmsg(db));if(ret == SQLITE_CANTOPEN){                                                 //数据库文件不存在或无法打开printf("数据库文件不存在或无法打开\n");}   }else{                                                                          //数据库打开成功  printf("打开%s数据库成功\n", argv[1]);}//int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *arg, char **errmsg);sqlite3_exec(db, "select * from stu;", callback, "SQL的内容:", &errMessage);    //执行SQL语句//int sqlite3_close(sqlite3 *db);sqlite3_close(db);                                                              //关闭数据库printf("关闭数据库成功\n");return 0;
}

4. 12 C代码创建表和插入数据:

#include <stdio.h>
#include <sqlite3.h>int callback(void *arg, int column_size, char *column_value[], char *column_name[])      //回调函数
{int i;printf("%s\n",(char *)arg);                                                       //打印SQL语句 for(i=0; i<column_size; i++){printf("%s = %s\n",column_name[i],column_value[i]);                           //打印每一列的名称和值}printf("======================\n");return 0;
}int main(int argc, char **argv)
{int ret;                                                                          //声明返回值变量sqlite3 *db;                                                                      //声明数据库指针 char *errorMessage = NULL;                                                        //声明错误信息指针if(argc < 2){                                                                     //判断是否有参数printf("请输入数据库文件名 xxx.db\n");return -1;}ret = sqlite3_open(argv[1],&db);                                                   //打开数据库文件if(ret != SQLITE_OK){printf("无法打开数据库文件: %s\n",sqlite3_errmsg(db));if(ret == SQLITE_CANTOPEN){printf("请检查文件是否存在或是否有权限打开\n");}}else{printf("%s数据库打开成功\n",argv[1]);}//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)ret = sqlite3_exec(db, "create table Class(id Integer,name char,score Integer);", \callback, "SQL的内容:", &errorMessage);                       //执行SQL语句,创建表Classif(ret != SQLITE_OK){printf("SQL语句执行失败: %s\n",errorMessage);}else{printf("创建表Class成功\n");}ret = sqlite3_exec(db, "insert into Class values(1,'张三',90);", \callback, "SQL的内容:", &errorMessage);                        //执行SQL语句,插入数据if(ret != SQLITE_OK){printf("SQL语句执行失败: %s\n",errorMessage);}else{printf("插入数据成功\n");}ret = sqlite3_exec(db, "select * from Class;", \callback, "SQL的内容:", &errorMessage);                        //执行SQL语句,查询数据if(ret != SQLITE_OK){printf("SQL语句执行失败: %s\n",errorMessage);}else{printf("查询数据成功\n");}sqlite3_close(db);                                                                      //关闭数据库文件printf("数据库关闭成功\n");return 0;
}

五、SQLite数据库的其他编程操作

5.1 创建CREATE表:

#include <stdio.h>
#include <sqlite3.h>int callback(void *arg, int column_size, char *column_value[], char *column_name[])      //回调函数
{int i;printf("%s\n",(char *)arg);                                                       //打印SQL语句 for(i=0; i<column_size; i++){printf("%s = %s\n",column_name[i],column_value[i] ? column_value[i] : "NULL");       //打印每一列的值}printf("======================\n");return 0;
}int main()
{int ret;sqlite3 *db;                                                                    // 定义数据库对象char *sql;                                                                      // 定义sql语句char *errorMessage = NULL;                                                      // 定义错误信息 ret = sqlite3_open("test.db", &db);                                             // 打开数据库if(ret != SQLITE_OK){                                                           // 数据库打开失败printf("无法打开数据库: %s\n", sqlite3_errmsg(db));if(ret == SQLITE_CANTOPEN){printf("数据库文件不存在或无法打开\n");}}else{                                                                          // 数据库打开成功printf("打开数据库成功\n");}/* Create SQL statement */sql = "CREATE TABLE COMPANY("  \"ID INT PRIMARY KEY     NOT NULL," \"NAME           TEXT    NOT NULL," \"AGE            INT     NOT NULL," \"ADDRESS        CHAR(50)," \"SALARY         REAL );";//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)ret = sqlite3_exec(db, sql, callback, "SQL语句:", &errorMessage);              // 执行sql语句if(ret != SQLITE_OK){printf("无法创建表: %s\n", errorMessage);sqlite3_free(errorMessage);                                                 // 释放错误信息}else{printf("创建表成功\n");}sqlite3_close(db);                                                             // 关闭数据库    printf("关闭数据库成功\n");return 0;
}

5.2 插入数据INSERT到创建的表中:

下面的 C 代码段显示了如何在上面创建的 COMPANY 表中创建记录:

#include <stdio.h>
#include <sqlite3.h>int callback(void *arg, int column_size, char *column_value[], char *column_name[])      //回调函数
{int i;printf("%s\n",(char *)arg);                                                       //打印SQL语句 for(i=0; i<column_size; i++){printf("%s = %s\n",column_name[i],column_value[i] ? column_value[i] : "NULL");       //打印每一列的值}printf("======================\n");return 0;
}int main()
{int ret;sqlite3 *db;                                                                    // 声明数据库对象char *sql;                                                                      // 声明SQL语句char *errorMessage = NULL;                                                      // 声明错误信息ret = sqlite3_open("test.db", &db);                                             // 打开数据库   if(ret != SQLITE_OK){                                                           // 数据库打开失败printf("无法打开数据库: %s\n", sqlite3_errmsg(db));if(ret == SQLITE_CANTOPEN){printf("数据库文件不存在或无法打开\n");}}else{                                                                          // 数据库打开成功printf("数据库已打开\n");}// 执行SQL语句sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "   \"VALUES (1, 'Paul', 32, 'California', 20000.00 ); "    \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "    \"VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "        \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)"     \"VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );"        \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)"     \"VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)ret = sqlite3_exec(db, sql, callback, "SQL语句:", &errorMessage);                 // 执行SQL语句if(ret != SQLITE_OK){printf("SQL语句执行失败: %s\n", errorMessage);sqlite3_free(errorMessage);                                                  // 释放错误信息}else{printf("SQL语句执行成功\n");}sqlite3_close(db);                                                                // 关闭数据库printf("关闭数据库成功\n");return 0;
}

5.3 查询数据SELECT操作:

在我们开始讲解获取记录的实例之前,让我们先了解下回调函数的一些细节,这将在我们的实例使用到。这个回调提供了一个从 SELECT 语句获得结果的方式。它声明如下:

typedef int (*sqlite3_callback)(void*, 		/* sqlite3_exec()的第四个参数传递的内容 */int,		/* 列 */char**, 	/* 键值对的值 */char** 		/* 键值对的键 */
);

 面的回调在 sqlite_exec() 程序中作为第三个参数,那么 SQLite 将为 SQL 参数内执行的每个SELECT 语句中处理的每个记录调用这个回调函数。下面的 C 代码段显示了如何从前面创建的 COMPANY 表中获取并显示记录:

#include <stdio.h>
#include <sqlite3.h>int callback(void *arg, int column_size, char *column_value[], char *column_name[])      //回调函数
{int i;printf("%s\n",(char *)arg);                                                       //打印SQL语句 for(i=0; i<column_size; i++){printf("%s = %s\n",column_name[i],column_value[i] ? column_value[i] : "NULL");       //打印每一列的值}printf("======================\n");return 0;
}int main()
{char ret;sqlite3 *db;                                                                //声明数据库对象char *sql = "SELECT * from COMPANY";                                        //定义SQL语句char *errorMessage = NULL;                                                  //声明错误信息指针ret = sqlite3_open("test.db", &db);                                         //打开数据库    if(ret != SQLITE_OK){                                                       //判断是否打开成功printf("无法打开数据库: %s\n", sqlite3_errmsg(db));if(ret == SQLITE_CANTOPEN){printf("数据库文件不存在或无法打开\n");}}else{                                                                      //数据库打开成功printf("数据库已打开\n");}//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)ret = sqlite3_exec(db, sql, callback, "Callback function called", &errorMessage);   //执行SQL语句if(ret != SQLITE_OK){printf("SQL语句执行失败: %s\n", errorMessage);sqlite3_free(errorMessage);                                            //释放错误信息内存   }else{printf("SQL语句执行成功\n");}                          sqlite3_close(db);                                                          //关闭数据库 printf("数据库已关闭\n");return 0;
}

5.4 更改数据UPDATE操作:

下面的 C 代码段显示了如何使用 UPDATE 语句来更新任何记录,然后从 COMPANY 表中获取并显示更新的记录:

#include <stdio.h>
#include <sqlite3.h>int callback(void *arg, int column_size, char *column_value[], char *column_name[])      //回调函数
{int i;printf("%s\n",(char *)arg);                                                       //打印SQL语句 for(i=0; i<column_size; i++){printf("%s = %s\n",column_name[i],column_value[i] ? column_value[i] : "NULL");       //打印每一列的值}printf("======================\n");return 0;
}int main()
{int ret;sqlite3 *db;                                                                // 声明数据库对象char *sql;                                                                  // 声明SQL语句char *errorMessage = NULL;                                                  // 声明错误信息ret = sqlite3_open("test.db", &db);                                         // 打开数据库  if(ret != SQLITE_OK){                                                       // 数据库打开失败printf("无法打开数据库: %s\n", sqlite3_errmsg(db));if(ret == SQLITE_CANTOPEN){printf("数据库文件不存在或无法打开\n");}}else{                                                                       // 数据库打开成功  printf("打开数据库成功\n");}// 执行SQL语句sql =   "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \"SELECT * from COMPANY";                                            // 查询语句//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)ret = sqlite3_exec(db, sql, callback, "Callback function called", &errorMessage);   // 执行SQL语句if(ret != SQLITE_OK){printf("SQL语句执行失败: %s\n", errorMessage);sqlite3_free(errorMessage);                                            // 释放错误信息}else{printf("SQL语句执行成功\n");}sqlite3_close(db);                                                          // 关闭数据库printf("数据库关闭成功\n");    return 0;
}

5.5 删除数据DELETE操作:

下面的 C 代码段显示了如何使用 DELETE 语句删除任何记录,然后从 COMPANY 表中获取并显示剩余的记录:

#include <stdio.h>
#include <sqlite3.h>int callback(void *arg, int column_size, char *column_value[], char *column_name[])         // 回调函数
{int i;printf("%s\n", (char*)arg);                                                             // 打印回调函数参数    for(i=0; i<column_size; i++){printf("%s = %s\n",column_name[i], column_value[i] ? column_value[i] : "NULL");     // 打印每一列的值}printf("=======================\n");return 0;
}int main()
{int ret;sqlite3 *db;                                                                // 声明数据库对象char *sql;                                                                  // 声明SQL语句char *errorMessage = NULL;                                                  // 声明错误信息ret = sqlite3_open("test.db", &db);                                         // 打开数据库if(ret != SQLITE_OK){                                                       // 数据库打开失败printf("无法打开数据库: %s\n", sqlite3_errmsg(db));if(ret == SQLITE_CANTOPEN){printf("数据库文件不存在或无法打开\n");}}else{                                                                     // 数据库打开成功printf("数据库打开成功\n");}// 执行SQL语句sql =   "DELETE from COMPANY where ID=2; " \"SELECT * from COMPANY";     //sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)  ret = sqlite3_exec(db, sql, callback, "Callback function called", &errorMessage);   // 执行SQL语句if(ret != SQLITE_OK){printf("SQL语句执行失败: %s\n", errorMessage);sqlite3_free(errorMessage);                                            // 释放错误信息}else{printf("SQL语句执行成功\n");}    sqlite3_close(db);                                                         // 关闭数据库printf("数据库关闭成功\n");return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android Button设置点击监听器用switch case R.id.xxxx报错:Constant expression required
  • 2679. 矩阵中的和
  • DolphinDB Web 端权限管理:可视化操作指南
  • 钡铼网关实时数据互联,加速IEC104与MQTT云平台对接
  • C++STL简介(二)
  • 面试重点---快速排序
  • 模块与组件、模块化与组件化的理解
  • 可消费的媒体类型和可生成的媒体类型
  • 数据结构——单链表OJ题(上)
  • 玄机-第一章 应急响应-webshell查杀
  • 数据库之数据表基本操作
  • Prometheus监控ZooKeeper
  • Matlab arrayfun 与 bsxfun——提高编程效率的利器!
  • exuberant ctags 支持 typescript 解析
  • 自动驾驶-机器人-slam-定位面经和面试知识系列05之常考公式推导(02)
  • Android Studio:GIT提交项目到远程仓库
  • C++类中的特殊成员函数
  • Cumulo 的 ClojureScript 模块已经成型
  • Go 语言编译器的 //go: 详解
  • If…else
  • javascript数组去重/查找/插入/删除
  • JS数组方法汇总
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python进阶细节
  • SQLServer之索引简介
  • 京东美团研发面经
  • 普通函数和构造函数的区别
  • 写代码的正确姿势
  • 新版博客前端前瞻
  • 大数据全解:定义、价值及挑战
  • #1014 : Trie树
  • #Lua:Lua调用C++生成的DLL库
  • $().each和$.each的区别
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (07)Hive——窗口函数详解
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (js)循环条件满足时终止循环
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (solr系列:一)使用tomcat部署solr服务
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十七)Flink 容错机制
  • (四)opengl函数加载和错误处理
  • (一一四)第九章编程练习
  • ./configure,make,make install的作用
  • .Net 6.0 处理跨域的方式
  • .net core 的缓存方案
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 通过系统影子账户实现权限维持
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .Net7 环境安装配置
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .Net各种迷惑命名解释
  • @html.ActionLink的几种参数格式