学生成绩管理系统-MySQL版-Part9-修改数据
本文已被浏览5773次
对于数据库来说,总体共有添删查改四项,现在已经有了两项添加和查找,而删除和修改还没有,这次先搞下修改的功能。(删除对于学生成绩管理系统则并没有什么卵用,所以也就省了。)
修改的话对于修改成绩信息来说虽然有些危险,可能导致数据被篡改,但是还是留下了这个功能。
Update是SQL中的修改语句,最基本的语法是
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
从整体看,这个部分分为四个部分:
1、重新确认是否要修改数据
这一部分并不需要很复杂,一个输入,一个判断即可
2、获取修改的目标条目
这里并不考虑要全部读取数据,如果全部列举数据,存在影响UI体验的因素,故没有列举数据,而是采用了搜索的方式。
3、获取修改后数据
修改后的数据是指修改那科(或者学号)修改成具体值。
4、执行查询
最后上代码:
//引入头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <windows.h>
#include <mysql.h>
#include <conio.h>
//继承变量
extern MYSQL mysql;
extern MYSQL_RES *result;
extern MYSQL_ROW row;
extern MYSQL_FIELD *field;
//没有什么卵用的几个变量
char Host[15];
char Port[8];
char Username[10];
char Password[20];
char DB[10];
//函数原型列表
int LoadSettings();
int Install(int mode);
int Connect_DB();
void ChangeColorScreen(const char* color);
void ChangeWindowSize(int Width,int Height);
void Pause(int mode);
void CS();
void Login();
void Exit();
void ChangeWindowSize(int Width,int Height);
void ChangeWindowTitle(const char* title);
void strrpl(char* pDstOut, char* pSrcIn, const char* pSrcRpl, const char* pDstRpl);
int Sum_ints(int number);
int Change_Score_Confirm();
int Change_Score_Menu();
int Change_Score_Update(int Target);
int Get_Score_Table(int Index,char *str);
int Show_Table(const char *tablename,const char *title,const char *sqlplus);
int ReCalculate(const char *tablename,int id);
//功能入口主函数
int Change_Score() {
//最后确认要改成绩
if(!Change_Score_Confirm()) {
return 0;
}
ChangeColorScreen("1f");
//进入功能菜单
Change_Score_Menu();
return 0;
}
//打印确认信息
int Change_Score_Confirm() {
int select;
CSC:
CS();
ChangeWindowTitle("警告!");
ChangeColorScreen("cf");
ChangeWindowSize(63,13);
printf("╔═════════════════════════════╗n");
printf("║ 学生成绩管理系统 ║n");
printf("║ 基于MySQL ║n");
printf("╟─────────────────────────────╢n");
printf("║ 警告:如果您不是成绩管理人员,请自觉按N! ║n");
printf("║ 本操作不可撤销,故请再次斟酌后选择是否进行此操作! ║n");
printf("║ [Y]是 [N]否 ║n");
printf("╟─────────────────────────────╢n");
printf("║ JerrySoft Copyright. ║n");
printf("╚═════════════════════════════╝n");
printf("[Y/N]");
fflush(stdin);
select=getch();
switch(select) {
case 'Y':
case 'y':
return 1;
case 'N':
case 'n':
return 0;
default:
printf("");
goto CSC;
}
}
//主菜单
int Change_Score_Menu() {
char sql[100],temp[100],select[10];
int lines,item=1,i;
ChangeWindowTitle("更改成绩");
//获取所有的成绩数据表
sprintf(sql,"Show Tables like 'scm_class_%%'");
mysql_query(&mysql,sql);
result=mysql_store_result(&mysql);
lines=mysql_num_rows(result);
ChangeWindowSize(40,lines+14);
//打印列表
printf("╔═════════════════╗n");
printf("║ 学生成绩管理系统 ║n");
printf("║ 更改成绩单 ║n");
printf("╟─────────────────╢n");
//判断是否存在可修改的成绩单
if(lines==0) {
printf("║ 当前数据库中没有可用成绩单! ║n");
printf("║ 按任意键返回主菜单! ║n");
printf("╟─────────────────╢n");
printf("║ JerrySoft Copyright. ║n");
printf("╚═════════════════╝n>");
Pause(0);
return 0;
}
printf("║ 请选择希望更改的成绩单: ║n");
while((row=mysql_fetch_row(result))) {
strrpl(temp,row[0],"scm_class_","");
printf("║ [%d] %s",item,temp);
for(i=strlen(temp)+Sum_ints(item)-1; i<28; i++) {
printf(" ");
}
printf("║n");
item++;
}
printf("╟─────────────────╢n");
printf("║ [B] 返回上级菜单 ║n");
printf("╟─────────────────╢n");
printf("║ JerrySoft Copyright. ║n");
printf("╚═════════════════╝n>");
fflush(stdin);
gets(select);
//如果用户选定数据表,进入更改函数
if(atoi(select)>0&&atoi(select)<item) {
Change_Score_Update(atoi(select));
} else if(strcasecmp(select,"B")==0) {
return 0;
} else {
printf("请输入有效数据!");
Sleep(1000);
}
Change_Score_Menu();
return 0;
}
//执行修改成绩
int Change_Score_Update(int Target) {
int i,j,peosum;
char sql[100],TableName[20];
char ClassName[10],Input[30];
char Fields[100][20];
Get_Score_Table(Target,TableName);
strrpl(ClassName,TableName,"scm_class_","");
sprintf(sql,"SELECT * From %s",TableName);
mysql_query(&mysql,sql);
result=mysql_store_result(&mysql);
//判断选定的成绩单是否存在数据
if(mysql_num_rows(result)==0) {
CS();
printf("%s的成绩单中不包含任何数据,请导入数据后再试!n",ClassName);
Sleep(1000);
return 0;
}
peosum=mysql_num_rows(result);
CS_U:
CS();
ChangeWindowSize(63,13);
printf("╔═════════════════════════════╗n");
printf("║ 学生成绩管理系统 ║n");
printf("║ 基于MySQL ║n");
printf("╟─────────────────────────────╢n");
printf("║ 当前在%s中共计有%d个同学:",ClassName,peosum);
for(i=0; i<41-strlen(ClassName)*2-Sum_ints(peosum); i++) {
printf(" ");
}
printf("║n");
printf("║ 请输入需要修改的同学姓名: ║n"
"║ 如需查看成绩单请输入Show,返回上层菜单请输入Back ║n");
printf("╟─────────────────────────────╢n");
printf("║ JerrySoft Copyright. ║n");
printf("╚═════════════════════════════╝n>");
fflush(stdin);
//提示选择姓名
scanf("%s",Input);
if(strcasecmp(Input,"Show")==0) {
Show_Table(TableName,"修改成绩-查看成绩单","");
Pause(1);
goto CS_U;
} else if(strcasecmp(Input,"Back")==0) {
return 0;
}
sprintf(sql,"SELECT * FROM %s WHERE 姓名='%s'",TableName,Input);
mysql_query(&mysql,sql);
result=mysql_store_result(&mysql);
//检查是否存在名为Input的同学
if(mysql_num_rows(result)==0) {
ChangeWindowSize(63,10);
printf("╔═════════════════════════════╗n");
printf("║ 学生成绩管理系统 ║n");
printf("║ 基于MySQL ║n");
printf("╟─────────────────────────────╢n");
printf("║ 您输入的姓名无效: ║n");
printf("║ 在班级%s中没有名为%s的同学!",ClassName,Input);
for(i=0; i<41-strlen(ClassName)*2-strlen(Input)*2; i++) {
printf(" ");
}
printf("║n");
printf("╟─────────────────────────────╢n");
printf("║ JerrySoft Copyright. ║n");
printf("╚═════════════════════════════╝n");
Sleep(1000);
goto CS_U;
}
//存在后询问修改的字段和修改后的值
ChangeWindowSize(63,9+mysql_num_fields(result));
CS();
printf("╔═════════════════════════════╗n");
printf("║ 学生成绩管理系统 ║n");
printf("║ 基于MySQL ║n");
printf("╟─────────────────────────────╢n");
printf("║ 请输入需要修改的内容: ║n");
row=mysql_fetch_row(result);
field=mysql_fetch_field(result);
field=mysql_fetch_field(result);
printf("║ [1] %s:%s",field->name,row[1]);
strcpy(Fields[1],field->name);
for(j=0; j<60-(field->name_length)*2-strlen(row[1])*2; j++) {
printf(" ");
}
printf("║n");
field=mysql_fetch_field(result);
for(i=3; i<mysql_num_fields(result); i++) {
field=mysql_fetch_field(result);
if(i>2&&i<mysql_num_fields(result)-2) {
peosum=i-1;
strcpy(Fields[i-1],field->name);
printf("║ [%d] %s:%s",i-1,field->name,row[i]);
for(j=0; j<59-Sum_ints(i-1)-field->name_length*2-strlen(row[i])*2; j++) {
printf(" ");
}
printf("║n");
}
}
printf("╟─────────────────────────────╢n");
printf("║ 例如:如果您希望将学号改为1000请输入[1]1000([序号]修改后 ║n");
printf("║ 的成绩) ║n");
printf("╟─────────────────────────────╢n");
printf("║ JerrySoft Copyright. ║n");
printf("╚═════════════════════════════╝n[int]str>");
strcpy(Input,"");
CS_SF:
fflush(stdin);
//根据提示[序号]修改值获取值
scanf("[%d]%s",&i,Input);
//判断值的内容格式
if(i<0||i>peosum||strlen(Input)==0) {
printf("您输入的信息有误!n");
Sleep(1000);
goto CS_SF;
}
//构建mysql查询语句并执行
sprintf(sql,"UPDATE %s SET %s=%s WHERE ID=%s",TableName,Fields[i],Input,row[0]);
if(!mysql_query(&mysql,sql)) {
printf("更改成功!n");
//在更改完数据后一定要重新计算总分/平均分
ReCalculate(TableName,atoi(row[0]));
Sleep(1000);
} else {
printf("更改失败!n可能是由于您输入的数据类型有误,请重试!n");
Sleep(1000);
}
return 0;
}
评论
您需要 先登录 才可以回复.