目录
一、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 的特点:
-
轻量级:SQLite 的代码库非常小,可以很容易地集成到应用程序中。
-
独立性:SQLite 不需要外部服务器或数据库引擎,它直接读写磁盘上的数据库文件。
-
跨平台:SQLite 支持多种操作系统,包括 Windows、Linux、macOS 等。
-
ACID 兼容:SQLite 支持事务处理,具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)的特性。
-
易于使用:SQLite 提供了简单的 SQL 语句接口,易于学习和使用。
-
高效:SQLite 的查询优化器会自动选择最有效的算法来执行 SQL 语句。
1.2 SQLite 的使用场景:
-
移动应用:由于 SQLite的轻量级和跨平台特性,它非常适合用于移动应用程序中,如 Android 和 iOS 应用。
-
桌面应用:SQLite 也可以用于桌面应用程序中,特别是那些需要本地数据存储的应用。
-
嵌入式系统:在资源受限的嵌入式系统中,SQLite 因其低资源消耗和易于集成而广受欢迎。
-
测试和开发:SQLite 因其简单性和轻量级,也常被用于数据库测试和开发阶段。
1.3 SQLite数据库与传统MySQL数据库的区别:
基于嵌入式的数据库主要有:SQLite,Firebird,Berkeley DB,eXtremeDB
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;
}