学生成绩管理系统-MySQL版-Part4-常用Mysql操作函数库
本文已被浏览4297次
今天来写一下学生成绩管理系统MySQL版的常用的MySQL操作函数库.这里的函数库并不是MySQL官方提供的API,而是将最基本的一些API函数进行二次封装,写一些本程序特有的函数,从而能够更好的运用MySQL提供的API函数。
我们先来确定一下MySQL数据库中的数据表的结构。本系统计划做成不限班级,不限人数,不限科目数的一个系统,并且自动计算总分和平均分,提供查找功能。对于数据表的名称,计划使用`scm_class_班级名称`的方式进行命名,这样能够区分用户组数据表`scm_users`和开关值数据表`scm_options`(事后证明此表无用)。对于每一个数据表,决定一个ID做主键,学号和姓名以及其他各科成绩均占一列,从而储存所有信息。
在这个函数库中,一共有7个函数,分别为:
- 获取MySQL错误信息
- 删除表
- 连接数据库
- 根据索引获取数据表
- 将数据表打印至屏幕
- 根据索引获取数据表的某个列头
- 重新计算全表总分平均分
接下来就直接看代码咯~~
#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扩展函数。
评论
您需要 先登录 才可以回复.