学生成绩管理系统-MySQL版-Part4-常用Mysql操作函数库
本文已被浏览4584次
今天来写一下学生成绩管理系统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扩展函数。
评论
您需要 先登录 才可以回复.