linux下sqlite3的使用实例(c语言)

2023-11-11

1.安装数据库

Linux 下安装sqlite3 需要两个个命令 即可:
(1)sudo apt-get install sqlite
(2)apt-get install libsqlite3-dev

2.相关函数

1. sqlite3_open 用来打开一个数据库

#include <sqlite3.h>

int sqlite3_open(const char *dbname, sqlite3 **db)

第一个参数dbname:数据库的名称
第二个参数 db:数据库的句柄

2.sqlite3_close 关闭一个数据库

int sqlite3_close(sqlite3 *db)

3.sqlite3_exec 用来执行sqlite3 语句

int sqlite_exec(sqlite *db, const char *sql,int (* callback)(void *int, char **, char **),void *, char **errmsg);

第一个参数db:与之前相同;
第二个参数sql:SQL语句;以\0结尾。
第三个参数callback:回调函数;当这条语句执行之后,sqlite3会去调用你提供的这个函数。通常设为NULL。
第四个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
第五个参数char** errmsg 是错误信息。

说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。虽然回调显得代码整齐,但有时候你还是想要非回调的select
查询。这可以通过sqlite3_get_table 函数做到。

4.sqlte3_get_table 执行sql的查询功能

int sqlite3_get_table(sqlite3 *db, const char *zSql,char **pazResult, int *pnRow,int *pnColumn);

第一个参数db:数据库句柄
第二个参数zSql:sqlite3的语句,跟sqlite3_exec 里的sql 是一样的。是一个很普通的以\0结尾的char*字符串。
第三个参数pazResult:查询的结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:字段名称,后面是紧接着是每个字段值。
第四个参数pnRow:结果集的列数,即查出多少行
第五个参数errmsg:错误信息

注意:如果提供了errmsg,用来创建错误消息的内存是在堆上分布的。 故在调用后,应该检查一下是否为null值,如果有错误发生,使用sqlite3_free()释放errmsg占用的内存。

3.代码实例

3.1创建一个数据库

#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
          sqlite3     *db=NULL;
          int          rc = -1;
}

//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
    rc = sqlite3_open("yjntest.db", &db);
    if( rc < 0 )
    {
             printf("Can't open(creat) database: %s\n", sqlite3_errmsg(db));
             exit(1);
    }
    else
    {
             printf("You have opened a sqlite3 database named yjntest .db successfully!\n");
             sqlite3_close(db); //关闭数据库
             return 0;
    }
}

编写好后我们开始运行
在这里插入图片描述当我们再次查看当前目录时,可以发现多一个我们命名的数据库。
在这里插入图片描述
需要注意的时在编译时需要在末尾加上一个 -lsqlite3,不然会抛错。

3.2插入数据

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sqlite3.h"
#include <errno.h>

int main( int argc, char **argv )
{
      sqlite3    *db=NULL;
      char       *zErrMsg = 0;
      int        rc;
      char       *sql;

      rc = sqlite3_open("yjntest.db", &db);//打开指定的数据库文件,如果不存在将创建一个同
名的数据库文件
      if( rc )
      {
             printf( "Can't open database: %s\n", sqlite3_errmsg(db));
             exit(1);
      }
      else
      {
             printf("You have opened a sqlite3 database named yjntest.dbsuccessfully!\n");
      }
      
      //利用sql语句创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中。
      sql = " CREATE TABLE SensorData("\
            "ID number,"\
            "name,"\
            "birthday,"\
            "telephone,"\
            "age          );" ;
            
       sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );

//添加数据
       sql = "INSERT INTO SensorData VALUES('1' , 'yang' ,' 1.1' ,'12580', '18' );" ;
       sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
       sql = "INSERT INTO SensorData VALUES( '2', 'jia' , '2.2' ,'10086', '16' );" ;
       sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
      printf("Insert successfully!\n");

      sqlite3_close(db); //关闭数据库
       return 0;
}

运行之后我们通过命令:sqlite3 yjntest.db
进入我们创建的数据库中在这里插入图片描述,在执行命令:select * from sesordata(你创建的表的名称)就可以看到刚刚我们所添加的信息。

3.3查看表的内容

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sqlite3.h>

//查询数据
/*int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg );
result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。
nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0
*/

int main(int argc, char **argv)
{
         sqlite3   *db=NULL;
         int       rc;
         char      *sql;
         int       nrow=0, ncolumn=0;
         char      **azResult;
         char      *zErrMsg = 0;     //二维数组存放数据

     rc = sqlite3_open("yjntest.db", &db);//打开指定的数据库文件,如果不存在将创建一>个同名的数据库文件
     if( rc )
     {
          printf( "Can't open database: %s\n", sqlite3_errmsg(db));
          exit(1);
     }
     printf("You have opened a sqlite3 database named yjntest.db successfully!\n");

     sql = "SELECT * FROM SensorData ";
     rc = sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg ); 

     if(rc == 0)
     {
           printf( "row:%d column=%d\n" , nrow , ncolumn );
           printf( "The result of querying is :\n" );
      
           int i=0,j=0;

           for( i=1 ; i<( nrow + 1 )* ncolumn  ; i++ )
           {
                    printf("%s    ",azResult[i*ncolumn+j]);
                    printf("\n");
           }
            
       }
     }
     else if( rc )
     {
           printf("SQL error!:%s\n",zErrMsg);//打印错误信息
           sqlite3_free(zErrMsg);//释放掉 azResult 的内存空间
        }
         sqlite3_close(db); //关闭数据库
        return 0;
}
     
     

运行后我们可以直接看到我们之前存入的数据 在这里插入图片描述

3.4删除数据

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sqlite3.h>

int main(int argc, char **argv)
{
      sqlite3          *db;
      int               rc;
      char             *sql;
      char             *zErrMsg= 0;     //获取错误信息
      char             *data;

      rc = sqlite3_open("yjntest.db",&db);//打开数据库
      if( rc )
      {
          printf("Can't open database!:%s\n",sqlite3_errmsg(db));
          exit(0);
      }
      printf("You have opened a sqlite3 database named yjntest.db successfully!\n");

      //制作sql语句
      sql =  "delete from SensorData";   //删除表中所有数据
       
       //删除某个特定的数据
       /*sql="delete from SensorData where ID number = 1 ;";
          sqlite3_exec( db , sql , NULL , NULL , &zErrMsg );
         */

      rc = sqlite3_exec(db,sql,NULL,(void *)data,&zErrMsg);   
      if(rc)
      {
           printf("SQL error!:%s\n",zErrMsg);//打印错误信息
           sqlite3_free(zErrMsg);//释放掉 azResult 的内存空间
      }
      else
      {
           printf("delete recodes successfully!\n");
      }
      sqlite3_close(db);//关闭数据库

      return 0}

运行之后我们再进入到之前创建的数据库中
在这里插入图片描述
我们可以看到表中已经没有数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下sqlite3的使用实例(c语言) 的相关文章

  • 基于netty游戏服后台搭建

    项目要转游戏开发了 所以搭个游戏服 游戏一般是长连接 自定义协议 不用http协议 BIO NIO AIO这些我就不说了 自己查资料 我现在用spring netty搭起简单的游戏服 思路 1自定义协议和协议包 2spring netty整
  • python元组列表里追加元素_Python元祖 tuple 内部列表添加元素相关

    面试python遇到的一道数据类型基础题 我们都知道python中不可变类型有tuple 但是如果tuple里面的列表增加元素会怎么样呢 先看代码 a 1 2 3 4 5 print a 3 4 5 a 3 append 6 print a
  • 学习笔记(5):MySQL数据库从入门到实战应用-数据完整性

    立即学习 https edu csdn net course play 27328 362521 utm source blogtoedu 实体完整性 要求每张表都有唯一标识符 每张表主键字段不为空且不能重复 唯一性约束 主键约束 标识列
  • MVC框架增删改查

    mvc对表单内容的增删改查 1 首先把所需的包导入项目内 2 连接数据库的帮助类DBAccess package com Liuyujian Dao import java io InputStream import java sql Co
  • 邮件服务器-postfix服务器

    Postfix 是一种电子邮件服务器 它是由任职于IBM华生研究中心 T J Watson Research Center 的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的 最早在1990年代晚期出现 是一
  • Java设计模式之策略模式+工厂模式(反射和注解)

    现在我们有一个需求 我们通常的实现方式是这样的 假设有3种会员 分别为会员 超级会员以及金牌会员和普通顾客 针对不同类别的会员 有不同的打折方式 并且一个顾客每消费10000就增加一个级别 以上四种级别分别采用原价 普通顾客 九折 会员 八
  • [Android] Toast问题深度剖析(二)

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一 由于其方便的api设计和简洁的交互体验 被我们所广泛采用 但是 伴随着我们开发的深入 Toast 的
  • ORA-00936: missing expression

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 造成这个错误的原因是 选取的最后一个字段与from之间有逗号 解决方法 将字段与from之间的逗号去掉
  • Spring MVC使用JSON的过程与步骤

    活动地址 CSDN21天学习挑战赛 目录 JSON数据交互 RESTful支持 JSON数据交互 1 用eclipse创建一个动态web项目 将项目依赖的jar包放到lib目录下 2 在WEB INF目录下创建web xml 对Spring
  • 关于JPEG的那点事儿:JPEG原理篇

    前言 本文其实于差不多正好1年前写成 是关于JPEG的那点事儿的补充 但是由于实战篇一直烂尾 拖到现在 前几天看到Google发了个JPEG新算法 说是可以将JPEG的体积同质量情况下再压缩35 突然想起了这文了 为了说清楚Google为什
  • python题目55:单词接龙

    单词接龙的规则是 可用于接龙的单词首字母必须要与前一个单词的尾字母相同 当存在多个首字母相同的单词时 取长度最长的单词 如果长度也相等则取词典序最小的单词 已经参与接龙的单词不能重复使用 现给定一组全部由小写字母组成的单词数组 并指定其中的
  • 勿以专家自居

    对于权威 我心存芥蒂 我在 StrongOpinions Weakly Held 观点鲜明 但不固执己见 一文中曾经说过 当我了解到别人把我视为专家或者权威 而不是像伙伴一样的志趣相投者时 我就会觉得非常困扰 如果非要说我在迄今为止的职业生
  • PCL学习之点云可视化:坐标字段、随机、单一颜色、法向量

    pcl中几种常见的点云渲染方式 1 颜色区别深度 此方法在PointCloudColorHandlerGenericField类中实现 该将不同的深度值显示为不同的颜色 实现以颜色区分深度的目的 PointCloudColorHandler
  • TCP/IP校验和计算算法

    ICMP IP UDP TCP报头部分都有checksum 检验和 字段 ICMP和IP报头校验和的计算都很简单 过程如下 1 把校验和字段置为0 2 对IP头部中的每16bit进行二进制求和 3 如果和的高16bit不为0 则将和的高16
  • ubuntu16.04\18.04安装Azure Kinect SDK+配置ros版 超全详细踩坑记录

    一些参考 1 官网教程Azure Kinect Sensor SDK 官网教程Azure Kinect ROS Driver 2 Azure Kinect SDK Ubuntu 16 04 18 04安装配置方法 3 ubuntu16 04
  • 无监督学习分类

    把输入数据看成一个行 m 为特征 列 N 为样本的矩阵 则从数据角度 可以将无监督学习分为三类 将数据按列划分 即将相似的样本聚到同类 即对数据进行聚类 代表算法k means 层次聚类 将数据按行划分 把高维空间的向量转化到低维空间的向量
  • 《吃透 MQ 系列》之Kafka精妙的高性能设计(下篇)

    在 上一篇文章 中 指出了高性能设计的两个关键维度 计算和 IO 可以将它们理解成 道 同时给出了 Kafka 高性能设计的全景图 可以理解成 术 图 1 Kafka 高性能设计的全景图 这篇文章将继续对存储消息和消费消息的 8 条高性能设
  • 基于C语言的栈

    基于王道数据结构 include
  • 开源静态代码检测工具Splint

    如果想用一个有效的工具察看C C 源代码中的错误 遗漏 不确定的构建过程 以及移植问题等等 你应该来看看Lint 可以把Lint当成一个编译器 除了不产生代码之外 对于错误和警告的报告来说已经非常足够了 通常 一个C C 的编译器假设程序是
  • Java实现人脸登录、注册等功能【完整版】

    推荐 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 前言 这段时间由于学校实行静态化管理 寝室门和校门都是用了人脸识别的装置 每次经过都会激发我的好奇心 也想自己搞一个人脸识别玩玩 随着开

随机推荐

  • python机器学习 transform,fit_transform

    首先使用transfer StandardScaler 来实例化一个转换器 我们要对训练集和测试集进行相同的归一化 标准化处理 先处理训练集 x train transfer fit transform x train fit transf
  • 【纯干货】学python的,这些能快速月入过万的兼职途径,你不会还不知道吧

    我想辞职 在这个疫情当下的时代 许多打工人都有过这么一个想法 或许是因为工作待遇 亦或许是其他原因 但是却仍然屹立在工位上 有的甚至天天喊辞职 月月拿满勤 这是为什么呢 因为他们虽然无数次筹谋辞职 却也无数次的担心裸辞之后的压力 而作为平平
  • Hyper Terminal 配置体验分享

    Hyper Terminal 简介 Hyper is an Electron based terminal Built on HTML CSS JS Fully extensible 以上内容来自Hyper Terminal官网对该终端的介
  • 基于卷积神经网络-门控循环单元(CNN-GRU)多输入多输出预测,CNN-GRU回归预测。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据 xlsx 数据分析 num size 0 8 训练集占数据集比例 ou
  • vue解决弹出图片显示在弹框下方

    弹出的图片显示在弹框下面怎么办 问题来源 问题分析 解决方法 问题来源 在写前端vue项目时 在用到ele的 el image 这个组件时 有时会出现图片显示在弹框即dialog下面 后面发现是因为el image组件 默认的z index
  • 【ffmpeg基础】ffmpeg的下载安装

    一 ffmpeg的下载 1 ffmpeg github下载路径 https github com FFmpeg FFmpeg git 在ffmpeg的github上可以下载任意版本的源码 比如最新的matser上的源码 以及各个分支上 如f
  • unity 屏幕虚拟键盘

    工作上碰到许多程序需要用到键盘输入功能 调用的电脑自带键盘使用也不方便 自己写的一个键盘工具 功能 键盘大小写状态监测 设置了输入法提示词位置的定位 定位根据屏幕分辨率设置 故编辑器模式下位置有偏移 可自行调整 工具连接 https dow
  • rocketMq消息队列原生api使用以及rocketMq整合springboot

    rocketMq消息队列 文章目录 rocketMq消息队列 一 RocketMQ原生API使用 1 测试环境搭建 2 RocketMQ的编程模型 3 RocketMQ的消息样例 3 1 基本样例 3 2 顺序消息 3 3 广播消息 3 4
  • Friend-Graph HDU - 6152 签到题 暴力遍历

    Friend Graph HDU 6152 题意 给你n个人 告诉你他们之间的关系 如果有三个以上的人互相不认识或者互相认识 就认为这个团队是 Bad Team 反之输出 Great Team 我的想法就是暴力搜索 用一个二维数组保存每个人
  • 利用硬件实现矩阵乘法加速

    对于绝大多数程序员来说 优化程序往往是在算法方面 但了解一定的计算机硬件知识后 可以隐式地优化程序 下面以矩阵乘法为例 探讨计算机硬件在程序优化中的作用 原理 学过计算机组成原理的都知道 CPU访问内存的速度比CPU计算速度慢得多 为了解决
  • WKWebView设置请求头HTTPHeaderField

    WKWebView HTTPHeaderField WKWebView的请求头添加字段 系统的NSMutableHTTPURLRequest类提供了获取HTTP请求的请求头 HTTPHeader 和设置 添加HTTP请求的请求头的API p
  • 龙书D3D11章节习题答案(第四章)

    以下答案仅供参考 有错欢迎留言 Chapter 4 Direct3D Initialzation 1 Modify the previous exercise solution by disabling the ALT ENTER func
  • DVWA XSS总结

    笔者对该靶场所需的相关知识进行了总结 拓展 供大家学习参考 XSS 漏洞学习 DVWA XSS Reflected low 未进行过滤 构造payload medium 过滤规则 把 lt script gt 用str replace 函数
  • Java类加载

    1 JAVA类装载器在装载类的时候是按需加载的 只有当一个类要使用 使用new 关键字来实例化一个类 的时候 类加载器才会加载这 个类并初始化 类Main java 代码 publicclass Main publicstaticvoid
  • STM32—CAN通信

    文章目录 一 CAN通信简介 1 1 CAN简介 1 2 CAN协议特点 1 3 CAN通信的帧类型 1 4 数据帧结构 1 5 CAN的位时序 1 6 CAN的仲裁功能 二 STM32F1的CAN 2 1 bxCAN简介 2 2 bxCA
  • 8-js高级-6(promise)

    一 Promise 的理解和使用 1 Promise 是什么 理解 抽象表达 Promise 是一门新的技术 ES6 规范 Promise 是 JS 中进行异步编程的新解决方案 备注 旧方案是单纯使用回调函数 具体表达 从语法上来说 Pro
  • c语言练习题56:变种水仙花

    变种水仙花 描述 变种水仙花数 Lily Number 把任意的数字 从中间拆分成两个数字 比如1461 可以拆分成 1和461 14和61 146和1 如果所有拆分后的乘积之和等于自身 则是一个Lily Number 例如 655 6 5
  • Echarts柱状图的点击事件

    最近在做一些图表统计的功能 用到了百度的开源图表软件Echatrs 不得不提的是 不但上手简单而且扩展功能也是十分强大 在使用的过程中也遇到了不少问题 可能由于有关Echatrs的资料并不是很齐全 所以查找资料的过程也是相当曲折的 所以还是
  • 硬盘错误计数 计算机内存不足,硬盘问题!Ultra DMA CRC错误计数 电脑死机

    最近电脑经常出现卡机状态 此状态出现前先是硬盘嗡嗡响 就像汽车油门一样 一加一松 但声音不是很大 然后硬盘紧接着还有嘎吱的响声 这样重复几次 出现这种声音的时候 电脑出现死机状态 但停上几分钟后 一切恢复正常 有时候也会卡到电脑自动重新启动
  • linux下sqlite3的使用实例(c语言)

    文章目录 1 安装数据库 2 相关函数 3 代码实例 3 1创建一个数据库 3 2插入数据 3 3查看表的内容 3 4删除数据 1 安装数据库 Linux 下安装sqlite3 需要两个个命令 即可 1 sudo apt get insta