网络编程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;
}
相关文章:
网络编程9.10
使用数据库完成工人管理系统: ubuntuubuntu:DB$ ubuntuubuntu: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;pri…...
如何在SQL Server中恢复多个数据库?
一次性恢复多个 SQL数据库吗可以吗? "是的,可以一次性恢复多个 SQL 数据库。通常情况下,只要备份文件的名称与相应的数据库匹配,且没有附加的日期或时间信息,就可以通过有效的 T-SQL 脚本来完成恢复。如果你希望…...
炸裂!新版 SD WebUI Forge 出图速度更快!支持最新Flux 模型!(保姆级安装教程)
大家是不是经常为SD WebUI卡顿、爆显存而苦恼?一启动SD 电脑就开始发烫, 尤其低显存用户屡屡"中招",不得不一遍遍重启。作为AI绘画的必备工具,WebUI却还有这么多"坑",着实让人不爽!😠 好消息是,…...
laserOdometry.cpp源码注释
本博客用于a-loam源码学习,用于和slam初学者一起学习。 #include <cmath>#include <nav_msgs/Odometry.h>#include <nav_msgs/Path.h> //这两行代码是C中包含头文件的指令,它们用于在ROS(Robot Operating System…...
STM32时钟配置图详解
一图概述: 左侧输入时钟源 Input Frequency (LSE/LSI/HSI/HSE) LSE (Low-Speed External):外部32.768 kHz晶体振荡器,通常用于RTC(实时时钟)。LSI (Low-Speed Internal):内部低速时钟,频率为…...
Vscode——调试时,修改变量值
第一步:点击变量,鼠标右键 第二步:点击 设置值...
1. 初识LLM API:环境配置与多轮对话演示
其实AI应用并不是一个什么很高大上的东西,你可以将它当作一个文字的“调库”行为,“调库”只需要知道库名就行了,这里实际也是如此。甚至你只需要知道你想问什么,将你的消息作为输入,就能从大模型得到输出。而这个“库…...
【AI编程助手】VsCode插件--通义灵码
目录 摘要 一、插件安装 二、“通义灵码” 使用 三、官网教程 四、总结 五、参考信息 摘要 通义灵码是一款强大的 AI 编程助手。它能够理解编程相关的复杂逻辑,为开发者提供高效、准确的代码生成与优化建议。在编程过程中,它可以辅助处理各种任务&…...
9月10号的学习
//界面1 头文件 signals://界面1的自定义信号void my_signal(); private slots:void on_pushButton_2_clicked();void on_pushButton_clicked(); //界面1 .cpp文件 void Widget::on_pushButton_2_clicked() {QMessageBox msg(QMessageBox::Warning,"警告","是否…...
QtC++截图支持窗口获取
介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口…...
料品档案没有配置主供应商信息
这个问题经常会出现在普通用户的面前。没有合适的工程人员去打理料品档案。信息是缺漏的。用友给出来的提示,也让人摸不着头脑。只能是记下来备用吧。...
springboot属性加载优先级和常见命令行属性
属性加载优先级: 1.SpringApplication:启动的main方法里注入的属性 2.PropertySource:通过注解 加载的数据配置文件 3.Config data file:application.yml/.properties 4.OS environment variable:环境变量 5.Command l…...
Math Reference Notes: 因式定理
文章目录 1. 因式定理的定义2. 因式定理的数学表达:3. 因式定理的推导4. 因式定理的含义5. 因式定理的应用6. 因式定理与余式定理的关系7. 因式定理的应用领域8.因式定理的局限性 因式定理是多项式代数中的一个重要工具,帮助我们通过多项式的根来因式分解…...
Kubernetes------Service
目录 一、属性说明 二、定义和基本配置 1、定义 2、创建Service 2.1、typeClusterIP 2.2、typeNodePort 2.3、固定IP访问 三、Service、EndPoint、Pod之间的关系 四、服务发现 1、基于Service中IP访问外部服务 2、基于Service中域名访问外部服务 五、Ingress的安装和使…...
C#的LINQ语句
在 C# 中,LINQ(Language Integrated Query)是一种强大的查询技术,它允许你使用熟悉的 C# 语法来查询数据集合。LINQ 可以用于查询各种数据源,包括数组、列表、数据集、SQL数据库等。 以下是一些基本的 LINQ 语句示例&…...
项目实战系列三: 家居购项目 第三部分
文章目录 🍃后台分页🍅后台分页导航 🍃首页分页🍅首页分页导航🍅首页搜索🍅两个奇怪的问题🍅会员显示登录名🍅注销登录🍅验证码 🍃后台分页 程序框架图 1.…...
【WPF】Border的使用
在 WPF 中,Border 控件是一个非常实用的容器控件,它可以用来为其他控件添加边框、背景颜色、边距等样式。Border 本身没有内置的行为,但是它可以包含一个子元素,并且可以通过各种属性来自定义外观。 Border基本属性 Child: 表示…...
机器学习(西瓜书)第 4 章 决策树
4.1 决策树基本流程 决策树模型 基本流程 在第⑵种情形下,我们把当前结点标记为叶结点,并将其类别设定为该结点所含样本最多的类别;在第⑶种情形下,同样把当前结点标记为叶结点,但将其类别设定为其父结点所含样本最多…...
8、值、指针、引用作为参数或返回值
一、作为参数 1、值传递 #include <iostream> using namespace std;void swap(int a, int b) {cout << __FUNCTION__ << "交换前a:" << a << " b:" << b << endl;int tmp a;a b;b tmp;cout << __FUN…...
向量——通俗地解释
1. 向量 向量是一个既有大小(模)又有方向的对象,它可以用来描述空间中的位置、力或速度等量。我们可以从物理、数学和计算机的角度来看待向量,这三种观点看似不同却有关联。 (1)在物理专业视角下,向量是空间中的箭头&a…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
