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

网络编程9.10

使用数据库完成工人管理系统:

ubuntu@ubuntu:DB$ 
ubuntu@ubuntu:DB$ cat 2.c
#include <myhead.h>
#include <sqlite3.h>
#include <string.h>typedef struct
{int id;char name[20];double salary;
} Worker;int do_insert(sqlite3 *ppDb)
{Worker work;printf("请输入工号:");scanf("%d", &work.id);getchar(); // 清除缓冲区printf("请输入姓名:");fgets(work.name, sizeof(work.name), stdin);work.name[strcspn(work.name, "\n")] = 0; // 移除换行符printf("请输入薪水:");scanf("%lf", &work.salary);char *errmsg = NULL;char sqlite[200];snprintf(sqlite, sizeof(sqlite), "INSERT INTO Work VALUES(%d, '%s', %lf);",work.id, work.name, work.salary);if(sqlite3_exec(ppDb, sqlite, NULL, NULL, &errmsg) != SQLITE_OK){printf("错误码:%d 错误信息:%s, 出错行是:%d\n",sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb), __LINE__);printf("错误信息:%s\n", errmsg);sqlite3_free(errmsg);return -1;}printf("添加工人信息成功\n");return 0;
}int do_delete(sqlite3 *ppDb)
{char name[20];printf("请输入要删除工人的姓名:");fgets(name, sizeof(name), stdin);name[strcspn(name, "\n")] = 0; // 移除换行符char *errmsg = NULL;char sqlite[200];snprintf(sqlite, sizeof(sqlite), "DELETE FROM Work WHERE name='%s';", name);if(sqlite3_exec(ppDb, sqlite, NULL, NULL, &errmsg) != SQLITE_OK){printf("错误码:%d 错误信息:%s, 出错行是:%d\n",sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb), __LINE__);printf("错误信息:%s\n", errmsg);sqlite3_free(errmsg);return -1;}printf("删除工人信息成功\n");return 0;
}int do_update(sqlite3 *ppDb)
{char name[20];double new_salary;printf("请输入要修改工人的姓名:");fgets(name, sizeof(name), stdin);name[strcspn(name, "\n")] = 0; // 移除换行符printf("请输入新的薪水:");scanf("%lf", &new_salary);getchar(); // 清除缓冲区char *errmsg = NULL;char sqlite[200];snprintf(sqlite, sizeof(sqlite), "UPDATE Work SET salary=%lf WHERE name='%s';", new_salary, name);if(sqlite3_exec(ppDb, sqlite, NULL, NULL, &errmsg) != SQLITE_OK){printf("错误码:%d 错误信息:%s, 出错行是:%d\n",sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb), __LINE__);printf("错误信息:%s\n", errmsg);sqlite3_free(errmsg);return -1;}printf("修改工人信息成功\n");return 0;
}int callback(void *arg, int n, char **msgtext, char **msgtable)
{int i;for(i = 0; i < n; i++){printf("%s\t", msgtable[i]);}putchar(10);for(i = 0; i < n; i++){printf("%s\t", msgtext[i] ? msgtext[i] : "NULL");}putchar(10);return 0;
}int do_seek(sqlite3 *ppDb)
{char key[20];printf("请输入你要查找的工人姓名:");fgets(key, sizeof(key), stdin);key[strcspn(key, "\n")] = 0; // 移除换行符char *errmsg = NULL;char sqlite[200];snprintf(sqlite, sizeof(sqlite), "SELECT * FROM Work WHERE name='%s';", key);if(sqlite3_exec(ppDb, sqlite, callback, NULL, &errmsg) != SQLITE_OK){printf("错误码:%d 错误信息:%s, 出错行是:%d\n",sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb), __LINE__);printf("错误信息:%s\n", errmsg);sqlite3_free(errmsg);return -1;}return 0;
}int show_all(void *arg, int n, char **msgtext, char **msgtable)
{static int row = 0;int i;if (row == 0) {for(i = 0; i < n; i++){printf("%s\t", msgtable[i]);}printf("\n");}for(i = 0; i < n; i++){printf("%s\t", msgtext[i] ? msgtext[i] : "NULL");}printf("\n");row++;return 0;
}int do_showall(sqlite3 *ppDb)
{char *errmsg = NULL;const char *sqlite = "SELECT * FROM Work;";if(sqlite3_exec(ppDb, sqlite, show_all, NULL, &errmsg) != SQLITE_OK){printf("错误码:%d 错误信息:%s, 出错行是:%d\n",sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb), __LINE__);printf("错误信息:%s\n", errmsg);sqlite3_free(errmsg);return -1;}return 0;
}void menu(sqlite3 *ppDb)
{int n;printf("\n\t\t\t*********肖申克的救赎*********\n");printf("\t\t\t1、插入一个工人信息\n");printf("\t\t\t2、删除一个工人信息\n");printf("\t\t\t3、修改一个工人信息\n");printf("\t\t\t4、查找一个工人信息\n");printf("\t\t\t5、输出所有工人信息\n");printf("\t\t\t0、退出\n");printf("请输入你的选择:");scanf("%d", &n);getchar(); // 清除缓冲区switch(n){case 1:do_insert(ppDb);break;case 2:do_delete(ppDb);break;case 3:do_update(ppDb);break;case 4:do_seek(ppDb);break;case 5:do_showall(ppDb);break;case 0:exit(0);default:printf("输入有误,请重新输入\n");}
}int main(int argc, const char *argv[])
{sqlite3 *ppDb;if(sqlite3_open("./hhh.db", &ppDb) != SQLITE_OK){printf("错误码:%d 错误信息:%s, 出错行是:%d\n",sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb), __LINE__);return -1;}printf("数据库打开成功\n");char *errmsg = NULL;const char *sqlite = "CREATE TABLE IF NOT EXISTS Work(id INT, name TEXT, salary REAL);";if(sqlite3_exec(ppDb, sqlite, NULL, NULL, &errmsg) != SQLITE_OK){printf("错误码:%d 错误信息:%s, 出错行是:%d\n",sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb), __LINE__);printf("错误信息:%s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(ppDb);return -1;}while(1){menu(ppDb);}sqlite3_close(ppDb);printf("数据库关闭成功\n");return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 爆改YOLOv8|利用yolov9的ADown改进卷积Conv-轻量化
  • 速盾:高防 cdn 分布式防御攻击?
  • JVM合集
  • 【AI学习】AI科普:专有名词介绍
  • C程序设计(7.0安徽专升本函数)
  • uniapp 小程序样式兼容
  • 小型公司机房运维如何管理
  • 测试人员必备的linux命令(已分组)
  • Windows系统离线安装使用pm2 管理进程
  • Qt5.4.1连接odbc驱动操作达梦数据库
  • 动态规划的解题思想
  • 【C++】vector和list的区别
  • 004——双向链表和循环链表
  • 慎投!又一单位发布2024年高中风险预警期刊名单
  • Python | Leetcode Python题解之第389题找不同
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • canvas绘制圆角头像
  • Git初体验
  • Java程序员幽默爆笑锦集
  • Redis中的lru算法实现
  • text-decoration与color属性
  • vue 个人积累(使用工具,组件)
  • 从0到1:PostCSS 插件开发最佳实践
  • 给第三方使用接口的 URL 签名实现
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 详解NodeJs流之一
  • 延迟脚本的方式
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Nginx实现动静分离
  • zabbix3.2监控linux磁盘IO
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #AngularJS#$sce.trustAsResourceUrl
  • (16)Reactor的测试——响应式Spring的道法术器
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (LeetCode 49)Anagrams
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (七)理解angular中的module和injector,即依赖注入
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net Stream篇(六)
  • .Net 垃圾回收机制原理(二)
  • .NET成年了,然后呢?
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • 。。。。。
  • ?php echo ?,?php echo Hello world!;?
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @Transactional 竟也能解决分布式事务?
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现