嵌入式开发学习———Linux环境下网络编程学习(四)

数据库简介

数据库是结构化数据的集合,用于高效存储、检索和管理数据。常见的数据库类型包括关系型(如MySQL、SQLite)和非关系型(如MongoDB)。关系型数据库使用表格形式存储数据,并通过SQL(结构化查询语言)操作。

SQLite3

SQLite3是轻量级、嵌入式的关系型数据库,无需服务器,以文件形式存储数据。适合嵌入式设备或小型应用。

C语言操作SQLite3示例

以下代码演示如何用C语言创建SQLite3数据库、表,并插入数据:

#include <sqlite3.h>
#include <stdio.h>int main() {sqlite3 *db;char *err_msg = 0;// 打开或创建数据库int rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 创建表char *sql = "CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT);";rc = sqlite3_exec(db, sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL错误: %s\n", err_msg);sqlite3_free(err_msg);}// 插入数据sql = "INSERT INTO users(name) VALUES('Alice');""INSERT INTO users(name) VALUES('Bob');";rc = sqlite3_exec(db, sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL错误: %s\n", err_msg);sqlite3_free(err_msg);}sqlite3_close(db);return 0;
}

关键步骤说明

  • 使用sqlite3_open打开或创建数据库文件
  • 通过sqlite3_exec执行SQL语句(如建表、插入数据)
  • 错误信息通过sqlite3_errmsgerr_msg获取
  • 最后调用sqlite3_close关闭数据库连接

编译时需要链接SQLite3库:

gcc program.c -lsqlite3 -o program

SQLite3以简洁高效著称,适合资源受限的环境。通过C语言接口可直接操作数据库文件,无需额外服务进程。

作业:

1.数据库实现案例

#include <myhead.h>int do_add(sqlite3 *dbfd)
{int id=0;char name[20]="";char sex[10]="";int age=0;printf("请输入家人编号:");scanf("%d",&id);printf("请输入姓名:");scanf("%s",name);printf("请输入性别:");scanf("%s",sex);printf("请输入年龄:");scanf("%d",&age);getchar();char sql[128]="";char *errmsg=NULL;sprintf(sql,"insert into family values(%d,\"%s\",\"%s\",%d);",id,name,sex,age);if(sqlite3_exec(dbfd,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("sqlite3_exec insert error:%s\n",errmsg);sqlite3_free(errmsg);return -1;}printf("添加成功!!!\n");return 0;
}int do_delete(sqlite3 *dbfd)
{int id=0;printf("请输入想要删除的家人编号:");scanf("%d",&id);getchar();char sql[128]="";char *errmsg=NULL;sprintf(sql,"delete from family where id==%d;",id);if(sqlite3_exec(dbfd,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("sqlite3_exec delete error:%s\n",errmsg);sqlite3_free(errmsg);return -1;}printf("删除成功!!!\n");return 0;
}int do_update(sqlite3 *dbfd)
{int id=0;printf("请输入想要删除的家人编号:");scanf("%d",&id);getchar();char name[20]="";char sex[10]="";int age=0;printf("请输入修改后的姓名:");scanf("%s",name);printf("请输入修改后的性别:");scanf("%s",sex);printf("请输入修改后的年龄:");scanf("%d",&age);getchar();char sql[128]="";char *errmsg=NULL;sprintf(sql,"update family set name=\"%s\",sex=\"%s\",age=%d where id==%d;",name,sex,age,id);if(sqlite3_exec(dbfd,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("sqlite3_exec update error:%s\n",errmsg);sqlite3_free(errmsg);return -1;}printf("修改成功!!!\n");return 0;
}int show(void *flag,int num,char **data,char **head)
{if(*((int *)flag)==0){*((int *)flag)=1;for(int i=0;i<num;i++){printf("%s\t",head[i]);}putchar(10);}for(int i=0;i<num;i++){printf("%s\t",data[i]);}putchar(10);return 0;
}int do_show(sqlite3 *dbfd)
{int flag=0;char *sql="select * from family;";char *errmsg=NULL;if(sqlite3_exec(dbfd,sql,show,&flag,&errmsg)!=SQLITE_OK){printf("sqlite3_exec select error:%s\n",errmsg);sqlite3_free(errmsg);return -1;}printf("展示成功!!!\n");return 0;
}int do_select(sqlite3 *dbfd)
{int id=0;int flag=0;printf("请输入想要查询的家人编号:");scanf("%d",&id);getchar();char sql[128]="";char *errmsg=NULL;sprintf(sql,"select * from family where id==%d;",id);if(sqlite3_exec(dbfd,sql,show,&flag,&errmsg)!=SQLITE_OK){printf("sqlite3_exec select error:%s\n",errmsg);sqlite3_free(errmsg);return -1;}printf("查询成功!!!\n");return 0;
}int main(int argc, const char *argv[])
{//打开数据库文件sqlite3 * dbfd=NULL;if(sqlite3_open("./mydb.db",&dbfd)!=SQLITE_OK){printf("sqlite3_open error:errno:%d,errmsg:%s",sqlite3_errcode(dbfd),sqlite3_errmsg(dbfd));return -1;}//创建数据表char *sql="create table if not exists family(id int,name text,sex char,age int);";char *errmsg=NULL;if(sqlite3_exec(dbfd,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("sqlite3_exec create error:%s\n",errmsg);sqlite3_free(errmsg);return -1;}while(1){system("clear");puts("***********************************");puts("***********家庭成员管理系统********");puts("***********1.添加家人信息**********");puts("***********2.删除家人信息**********");puts("***********3.更改家人信息**********");puts("***********4.展示家人信息**********");puts("***********5.查询家人信息**********");puts("***********0.退出程序**************");puts("***********************************");int a=0;scanf("%d",&a);getchar();switch(a){case 1:{do_add(dbfd);}break;case 2:{do_delete(dbfd);}break;case 3:{do_update(dbfd);}break;case 4:{do_show(dbfd);}break;case 5:{do_select(dbfd);}break;case 0:{sqlite3_close(dbfd);exit(EXIT_SUCCESS);}break;default:printf("错误输入,请重新输入\n");break;}printf("按下回车刷新界面\n");while(getchar()!='\n');}return 0;
}

运行结果:

2.牛客网:

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

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

相关文章

在 CentOS 7 上搭建 OpenTenBase 集群:从源码到生产环境的全流程指南

目 录什么是OpenTenBaseOpenTenBase源码编译安装安装依赖创建opentenbase用户源码获取编译安装初始化数据库初始化数据库集群启动与停止服务基本使用示例开机自启动配置总结官网教程链接什么是OpenTenBase OpenTenBase 是一个提供写可靠性&#xff0c;多主节点数据同步的关系数…

LoRaWAN网络部署全流程:从方案设计到实际落地的关键要点

一、覆盖范围&#xff1a;从理论到实践 LoRaWAN的覆盖距离在理论上可达15公里&#xff0c;但实际部署受地形和环境影响极大。 城市环境中&#xff0c;密集的建筑群和多径效应常常使网关有效覆盖半径缩小至3至5公里&#xff1b;在空旷的农村或农田场景中&#xff0c;覆盖范围可提…

portswigger labs XXE漏洞利用实战

lab1 利用外部实体注入获取文件解决此 lab 需要读取到/etc/passwd<!DOCTYPE test [ <!ENTITY cmd SYSTEM "file:///etc/passwd"> ]> <productId>&cmd;</productId>lab2 利用 XXE 执行 SSRF 攻击通过构造 xxe 请求特定的 url 获取目录拼接…

深入理解 hash -r:解决 Linux 命令缓存难题的关键密钥

前言&#xff1a;在 Linux 终端的日常操作中&#xff0c;你是否遇到过这样的诡异场景&#xff1a;明明已经升级或切换了软件版本&#xff08;比如 Node.js 从旧版更新到新版 &#xff09;&#xff0c;但执行命令时&#xff0c;系统却像被“施了魔法”&#xff0c;依旧执着地调用…

onnx入门教程(二)—— PyTorch 转 ONNX 详解

在这一节里&#xff0c;我们将详细介绍 PyTorch 到 ONNX 的转换函数—— torch.onnx.export。我们希望大家能够更加灵活地使用这个模型转换接口&#xff0c;并通过了解它的实现原理来更好地应对该函数的报错&#xff08;由于模型部署的兼容性问题&#xff0c;部署复杂模型时该函…

嵌入式LINUX——————网络TCP

一、TCP连接1.TCP特点&#xff1a;&#xff08;1&#xff09;面向链接&#xff08;2&#xff09;面向字节流&#xff08;3&#xff09;安全可靠的传输协议&#xff0c;因为会先建立连接&#xff08;4&#xff09;占用资源开销大&#xff0c;效率低&#xff0c;实时性不佳&#…

alicloud 阿里云有哪些日志 审计日志

1: 阿里有哪些audit log: Audit Related Logs Below table describe the logs available in Log Service that might be applicable to the Security Operations Team. 2: 怎么来分析呢? Overview Its recommended to built a program with SLS Consumer Group which real…

如何理解AP服务发现协议中“如果某项服务需要被配置为可通过多个不同的网络接口进行访问,则应为每个网络接口使用一个独立的客户端服务实例”?

上一句&#xff1a;[PRS_SOMEIPSD_00238]◎ 「如果某项服务需要在多个网络接口上提供&#xff0c;则应为每个网络接口使用一个独立的服务器服务实例。」(RS_SOMEIPSD_00003) 本句&#xff1a;[PRS_SOMEIPSD_00239] 「如果某项服务需要被配置为可通过多个不同的网络接口进行访问…

piecewise jerk算法介绍

piecewise jerk算法介绍 piecewise jerk算法是百度Apollo中的一种用于路径和速度平滑的算法&#xff0c;该算法假设相邻点之间的jerk为常数&#xff0c;基于该假设将平滑问题构建为二次规划问题&#xff0c;调用osqp求解器求解。参考论文为&#xff1a;Optimal Vehicle Path Pl…

分布式蜜罐系统的部署安装

前阵子勒索病毒泛滥&#xff0c;中小企业由于缺少专业EDR&#xff0c;态势感知&#xff0c;IPS等设备&#xff0c;往往是在勒索事件发生之后才后知后觉&#xff0c;也因为缺乏有效的备份策略&#xff0c;导致数据&#xff0c;经济&#xff0c;商业信誉的丧失&#xff0c;甚至还…

定时器互补PWM输出和死区

定时器互补PWM输出和死区互补PWM&#xff08;Complementary PWM&#xff09;H桥、全桥、半桥中的应用为什么需要死区时间互补PWM&#xff08;Complementary PWM&#xff09; 是一种特殊的 PWM 输出模式&#xff0c;通常用于H桥、全桥或半桥电路的驱动。其核心原理是利用定时器…

嵌入式ARM程序高级调试基础:8.QEMU ARM虚拟机与tftp配置

嵌入式ARM程序高级调试基础:8.QEMU ARM虚拟机与tftp配置 文章目录 嵌入式ARM程序高级调试基础:8.QEMU ARM虚拟机与tftp配置 一.总的网络配置过程 二.主机配置 三.QEMU ARM 网络配置 四.主机与虚拟器之间的网络测试 五.TFTP网络配置 5.1 ubuntu主机安装tftp服务器 5.2 设置tft…

【贪心算法】贪心算法六

贪心算法六 1.坏了的计算器 2.合并区间 3.无重叠区间 4.用最少数量的箭引爆气球 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.坏了的计算器 题目链接: 991. 坏了的计算器 题目分析: 算法原理: 解法一:正向推导 以3转化…

直播预约 | CATIA MODSIM SmartCAE带练营第3期:让每轮设计迭代都快人一步!

▼▼免费报名链接▼▼ 达索系统企业数字化转型在线研讨会https://3ds.tbh5.com/EventDetail.aspx?eid1195&frpt 迅筑官网 ​​

OSI参考模型TCP/IP模型 二三事

计算机网络的学习离不开OSI参考模型&TCP/IP模型对各层功能与任务的了解就是学习的主要内容其二者的区别也是我们应该了解的其中 拥塞控制和流量控制 就是各层功能中 两个易混淆的概念流量控制&#xff08;Flow Control&#xff09;&#xff1a;解决的是发送方和接收方之间速…

DataStream实现WordCount

目录读取文本数据读取端口数据事实上Flink本身是流批统一的处理架构&#xff0c;批量的数据集本质上也是流&#xff0c;没有必要用两套不同的API来实现。所以从Flink 1.12开始&#xff0c;官方推荐的做法是直接使用DataStream API&#xff0c;在提交任务时通过将执行模式设为BA…

imx6ull-驱动开发篇37——Linux MISC 驱动实验

目录 MISC 设备驱动 miscdevice结构体 misc_register 函数 misc_deregister 函数 实验程序编写 修改设备树 驱动程序编写 miscbeep.c miscbeepApp.c Makefile 文件 运行测试 MISC 驱动也叫做杂项驱动&#xff0c;也就是当某些外设无法进行分类的时候就可以使用 MISC…

C# 项目“交互式展厅管理客户端“针对的是“.NETFramework,Version=v4.8”,但此计算机上没有安装它。

C# 项目“交互式展厅管理客户端"针对的是".NETFramework,Versionv4.8”&#xff0c;但此计算机上没有安装它。 解决方法&#xff1a; C# 项目“交互式展厅管理客户端"针对的是".NETFramework,Versionv4.8”&#xff0c;但此计算机上没有安装它。 下载地址…

FFmpeg及 RTSP、RTMP

FFmpeg 是一个功能强大的跨平台开源音视频处理工具集 &#xff0c;集录制、转码、编解码、流媒体传输等功能于一体&#xff0c;被广泛应用于音视频处理、直播、点播等场景。它支持几乎所有主流的音视频格式和协议&#xff0c;是许多媒体软件&#xff08;如 VLC、YouTube、抖音等…

金山办公的服务端开发工程师-25届春招笔试编程题

1.作弊 溪染&#xff1a;六王毕&#xff0c;四海一&#xff1b;蜀山兀&#xff0c;阿房出。覆压三百余里&#xff0c;隔离天日。骊山北构而西折&#xff0c;直走咸阳。二川溶溶&#xff0c;流入宫墙。五步一楼&#xff0c;十步一阁&#xff1b;廊腰缦回&#xff0c;檐牙高啄&am…