登录

在这个站点登录

保存我的登录记录

<<忘记密码?

还没有账号?点此注册>>

Jerry

学生成绩管理系统-MySQL版-Part9-修改数据

分享到:

本文已被浏览4940

对于数据库来说,总体共有添删查改四项,现在已经有了两项添加和查找,而删除和修改还没有,这次先搞下修改的功能。(删除对于学生成绩管理系统则并没有什么卵用,所以也就省了。)

修改的话对于修改成绩信息来说虽然有些危险,可能导致数据被篡改,但是还是留下了这个功能。

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;
}
 手机扫描左边的二维码,立刻将文章收入手机!
 微信扫描左边二维码,点击右上角即可分享到朋友圈!
严禁任何非授权的采集与转载,转载须经站长同意并在文章显著位置标注本文连接,站长保留追究法律责任的权利.

评论

 您需要 先登录 才可以回复.