基于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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nacos适配达梦数据库并制作镜像

背景&#xff1a;因项目需要信创&#xff0c;需将原本的mysql数据库&#xff0c;改成达梦数据库 一、部署达梦数据库 1.1 部署达梦数据库服务 可参考&#xff1a;Docker安装达梦数据库_达梦数据库docker镜像-CSDN博客 1.2 创建nacos数据库 create user SAFE_NACOS identifi…

放大电路总结

补充: 只有直流移动时才有Rbe动态等效电阻 从RsUs看进去,实际上不管接了什么东西都能够看成是一个Ri(输入电阻) Ri Ui/Ii Rb//Rbe Ui/Us Ri/(RiRs) Aus (Uo/Ui)*(Ui/Us) Au *Ri/(RiRs) 当前面是一个电压源的信号 我们就需要输入电阻更大 Ro--->输出电阻--->将…

VSCode+git的gitee仓库搭建

​ 在此之前你已经在gitee创建好了账号&#xff0c;并新建了一个仓库。 1. 安装 Visual Studio Code Visual Studio Code 是编辑 Markdown 和站点配置文件的基础&#xff0c;以下将其简称为 VSCode&#xff0c;你可以在它的 官方网站 下载到它。 如若不理解各个版本之间的区别…

【C++ —— 用一棵红黑树同时封装出map和set】

C —— 用一棵红黑树同时封装出map和set 总览RBTreeMyMapMySet 红黑树源代码红黑树模板参数的控制模板参数中仿函数的增加迭代器模拟1. 迭代器的定义和结构2. 迭代器的操作符重载 set模拟map模拟代码红黑树的代码set的代码map的代码 总览 RBTree enum Colour {RED,BLACK };//…

算法板子:Trie树——存储字符串、查找字符串的出现次数

#include <iostream> using namespace std;const int N 1e6 10;// Trie树是一个集合&#xff0c;可以存储字符串 // son二维数组中&#xff0c;每行代表一个节点&#xff0c;该行的每列都是它的儿子&#xff0c;最多26列代表一个节点最多26个儿子(题目中说了都是小写字…

photoshop学习笔记——选区3

从窗口面板可以打开历史记录面板&#xff0c;历史记录面板保存了所有的操作 可以点击历史记录中某一条&#xff0c;回到当时的操作状态&#xff0c;也可以通过编辑中的 还原、重做、切换到最终状态逐步调整或直接跳到最终状态 回退之后&#xff0c;如果有新的操作&#xff0c;历…

WordPress文章标题定制化前缀插件

引言 在当今互联网的海洋中&#xff0c;吸引读者眼球的第一步往往始于文章标题的设计。对于WordPress博主而言&#xff0c;如何让每篇文章的标题更加个性化和吸引人&#xff0c;成为了一项重要的任务。传统的自定义CSS方法虽然可行&#xff0c;但其繁琐的操作和有限的美学效果…

【高校科研前沿】浙江农林大学童再康教授等人在农林科学顶刊《CATENA》发文:长期覆盖作物可促进多养分循环和地下土壤碳封存

文章简介 论文名称&#xff1a;Long-term cover crops boost multi-nutrient cycling and subsurface soil carbon sequestration by alleviating microbial carbon limitation in a subtropical forest&#xff08;长期覆盖作物通过缓解亚热带森林中微生物的碳限制&#xff0c…

常见的jmeter面试题及答案

1、解释什么是JMeter? JMeter是一款Java开源工具&#xff0c; 用于性能负载测试。它旨在分析和衡量Web应用程序和各种服务的性能和负载功能行为。 2、说明JMeter的工作原理? JMeter就像一群将请求发送到目标服务器的用户-样。它收集来自目标服务器的响应以及其他统计数据&…

每日OJ_牛客_HJ91 走方格的方案数

目录 牛客HJ91 走方格的方案数 解析代码 牛客HJ91 走方格的方案数 走方格的方案数_牛客题霸_牛客网 解析代码 本题为求取路径总数的题目&#xff0c;一般可以通过递归求解&#xff0c;对于复杂的问题&#xff0c;可以通过动态规划求解。此题比较简单&#xff0c;也可以通过递…

Vue2和Vue3实战代码中的小差异(实时更新)

目录 前言1. 未使用自闭合标签2. 事件名连字符3. 换行符4. 弃用.sync 前言 以下文章实时更新&#xff0c;主打记录差异 1. 未使用自闭合标签 104:7 error Require self-closing on Vue.js custom components (<el-table-column>) vue/html-self-closing✖ 1 problem…

Logback 快速入门

一、简介 Java 开源日志框架&#xff0c;以继承改善 log4j 为目的而生&#xff0c;是 log4j 创始人 Ceki Glc 的开源产品。 它声称有极佳的性能&#xff0c;占用空间更小&#xff0c;且提供其他日志系统缺失但很有用的特性。 其一大特色是&#xff0c;在 logback-classic 中本…

大模型算法备案流程最详细说明【流程+附件】

文章目录 一、语料安全评估 二、黑盒测试 三、模型安全措施评估 四、性能评估 五、性能评估 六、安全性评估 七、可解释性评估 八、法律和合规性评估 九、应急管理措施 十、材料准备 十一、【线下流程】大模型备案线下详细步骤说明 十二、【线上流程】算法备案填报…

QT vs2019编译报错LNK2019无法解析的外部符号

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "public: __cdecl Dialog_Setting::Dialog_Setting(class QWidget *)" (??0Dialog_SettingQEAAPEAVQWidgetZ)&#xff0c;函数 "public: __cdecl QtWid…

工业现场实测,焦化厂导烟车与装煤车风机实现无人作业

一、项目背景 作为我国重要的能源行业之一&#xff0c;焦化行业在国民经济中扮演着重要角色&#xff0c;焦化工艺是高温、高压、有毒物质等因素共同作用下进行的&#xff0c;因此存在着安全隐患&#xff0c;并伴有环境污染&#xff0c;改善焦化工艺的安全和环保问题是当前亟待…

Golang | Leetcode Golang题解之第287题寻找重复数

题目&#xff1a; 题解&#xff1a; func findDuplicate(nums []int) int {slow, fast : 0, 0for slow, fast nums[slow], nums[nums[fast]]; slow ! fast; slow, fast nums[slow], nums[nums[fast]] { }slow 0for slow ! fast {slow nums[slow]fast nums[fast]}return s…

分布式搜索引擎ES-DSL搜索详解

1.DSL搜索-入门语法 建立索引&#xff1a; xxx(自定义名称) 自定义mapping: POST /shop/_mapping {"properties": {"id": {"type": "long"},"age": {"type": "integer"},"username": {&quo…

Springboot 多数据源事务

起因 在一个service方法上使用的事务,其中有方法是调用的多数据源orderDB 但是多数据源没有生效,而是使用的primaryDB 原因 spring 事务实现的方式 以 Transactional 注解为例 (也可以看 TransactionTemplate&#xff0c; 这个流程更简单一点)。 入口&#xff1a;ProxyTransa…

Java语言程序设计——篇九(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 内部类 概述内部类—内部类的分类成员内部类实战演练 局部内部类实战演练 匿名内部类实战演练 静态内部类实战演练 概述 内部类或嵌套类&#…

sheng的学习笔记-AI-公式-指数加权移动平均(EWMA)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 指数加权移动平均&#xff08;Exponential Weighted Moving Average&#xff09;&#xff0c;是一种常用的序列处理方式 看例子&#xff0c;首先这是一年365天的温度散点图&#xff0c;以天数为横坐标&#xff0…