当前位置: 首页 > news >正文

嵌入式开发学习———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.lryc.cn/news/626726.html

相关文章:

  • 04-认证授权服务开发指南
  • 读《精益数据分析》:规模化(Scale)—— 复制成功,进军新市场
  • Kafka如何保证消费确认与顺序消费?
  • Python爬虫实战:研究dark-fantasy,构建奇幻文学数据采集分析系统
  • GitHub宕机生存指南:从应急协作到高可用架构设计
  • BM25 vs TF-IDF:经典文本检索方法的对比
  • 《算法导论》第 34 章 - NP 完全性
  • RK Android14 新建分区恢复出厂设置分区数据不擦除及开机动画自定义(二)
  • 细说数仓中不同类型的维度
  • 哈希:字母异位词分组
  • Linux系统:C语言进程间通信信号(Signal)
  • 动态规划----6.单词拆分
  • Java 大视界 -- Java 大数据在智能医疗远程会诊数据管理与协同诊断优化中的应用(402)
  • C++---向下取整(>>)与向零取整(/)
  • WPF Alert弹框控件 - 完全使用指南
  • 【力扣 买卖股票的最佳时机 Java/Python】
  • 【Unity3D优化】平衡 Hide 与 Destroy:基于性能等级与 LRU 的 UI 管理策略与实践思考
  • 大数据毕业设计选题推荐-基于Hadoop的电信客服数据处理与分析系统-Spark-HDFS-Pandas
  • 计算机网络模型
  • 华为数通认证学习
  • CSS 定位的核心属性:position
  • SPSS数据文件的建立与管理
  • JAVA中向量数据库(Milvus)怎么配合大模型使用
  • 案例分享:BRAV-7123助力家用型人形机器人,智能生活未来已来
  • vscode连接docker
  • Linux 文本处理与 Shell 编程笔记:正则表达式、sed、awk 与变量脚本
  • React-native之组件
  • 51单片机-驱动LED点阵模块教程
  • Gitee仓库 日常操作详细步骤
  • 【笔记】动手学Ollama 第五章 Ollama 在 LangChain 中的使用 - Python 集成