登录

在这个站点登录

保存我的登录记录

<<忘记密码?

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

Jerry

学生成绩管理系统-MySQL版-Part4-常用Mysql操作函数库

分享到:

本文已被浏览4077

今天来写一下学生成绩管理系统MySQL版的常用的MySQL操作函数库.这里的函数库并不是MySQL官方提供的API,而是将最基本的一些API函数进行二次封装,写一些本程序特有的函数,从而能够更好的运用MySQL提供的API函数。

我们先来确定一下MySQL数据库中的数据表的结构。本系统计划做成不限班级,不限人数,不限科目数的一个系统,并且自动计算总分和平均分,提供查找功能。对于数据表的名称,计划使用`scm_class_班级名称`的方式进行命名,这样能够区分用户组数据表`scm_users`和开关值数据表`scm_options`(事后证明此表无用)。对于每一个数据表,决定一个ID做主键,学号和姓名以及其他各科成绩均占一列,从而储存所有信息。

在这个函数库中,一共有7个函数,分别为:

  1. 获取MySQL错误信息
  2. 删除表
  3. 连接数据库
  4. 根据索引获取数据表
  5. 将数据表打印至屏幕
  6. 根据索引获取数据表的某个列头
  7. 重新计算全表总分平均分

接下来就直接看代码咯~~

#include <windows.h>
#include <mysql.h>
#include <conio.h>
#include <stdio.h>
extern MYSQL mysql;
extern MYSQL_RES *result;
extern MYSQL_ROW row;
extern MYSQL_FIELD *field;

extern char Host[15];
extern char Port[8];
extern char Username[10];
extern char Password[20];
extern char DB[10];
//上面的是一些头文件,并把主干文件中声明的一些变量继承过来

//用到了一些其他的函数,一并声明过来
void ChangeWindowTitle(const char *title);
void ChangeWindowSize(int width,int Height);
void Pause(int mode);
void JR_SetColor(int textcolor,int bgcolor);
//这个是用来根据MySQL错误码来显示错误信息,表示没什么卵用
int SolveMysqlProblem() {
    printf("请求MySQL数据时出现严重错误导致程序终止,错误信息:");
	switch(mysql_errno(&mysql)) {
		case 1005:
			printf("创建表失败n");
			break;
		case 1006:
			printf("创建数据库失败n");
			break;
		case 1007:
			printf("数据库已存在,创建数据库失败n");
			break;
		case 1008:
			printf("数据库不存在,删除数据库失败n");
			break;
		case 1009:
			printf("不能删除数据库文件导致删除数据库失败n");
			break;
		case 1010:
			printf("不能删除数据目录导致删除数据库失败n");
			break;
		case 1011:
			printf("删除数据库文件失败n");
			break;
		case 1012:
			printf("不能读取系统表中的记录n");
			break;
		case 1016:
			printf("无法打开文件n");
			break;
		case 1020:
			printf("记录已被其他用户修改n");
			break;
		case 1021:
			printf("硬盘剩余空间不足,请加大硬盘可用空间n");
			break;
		case 1022:
			printf("关键字重复,更改记录失败n");
			break;
		case 1023:
			printf("关闭时发生错误n");
			break;
		case 1024:
			printf("读文件错误n");
			break;
		case 1025:
			printf("更改名字时发生错误n");
			break;
		case 1026:
			printf("写文件错误n");
			break;
		case 1032:
			printf("记录不存在n");
			break;
		case 1036:
			printf("数据表是只读的,不能对它进行修改n");
			break;
		case 1037:
			printf("系统内存不足,请重启数据库或重启服务器n");
			break;
		case 1038:
			printf("用于排序的内存不足,请增大排序缓冲区n");
			break;
		case 1040:
			printf("已到达数据库的最大连接数,请加大数据库可用连接数n");
			break;
		case 1041:
			printf("系统内存不足n");
			break;
		case 1042:
			printf("无效的主机名n");
			break;
		case 1043:
			printf("无效连接n");
			break;
		case 1044:
			printf("当前用户没有访问数据库的权限n");
			break;
		case 1045:
			printf("不能连接数据库,用户名或密码错误n");
			break;
		case 1048:
			printf("字段不能为空n");
			break;
		case 1049:
			printf("数据库不存在n");
			break;
		case 1050:
			printf("数据表已存在n");
			break;
		case 1051:
			printf("数据表不存在n");
			break;
		case 1054:
			printf("字段不存在n");
			break;
		case 1065:
			printf("无效的SQL语句,SQL语句为空n");
			break;
		case 1081:
			printf("不能建立Socket连接n");
			break;
		case 1114:
			printf("数据表已满,不能容纳任何记录n");
			break;
		case 1116:
			printf("打开的数据表太多n");
			break;
		case 1129:
			printf("数据库出现异常,请重启数据库n");
			break;
		case 1130:
			printf("连接数据库失败,没有连接数据库的权限n");
			break;
		case 1133:
			printf("数据库用户不存在n");
			break;
		case 1141:
			printf("当前用户无权访问数据库n");
			break;
		case 1142:
			printf("当前用户无权访问数据表n");
			break;
		case 1143:
			printf("当前用户无权访问数据表中的字段n");
			break;
		case 1146:
			printf("数据表不存在n");
			break;
		case 1147:
			printf("未定义用户对数据表的访问权限n");
			break;
		case 1149:
			printf("SQL语句语法错误n");
			break;
		case 1158:
			printf("网络错误,出现读错误,请检查网络连接状况n");
			break;
		case 1159:
			printf("网络错误,读超时,请检查网络连接状况n");
			break;
		case 1160:
			printf("网络错误,出现写错误,请检查网络连接状况n");
			break;
		case 1161:
			printf("网络错误,写超时,请检查网络连接状况n");
			break;
		case 1062:
			printf("字段值重复,入库失败n");
			break;
        default:
            printf("未知错误n");
            break;
	}
	//上面这些错误信息直接去网上就能搜到
	printf("MySQL错误信息:n%sn",mysql_error(&mysql));
	printf("请解决后再试!");
	Pause(1);
	return mysql_errno(&mysql);
}
//删数据表
int Drop_Table(const char *table) {
	char sql[100];
	//首先声明一个用来存储SQL语句的变量
	memset(sql,0,100);
	//构建SQL语句
	sprintf(sql,"DROP TABLE IF EXISTS %s",table);
	//判断一下是否删除成功
	if(!mysql_query(&mysql,sql)) {
		return 1;
	} else {
		return 0;
	}
}
//连接数据库
int Connect_DB(int debug) {
	//初始化数据库连接
	mysql_init(&mysql);
	if(debug==1) {
		//debug参数用来识别是否为安装过程的验证参数阶段,因为验证阶段结束后会直接关掉连接
		//亦或是验证配置文件阶段
		if(mysql_real_connect(&mysql,Host,Username,Password,NULL,atoi(Port),NULL,0)) {
			mysql_close(&mysql);
			return 1;
		} else {
		    SolveMysqlProblem();
			return 0;
		}
	} else if(debug==2) {
		mysql_real_connect(&mysql,Host,Username,Password,NULL,atoi(Port),NULL,0);
		return 0;
	}
	//这里才是正经连接
	if(mysql_real_connect(&mysql,Host,Username,Password,DB,0,NULL,0)) {
		//设置一下编码格式,否则乱码很难受的
		mysql_query(&mysql,"SET NAMES GBK");
		return 1;
	} else {
		return 0;
	}
}
//获取成绩单
int Get_Score_Table(int Index,char *str){
	//Index是索引,str是传出数据使用的指针
	//声明变量做枚举变量和用语存储数据库操作语句的变量
    char sql[100];
    int i;
	//构建语句
    sprintf(sql,"show tables like 'scm_class_%%'");
	//执行查询
    mysql_query(&mysql,sql);
	//获取结果
    result=mysql_store_result(&mysql);
	//枚举获取指定位置的内容
    for(i=0;i<Index;i++){
        row=mysql_fetch_row(result);
    }
	//将数据传出
    strcpy(str,row[0]);
    return 0;
}
//打印表格数据
//tablename是上个函数获取到的名称
//title是显示在窗口标题栏的内容
//sqlplus是额外的sql语句,用于规定升降序规则
int Show_Table(const char *tablename,const char *title,const char *sqlplus){
    char sql[100],titleadd[20];
    int i;
	//同样的构建语句并执行
    sprintf(sql,"Select * From %s %s",tablename,sqlplus);
    mysql_query(&mysql,sql);
	//解析数据
    result=mysql_store_result(&mysql);
	//生成标题栏内容,并对其更改
    sprintf(titleadd,"%s-找到%d条",title,(int)mysql_num_rows(result));
    ChangeWindowTitle(titleadd);
	//这个是用来根据获取到的数据量进行窗口大小调节
    ChangeWindowSize(mysql_num_fields(result)*8+1,mysql_num_rows(result)+5);
	//获取表头
    field=mysql_fetch_field(result);
    JR_SetColor(10,1);
	//打印表头
    for(i=1;i<mysql_num_fields(result);i++){
        field=mysql_fetch_field(result);
        printf("%st",field->name);
    }
    JR_SetColor(15,1);
    printf("n");
	//打印数据
    while((row=mysql_fetch_row(result))){
        for(i=1;i<mysql_num_fields(result);i++){
            printf("%st",row[i]);
        }
        printf("n");
    }
    return 0;
}
//获取表头,同上
int Get_Table_Field(const char *table,int Index,char *Fieldname){
    char sql[100];
    int i;
    if(Index<0){
        return 0;
    }
    sprintf(sql,"SELECT * From %s",table);
    mysql_query(&mysql,sql);
    result=mysql_store_result(&mysql);
    for(i=0;i<Index;i++){
        field=mysql_fetch_field(result);
    }
    strcpy(Fieldname,field->name);
    return 0;
}
//重新计算某行总分及平均分
int ReCalculate(const char *tablename,int id){
    char sql[100];
    int i;
    double sum=0;
    sprintf(sql,"SELECT * From %s WHERE ID=%d",tablename,id);
    mysql_query(&mysql,sql);
    result=mysql_store_result(&mysql);
    row=mysql_fetch_row(result);
    for(i=3;i<mysql_num_fields(result)-2;i++){
		//这里需要注意,row获取来的是字符串类型,需要转换一下类型至浮点型才能进行运算
        sum+=atof(row[i]);
    }
    sprintf(sql,"UPDATE %s SET 总分=%.2lf,平均分=%.2lf WHERE id=%d;",tablename,sum,sum/(mysql_num_fields(result)-5),id);
    mysql_query(&mysql,sql);
    return 0;
}

这就是本程序用到的所有MySQL扩展函数。

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

评论

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