Linux多任务编程(网络编程-数据库篇)

news2024/10/12 19:38:49

前言

        本文记录嵌入式领域用的小型数据库 sqlite数据库,以及c语言中使用sqlite3。

数据库

数据存储方式(3种)

        (1)直接地址存储:单片机的烧写;
        (2)文件存储:应用与数据之间没有特殊的联系,且数据量不太大,一行可以代表一个独立的数据;
        (3)数据库存储:数据量大,且数据之间有特殊联系(可进行增删改查等等)。

  • 大型数据库:oracle
            特点:能处理上亿的数据量,一般应用于银行,通信大型的场景;
            缺点:贵,占用内存较大,GB到TB级
  • 中型数据库:mysql、SQLserver
            特点:能处理百万级的数据量,比大型数据库便宜
  • 小型数据库:sqlite(多应用在嵌入式领域)
            特点:开源,占用内存小,一般几k
  • 云数据库:百度云、阿里云、华为云等。

sqlite数据库

安装

sudo apt install sqlite3
查看是否安装成功
sqlite3 --version
安装sqlite3开发库
sudo apt-get install libsqlite3-dev

打开 

        没有创建数据库,有打开

sqlite3 my.db

退出

.q

 

SQL语句

创建数据表

create table 表名 (字段名1 字段类型1,...)
integer 整型
varchar 字符串类型,相当于一个字符数组,默认长度为50
例子:
create table stu_info (
    number integer,
    name varchar(10),
    age integer,
    sex varchar(10)
);

查看数据表 

.table

删除表

drop table 表名;

插入记录(重点)

insert into 表名 values(字段值1,字段值2);
insert into stu_info values(1001,'zhangsan',18,'nan');
--插入部分数据
insert into stu_info(number,name) values(1001,'zhangsan');

查询记录(重点)

--查询所有数据
select * from 表名;
--查询某个字段
select name,age from 表明;
--按顺序输出所有记录,按数学成绩排序
select * from score_info order by math;    --默认是升序
select * from score_info order by math desc;    --加上desc变为降序排列
--多条件插叙
使用and或者or
--统计数据的条数
select count(*) from score_info;
--统计数学成绩的总和
select sum(math) from score_info;
--统计数学成绩的平均值
select avg(math) from score_info;

 sqlite格式化:

.header on    显示表头
.mode column  左对齐

格式化前 :

 

格式化后: 

 

案例

 

删除记录(重点)

--删除表中所有记录
delete from 表名;    
 --删除符合删除条件的记录
delete from 表名 where 条件;   

修改记录(重点)

update 表名 set 待修改字段名 = 修改后的值 where 条件;
--修改stu_info表中,把李四名字改为lishuang
update stu_info set name = 'lishuang' where name = '李四';

 通过脚本执行SQL语句

--执行脚本 test.sql
create table shell_info (number integer,name varchar(20),cnt integer);
insert into shell_info values(1001,'zhangsan',20);
insert into shell_info values(1002,'lisi',10);
insert into shell_info values(1003,'sunwukong',9);
insert into shell_info values(1004,'wangermazi',7);

        (1)将sql语句放到一个后缀.sql的文本里
        (2)执行sqlite3 my.db < test.sql 导入到数据库中

多表联合查询 

--查询学生信息表中学生名,以及成绩表中的数学成绩
select stu_info.name,score_info.math
from stu_info,score_info
where stu_info.number = score_info.number;

 

代码操作数据库

打开数据库(sqlite3_open函数)

#include <sqlite3.h>
int sqlite3_open(const char* fileName, sqlite3** ppDB);

        功能:打开数据库,不存在则先创建在打开

        参数1:数据文件的路径
        参数2:需要准备sqlite3*类型变量,将变量的地址作为参数,函数运行完后,此指针指向打开的数据库。

        返回值:成功,返回SQLITE_OK;失败,返回其他值

执行数据库操作的SQL语句(sqlite3_exec函数)

int sqlite3_exec(sqlite3 *, const char *sql, 
                int (*callback)(void *, int, char **, char **), 
                void *, char **errmsg);

        功能:(insert into、create table、update、delete)

        参数1:sqlite3* db
        参数2:待执行的SQL语句(字符串)
        参数3:NULL
        参数4:NULL
        参数5:如果SQL语句有语法错误,则将错误原因复制给此变量(字符串)

        返回值:成功,返回SQLITE_OK;失败,返回其他值

 例子

#include <sqlite3.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
    sqlite3 *db;
    int ret = sqlite3_open("my.db", &db);
    if (ret == SQLITE_OK)
    {
        printf("open success\n");
        char *sql = "inset into stu_info values(1004,'xiaobai',18,'nv');";
        char *err;
        ret = sqlite3_exec(db, sql, NULL, NULL, &err);
        if (ret == SQLITE_OK)
        {
            printf("insert ok\n");
        }
        else
        {
            printf("sql:%s err:%s\n", sql, err);
        }
    }
    return 0;
}

        编译时需要链接 -lsqlite3 

例子2:终端输入值的方式

#include <sqlite3.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
    sqlite3 *db;
    int ret = sqlite3_open("my.db", &db);
    if (ret == SQLITE_OK)
    {
        printf("open success\n");
        int number;
        char name[20];
        int age;
        char sex[10];
        printf("please input number,name,age,sex\n");
        scanf("%d%s%d%s",&number,name,&age,sex);
        char sql[128];
        sprintf(sql,"insert into stu_info values(%d,'%s',%d,'%s');",number,name,age,sex);
        //char *sql = "insert into stu_info values(1004,'xiaobai',18,'nv');";
        char *err;
        ret = sqlite3_exec(db, sql, NULL, NULL, &err);
        if (ret == SQLITE_OK)
        {
            printf("insert ok\n");
        }
        else
        {
            printf("sql:%s err:%s\n", sql, err);
        }
    }
    return 0;
}

 

查询语句(sqlite3_get_table函数) 

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

        参数1:db
        参数2:执行的SQL语句
        参数3:(出参)查询后,将查询结果(字符串数组)的首地址(char**)赋值给这个变量 
        参数4:(出参)有几条记录,返回的字符串数组中会把表头返回出来,但表头不不计入记录数;所以在使用此变量是,需要自行加1
        参数5:(出参)有几个字段(列)
        参数6:如果SQL语句有语法错误,则将错误原因复制给此变量(字符串)

#include <sqlite3.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
    sqlite3 *db;
    int ret = sqlite3_open("my.db", &db);
    if (ret == SQLITE_OK)
    {
        printf("open success\n");
        char *sql = "select * from stu_info";
        char **q;
        int nrow, ncol;
        char *err;
        ret = sqlite3_get_table(db, sql, &q, &nrow, &ncol, &err);
        if (ret == SQLITE_OK)
        {
            if (nrow > 0) // 查询后有记录
            {
                for (int i = 0; i < nrow+1; i++)
                {
                    for (int j = 0; j < ncol; j++)
                    {
                        printf("%10s\t", *q++);
                    }
                    printf("\n");
                }
            }
        }
    }
    return 0;
}

 

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

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

相关文章

接口多继承与子类继承多接口时的冲突问题,方法冲突与变量冲突.....

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

IDEA2024最新版本运行Web应用时 Tomcat 日志中的中文乱码问题修复解决

一、IDEA2024运行Tomcat日志中的中文乱码问题修复 在使用tomcat的时候经常遇到乱码问题&#xff0c;要么是控制台输出乱码或者输出日志乱码&#xff0c;要么页面接收乱码&#xff0c;产生乱码的根本原因就是编码和解码不一致。网上有的文章写得也有问题&#xff0c;今天自己多看…

计算机毕业设计 | springboot商城售后管理系统 购物平台(附源码)

1&#xff0c;绪论 1.1 开发背景 在数字化时代的推动下&#xff0c;产品售后服务管理机构面临着信息化和网络化的挑战。传统的手工管理和纸质档案已经无法满足管理人员和读者的需求。为了提高产品售后服务管理机构的管理效率和服务质量&#xff0c;开发和实现一个基于Java的售…

轻量服务器和云服务器ecs哪个好用一些?

轻量服务器和云服务器ecs哪个好用一些&#xff1f;轻量服务器与云服务器ECS在多方面存在显著差异&#xff0c;对于需要高性能计算和大规模数据处理的用户来说&#xff0c;ECS可能是更好的选择&#xff1b;而对于预算有限且需求较为简单的用户来说&#xff0c;轻量服务器可能更为…

计算机网络:数据链路层 —— 可靠传输服务

文章目录 可靠传输停止-等待 (SW) 协议超时重传机制分组编号机制ACK 丢失问题ACK 延迟问题 注意事项信道利用率 回退 N 帧 (GBN) 协议滑动窗口信道利用率无传输差错超时重传、回退N帧 累计确认 选择重传 (SR) 协议滑动窗口 可靠传输 若数据链路层向其上层提供的服务类型为可靠…

【Linux】Screen的使用:新建、退出、再登陆

Linux screen 命令详解与使用指南 在Linux系统中&#xff0c;screen 是允许用户在单个终端会话中运行多个进程&#xff0c;并能在会话之间切换。 适用情况&#xff1a;screen 特别适用于远程登录&#xff08;如通过SSH&#xff09;时&#xff0c;确保即使网络连接断开&#x…

2017年-2021年 软件工程程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录 2017年1.c语言程序设计部分2.数据结构程序设计部分 2018年1.c语言程序设计部分2.数据结构程序设计部分 2019年1.c语言程序设计部分2.数据结构程序设计部分 2020年1.C语言程序设计部分2.数据结构程序设计部分 2021年1.C语言程序设计部分2.数据结构程序设计部分 2017年 …

《RabbitMQ篇》消息应答和发布确认

消息应答 消息应答机制&#xff1a;消费者接收信息并处理完之后&#xff0c;告诉rabbitmq该信息已经处理&#xff0c;rabbitmq可以把该信息删除了. 消息自动重新入队&#xff1a;如果处理某个消息的消费者异常关闭了&#xff0c;没有发送ACK确认&#xff0c;rabbitmq会将其重…

GEE 高阶应用:eeExtra包(Python、R、julia和JavaScript API)

目录 简介 功能 它是如何工作的? 安装 功能 缩放和偏移 光谱指数 STAC features JavaScript API模型 简介 Google Earth Engine (GEE) 是一个基于云的服务,用于矢量和栅格数据的地理空间处理。Earth Engine 平台具有 JavaScript 和 Python API,提供不同的方法来处…

STM32学习--5-2 旋转编码器计次

接线图 按键按下&#xff0c;旋转编码器输出低电平 Encoder.c #include "stm32f10x.h" // Device headerint16_t Encoder_Count; void Encoder_init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // 开启APB2Periph外设GPIOB时钟…

Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)

0x01 产品简介 Palo Alto Networks Expedition 是一款强大的工具,帮助用户有效地迁移和优化网络安全策略,提升安全管理的效率和效果。它的自动化功能、策略分析和可视化报告使其在网络安全领域中成为一个重要的解决方案。 0x02 漏洞概述 Palo Alto Networks Expedition中存…

一键生成证件照_HivisionIDPhotosv1.2.8整合包

HivisionIDPhoto&#xff1a;智能证件照制作 HivisionIDPhoto 专注于开发一套实用且系统化的智能证件照制作算法&#xff0c;旨在为用户提供快速、准确的证件照生成服务。通过完整的 AI 模型流程&#xff0c;HivisionIDPhoto 能够识别多种拍照场景&#xff0c;精准抠图&#x…

牛客SQL练习详解 06:综合练习

牛客SQL练习详解 06&#xff1a;综合练习 SQL34 统计复旦用户8月练题情况SQL35 浙大不同难度题目的正确率SQL39 21年8月份练题总数 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; SQL34 统…

手撕数据结构 —— 带头双向循环链表(C语言讲解)

目录 0.前言 1.什么是带头双向循环链表 理解带头 ​编辑 理解双向 理解循环 2.带头双向循环链表的实现 List.h文件中接口总览 具体实现 结点的定义 申请结点 初始化 打印链表 尾插 尾删 头插 头删 ​编辑​编辑 获取大小 查找 在指定位置前插入 ​编辑…

初知C++:AVL树

文章目录 初知C&#xff1a;AVL树1.AVL树的概念2.AVL树的是实现2.1.AVL树的结构2.2.AVL树的插入2.3.旋转2.4.AVL树的查找2.5.AVL树平衡检测 初知C&#xff1a;AVL树 1.AVL树的概念 • AVL树是最先发明的自平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性…

中国剩余定理 C++

题目 解题思路 原链接&#xff1a;https://www.acwing.com/solution/content/3539/ 大致步骤&#xff1a; 将第2,3,4…n个方程不断与第一个方程合并&#xff0c;得到方程a1k1a2k2m2-m1;用扩展欧几里得算法解出a1k1a2k2gcd(a1, a2)的结果&#xff0c;再将结果扩大(m2-m1)/d倍即…

2-laravel-路由配置

文章目录 定义控制器设计控制器设置路由启动服务 基本路由视图路由建立视图路由建立视图文件 控制器视图路由创建视图二级目录控制器 定义控制器 打开laravel 工程 建立一个 Demo 名字的控制器去集成 模板控制器 安装两个插件 设计控制器 <?phpnamespace App\Http\…

关于电动自行车新增的通信功能要求如下

1、 电动自行车应具有采用TLS加密的4G或5G公网通信模块&#xff0c;或类似功能的地面通信模块。 注:根据我国无线电管理有关规定&#xff0c;可能需要对无线电发射模块或整车进行无线电发射设备型号核准。 2、通信模块具备向电动自行车管理平台发送以下动态安全监测信息的功能&…

SpringBoot项目升级JDK版本(1.8 => 17)

项目&#xff1a;这里使用gitee上一个开源项目做测试《SpringBoot 流媒体项目》 工具&#xff1a;Intellij IDEA 一、下载项目&#xff08;git clone …&#xff09; 1、打开 pom.xml 看一下 2、启动项目&#xff0c;记住它最原本的样子先。成功启动后控制台后面是会输出地址…

怎么进行智能配音?一文告诉你

如何给文字智能配音呢&#xff1f;将文字转化为生动的语音&#xff0c;是提升内容吸引力的有效方式。 无论是制作视频、音频课程还是电子读物&#xff0c;合适的配音都能让信息传递更加高效。 如果你正寻找简单易用的方法来给文字添加配音&#xff0c;这里有几款智能配音软件…