嵌入式中如何用C语言操作sqlite3(07)

这篇具有很好参考价值的文章主要介绍了嵌入式中如何用C语言操作sqlite3(07)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

数据库

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

no name score
4 嵌入式开发爱好者 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<nrow; i++)
 {
  for (j=0; j<ncolumn; j++)
  {
   printf("%-8s : %-8s\n", result[j], result[index]);   
   index++;
  }
  printf("************************\n");
 }
 sqlite3_free_table(result);
 return;
 }

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

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<nrow; i++)
 {
  for (j=0; j<ncolumn; j++)
  {
   printf("%-8s : %-8s\n", result[j], result[index]);   
   index++;
  }
  printf("************************\n");
 }
 sqlite3_free_table(result);
 return;
 }

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

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

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

嵌入式中如何用C语言操作sqlite3(07),Linux操作系统嵌入式开发之经典,c语言,sqlite,jvm

在这里插入图片描述

由上图可知:代码中:

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<f_num; i++)
 {
  printf("%-8s", f_val[i]);
 }
 printf("\n");

 return 0;
}

void do_show(sqlite3 *db)
{
 char *errmsg;

 printf("no      name    score\n");
 
 if (sqlite3_exec(db, "select * from student", callback, NULL, &errmsg) != 0)
 {
  printf("error : %s\n", sqlite3_errmsg(db));
 }
 printf("\n");

 return;
}

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

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

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

嵌入式中如何用C语言操作sqlite3(07),Linux操作系统嵌入式开发之经典,c语言,sqlite,jvm

运行结果

编译需要使用第三方库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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sqlite3.h>

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<f_num; i++)
 {
  printf("%-8s", f_val[i]);
 }
 printf("\n");

 return 0;
}

void do_show(sqlite3 *db)
{
 char *errmsg;

 printf("no      name    score\n");

 if (sqlite3_exec(db, "select * from student", callback, NULL, &errmsg) != 0)
 {
  printf("error : %s\n", sqlite3_errmsg(db));
 }
 printf("\n");

 return;
}

 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<nrow; i++)
 {
  for (j=0; j<ncolumn; j++)
  {
   printf("%-8s : %-8s\n", result[j], result[index]);
   
    
   index++;
  }
  printf("************************\n");
 }
 sqlite3_free_table(result);

 return;
 }
 

int main()
{
 sqlite3 *db;
 int n;
 char clean[64];

 if (sqlite3_open("my.db", &db) < 0)
 {
  printf("fail to sqlite3_open : %s\n", sqlite3_errmsg(db));
  return -1;
 }

 while ( 1 )
 {
  printf("*********************************************\n");
  printf("1: insert record   \n2: delete record  \n3: show record  \n4: quit\n");
  printf("*********************************************\n");
  printf("please select : "); 
  
  if (scanf("%d", &n) != 1)
  {
   fgets(clean, 64, stdin);
   printf("\n");
   continue;
  }
  switch ( n )
  {
   case 1 :
    do_insert(db);
    break;
   case 2 :
    do_delete(db);
    break;
   case 3 :
    do_show_sample(db);
    break;
   case 4 :
    sqlite3_close(db);
    exit(0);
  }
 }
 return 0;
}

运行主页面:

嵌入式中如何用C语言操作sqlite3(07),Linux操作系统嵌入式开发之经典,c语言,sqlite,jvm

插入记录:

嵌入式中如何用C语言操作sqlite3(07),Linux操作系统嵌入式开发之经典,c语言,sqlite,jvm

显示记录:

嵌入式中如何用C语言操作sqlite3(07),Linux操作系统嵌入式开发之经典,c语言,sqlite,jvm

删除记录:

嵌入式中如何用C语言操作sqlite3(07),Linux操作系统嵌入式开发之经典,c语言,sqlite,jvm文章来源地址https://www.toymoban.com/news/detail-729000.html

到了这里,关于嵌入式中如何用C语言操作sqlite3(07)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 10.1 嵌入式数据库之sqlite3

    【1】数据库    1, 数据库的安装        sudo dpkg -i  *.deb    2, 数据库命令:       1)系统命令 , 都以\\\'.\\\'开头          .exit           .quit          .table   查看表          .schema  查看表的结构                  2)sql语句, 都以‘;’结尾         1-- 创建一张表

    2024年02月12日
    浏览(53)
  • Python - 嵌入式数据库Sqlite3的基本使用

    SQLite是一种轻量级的嵌入式关系型数据库管理系统,而Python标准库中提供了与SQLite交互的模块,sqlite3。下面是一个Python 3中使用sqlite3模块的详细示例与解析。 这个例子展示了如何使用sqlite3模块来创建或连接一个数据库,创建一个表格,插入一些数据,查询数据,提交更改并

    2024年02月15日
    浏览(52)
  • 02.sqlite3学习——嵌入式数据库的基本要求和SQLite3的安装

    目录 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模型 ubuntu 22.04下的SQLite安装 (1)安装SQLite3软件 sudo apt-get install sqlite3 (2)安装库文件 sudo apt-get install libsqlite3-dev 安装成功后输入sqlite3查看 (3)安装sqlite3可

    2024年02月11日
    浏览(73)
  • 嵌入式数据库:SQLite3的安装和使用说明

    目录 一,SQLite简介 ① SQLite与传统服务器型数据库 ② SQLite与MySQL比较 ③ 基于嵌入式的数据库种类 二,SQLite数据库安装 ① 输入命令安装 ② 网页安装 ● 安装步骤 三,SQLite命令用法 ● 创建一个数据库 ● 创建一张表格 ● 插入一条记录 ● 查看数据库的记录 ● 删除一条

    2024年01月21日
    浏览(84)
  • C语言嵌入式系统编程注意事项之内存操作

    在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力 数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言

    2024年02月09日
    浏览(67)
  • C/C++语言学习路线: 嵌入式开发、底层软件、操作系统方向(持续更新)

    1.1 视频教程点到为止 1.2 炫技视频看看就行 1.3 编程游戏不玩也罢 有些游戏的主题任务就是编程,游戏和实际应用环境有一定差异(工具、操作流程),在初级阶段主要是熟悉实际场景,而且多数是通过前端语言进行游戏,对底层软件学习的帮助不大。 Coding Games: PHP、C、

    2024年04月28日
    浏览(80)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第八天-Linux sqlite3数据库(物联技术666)

       更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客 物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件

    2024年01月25日
    浏览(65)
  • 嵌入式操作系统(嵌入式学习)

    嵌入式操作系统是一种专门设计和优化用于嵌入式系统的操作系统。它是在资源受限的嵌入式设备上运行的操作系统,如微控制器、嵌入式处理器和系统芯片等。 嵌入式操作系统的主要目标是提供对硬件资源的有效管理和对应用程序的调度,以实现系统的可靠性、实时性和效

    2024年02月10日
    浏览(60)
  • 嵌入式开发(5)位带(位段)操作

           位带操作常用于I/O高度密集访问的芯片。        参考权威指南:Bit-band operation support allows a single load/store operation to access (read/write) to a single data bit. In the Cortex-M3 and Cortex-M4 processors, this is supported in two pre-defined memory regions(静态映射) called bit-band regions. One of th

    2023年04月08日
    浏览(46)
  • 【嵌入式基础】串口通信操作实例

    本文主要介绍流水灯实验和串口通信的实验过程,对串口协议和RS-232标准,RS232电平与TTL电平的区别,以及\\\"USB/TTL转232\\\"模块(以CH340芯片模块为例)的工作原理这些知识也有了一定的涉及。 目录 一、了解串口协议以及\\\"USB/TTL转232\\\"模块的工作原理 1、串口协议 2、RS-232标准 3、

    2024年02月01日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包