专业编程基础技术教程

网站首页 > 基础教程 正文

如何用C语言操作sqlite3,一文搞懂

ccvgpt 2025-02-27 14:28:25 基础教程 2 ℃

sqlite3编程接口非常多,对于初学者来说,我们暂时只需要掌握常用的几个函数,其他函数自然就知道如何使用了。


如何用C语言操作sqlite3,一文搞懂


数据库

本篇假设数据库为my.db,有数据表student。

no name score 4 一口Linux 89.0

创建表格语句如下:

CREATE?TABLE??IF?NOT?EXISTS?student?(no?integer?primary?key,?name?text,?score?real);

常用函数

sqlite3_open

int???sqlite3_open(char??*path,???sqlite3?**db);
功能:
????打开sqlite数据库
参数:
?path:?数据库文件路径
?db:?指向sqlite句柄的指针,后面对数据库所有的操作都要依赖这个句柄
返回值:
?成功返回0,失败返回错误码(非零值)

sqlite3_close

int???sqlite3_close(sqlite3?*db);
功能:
?关闭sqlite数据库??????
返回值:
?成功返回0,失败返回错误码
const??char??*sqlite3_errmsg(sqlite3?*db);
功能:
?打印错误信息????????
返回值:
?返回错误信息

不使用回调函数执行SQL语句

sqlite3_get_table


int???sqlite3_get_table(sqlite3?*db,?const??char??*sql,??char?***resultp,??int*nrow,??int?*ncolumn,?char?**errmsg);
功能:
?执行SQL操作
参数:
?db:数据库句柄
?sql:SQL语句
?resultp:用来指向sql执行结果的指针
?nrow:满足条件的记录的数目
?ncolumn:每条记录包含的字段数目
?errmsg:错误信息指针的地址
返回值:
?成功返回0,失败返回错误码

举例

下面比如我们要显示student表中所有的数据信息,我们就可以利用sqlite3_get_table()执行语句:

select?*?from?student

实现代码如下:

void?do_show_sample(sqlite3?*db)
?{
??char?**result,?*errmsg;
?int?nrow,?ncolumn,?i,?j,?index;

?if?(sqlite3_get_table(db,?"select?*?from?student",?&result,?&nrow,?&ncolumn,?&errmsg)?!=?0)
?{
??printf("error?:?%s\n",?errmsg);
??sqlite3_free(errmsg);
?}
?index?=?ncolumn;
?for?(i=0;?i

假定当前的表格的数据信息如下:

no name score 4 一口Linux 77.0 5 一口peng 88.0 6 一口wang 99.0 7 一口网 66.0

关于这个函数中出现的这些参数的具体含义,我们可以见下图:

sqlite3编程接口非常多,对于初学者来说,我们暂时只需要掌握常用的几个函数,其他函数自然就知道如何使用了。

数据库

本篇假设数据库为my.db,有数据表student。

no name score 4 一口Linux 89.0

创建表格语句如下:

CREATE?TABLE??IF?NOT?EXISTS?student?(no?integer?primary?key,?name?text,?score?real);

常用函数

sqlite3_open

int???sqlite3_open(char??*path,???sqlite3?**db);
功能:
????打开sqlite数据库
参数:
?path:?数据库文件路径
?db:?指向sqlite句柄的指针
返回值:
?成功返回0,失败返回错误码(非零值)

sqlite3_close

int???sqlite3_close(sqlite3?*db);
功能:
?关闭sqlite数据库??????
返回值:
?成功返回0,失败返回错误码
const??char??*sqlite3_errmsg(sqlite3?*db);
功能:
?打印错误信息????????
返回值:
?返回错误信息

不使用回调函数执行SQL语句

sqlite3_get_table


int???sqlite3_get_table(sqlite3?*db,?const??char??*sql,??char?***resultp,??int*nrow,??int?*ncolumn,?char?**errmsg);
功能:
?执行SQL操作
参数:
?db:数据库句柄
?sql:SQL语句
?resultp:用来指向sql执行结果的指针
?nrow:满足条件的记录的数目
?ncolumn:每条记录包含的字段数目
?errmsg:错误信息指针的地址
返回值:
?成功返回0,失败返回错误码

举例

下面比如我们要显示student表中所有的数据信息,我们就可以利用sqlite3_get_table()执行语句:

select?*?from?student

实现代码如下:

void?do_show_sample(sqlite3?*db)
?{
??char?**result,?*errmsg;
?int?nrow,?ncolumn,?i,?j,?index;

?if?(sqlite3_get_table(db,?"select?*?from?student",?&result,?&nrow,?&ncolumn,?&errmsg)?!=?0)
?{
??printf("error?:?%s\n",?errmsg);
??sqlite3_free(errmsg);
?}
?index?=?ncolumn;
?for?(i=0;?i

假定当前的表格的数据信息如下:

no name score 4 一口Linux 77.0 5 一口peng 88.0 6 一口wang 99.0 7 一口网 66.0

关于这个函数中出现的这些参数的具体含义,我们可以见下图:

在这里插入图片描述

由上图可知: 代码中:

ncolumn?=?3
nrow????=?5
result?指向所有的结果组成的字符串数组,
各个具体字符串的下标,图上已经标明。

结合此图再去理解代码,就很容易理解代码的实现原理。

使用回调函数执行SQL语句

sqlite3_exec

typedef??int?(*sqlite3_callback)(void?*,?int,?char?**,?char?**);

int???sqlite3_exec(sqlite3?*db,?const??char??*sql,??sqlite3_callback?callback,?void?*,??char?**errmsg);
功能:
?执行SQL操作
参数:
?db:数据库句柄
?sql:SQL语句,就是我们前面两章用于操作表的增删改查语句
?callback:回调函数
?errmsg:错误信息指针的地址
返回值:
?成功返回0,失败返回错误码

回调函数

typedef??int?(*sqlite3_callback)(void?*para,?int?f_num,?char?**f_value,?char?**f_name);
功能:
?每找到一条记录自动执行一次回调函数
参数:
?para:传递给回调函数的参数
?f_num:记录中包含的字段数目
?f_value:包含每个字段值的指针数组
?f_name:包含每个字段名称的指针数组
返回值:
?成功返回0,失败返回-1

举例

sqlite3?*db;
char??*errmsg,**resultp;

int?callback(void?*para,?int?f_num,?char?**f_val,?char?**f_name)
{
?int?i;

?for?(i=0;?i

回调函数方法实现的代码,需要实现一个回调函数:callback。 函数sqlite3_exec()在解析命令"select * from student" ,没获取到一行数据就会调用一次回调函数, 参考上面的表格student,

callback()总共会被调用5次,
f_num?对应结果的列数,为3
f_value?则指向?每一列对应的值组成的字符串数组

假设现在callback是第四次被调用,如下图:

运行结果

编译需要使用第三方库lsqlite3。

gcc?student.c?-o?run?-lsqlite3

其他函数

sqlite3?*pdb,?数据库句柄,跟文件句柄FILE很类似
sqlite3_stmt?*stmt,?这个相当于ODBC的Command对象,用于保存编译好的SQL语句

sqlite3_exec(),?执行非查询的sql语句
sqlite3_prepare(),?准备sql语句,执行select语句或者要使用parameter?bind时,用这个函数(封装了sqlite3_exec)
Sqlite3_step(),?在调用sqlite3_prepare后,使用这个函数在记录集中移动

还有一系列的函数,用于从记录集字段中获取数据,如

sqlite3_column_text(),?取text类型的数据
sqlite3_column_blob(),取blob类型的数据
sqlite3_column_int(),?取int类型的数据

国际惯例,上完整代码:

#include?
#include?
#include?
#include?

void?do_insert(sqlite3?*db)
{
?int?no;
?char?name[16];
?float?score;
?char?sqlstr[128],?*errmsg;

?printf("input?no?:?");
?scanf("%d",?&no);
?printf("input?name?:?");
?scanf("%s",?name);
?printf("input?score?:?");
?scanf("%f",?&score);
?sprintf(sqlstr,?"insert?into?student?values?(%d,?'%s',?%.1f)",?
?no,?name,?score);
?#if?__DEBUG
?printf("cmd:%s\n",sqlstr);
?#endif
?if?(sqlite3_exec(db,?sqlstr,?NULL,?NULL,?&errmsg)?!=?0)
?{
??printf("error?:?%s\n",?sqlite3_errmsg(db));
?}
?else
?{
??printf("insert?is?done\n");
?}
?printf("\n");

?return;
}

void?do_delete(sqlite3?*db)
{
?char?*errmsg;
?char?sqlstr[128],?expression[64];

?printf("input?expression?:?");
?scanf("%s",?expression);//name='ma'
?sprintf(sqlstr,?"delete?from?student?where?%s",?expression);
#if?__DEBUG
?printf("cmd:%s\n",sqlstr);
#endif
?if?(sqlite3_exec(db,?sqlstr,?NULL,?NULL,?&errmsg)?!=?0)
?{
??printf("error?:?%s\n",?sqlite3_errmsg(db));
?}
?else
?{
??printf("deletet?is?done\n");
?}
?printf("\n");

?return;
}
?
int?callback(void?*para,?int?f_num,?char?**f_val,?char?**f_name)
{
?int?i;

?for?(i=0;?i

运行主页面:

插入记录:

显示记录:

删除记录:

完整代码,请关注公众号「一口Linux」

Tags:

最近发表
标签列表