Mysql数据库简易学生管理系统

#include <winsock.h>
#include <mysql.h>
#pragma comment(lib,"libmySQL.lib")  //要加不然会编译出错
#include "stdio.h"
#include "string.h"
#include<iostream>
using namespace std;


struct conn_info {
	char *host;
	char *user;
	char *password;
	char *db;
};

struct student
{
	char name[10];
	char nu[10];
	struct student *next;
};

class Mysql
{
public:
/********************************连接数据库*****************************************************/
	MYSQL* mysql_connect(conn_info con){
		MYSQL* mysql=mysql_init(NULL);//mysql初始化函数,实例化一个新的对象(NULL为新的对象,否则为初始化以创建的对象)
		if(!mysql_real_connect(mysql,con.host,con.user,con.password,con.db,3306,NULL,0)){//mysql_real_connect(MYSQL *mysql,const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
			//上面的函数为,与mysql进行连接
			cout<<"connection error";
			exit(1);
		}
		return mysql;//返回实例化的对象
	}
 
 
/****************************************数据库操作函数*******************************************************/
	void mysql_operation(MYSQL* mysql,char *sql_op)
	{
		if(mysql_query(mysql,sql_op))//mysql_query()函数为对mysql进行操作,第一个参数为刚才实例化的对象,第二个位需要进行的操作
		{ 
			printf("MySQL query error : %s/n", mysql_error(mysql));  //需要加上这个,因为这个是操作失败时返回显示
			getchar();
		 	exit(1);
		}	
	}
 
 
/*******************************查询函数***********************************************************/
	MYSQL_RES* mysql_find(MYSQL* mysql,const char *table,MYSQL_RES* res){
		char cmd[100];
		strcpy(cmd,"select * from ");
		strcat(cmd,table);		//拼接函数
 
 
//		cout<<cmd<<endl;
 
 
		mysql_free_result(res);
		mysql_operation(mysql,cmd);
		return mysql_store_result(mysql);//查询的结果,用mysql_store_result函数后接mysql_affected_rows()可以返回查询次数,而用mysql_use_result()则不行
	}
 
 
/*****************************************插入数据*********************************************************************/
	void mysql_insert(MYSQL* mysql,struct student *p)//需要输入数据为:已经创建好的对象mysql和结构体的指针头部*p
	{
		char cmd[100];
 
 
		strcpy(cmd,"insert test values(\"");
		strcat(cmd,p->name);
		strcat(cmd,"\",\"");
		strcat(cmd,p->nu);
		strcat(cmd,"\")");
 
 
//		cout<<cmd<<endl;
 
 
		mysql_operation(mysql,cmd);
	}
 
 
/*****************************************显示函数*********************************************************************/
	void mysql_show(MYSQL_RES* res)//用于存储查询返回的数据,但这个数据还不能显示,需要进行转换
	{
		MYSQL_ROW row;
		while (( row = mysql_fetch_row(res) ) != NULL)//	row = mysql_fetch_row(res);进行数据的转换,需要循环转换,具体看程序最后的解释
		{
			cout<<row[0]<<"  "<<row[1]<<"  "<<endl;//显示的行数,注意此处表格中只有两列,故row也只有2列,若写多列会出错
		 
		}
	}
 
 
/******************************************精确查询函数************************************************************************/
	void mysql_found(MYSQL* mysql,const char *table,MYSQL_RES* res,int i,const char *str1)//因为row为const char *类型,故需要str1也为此类型,因为要两者进行比较,i为需要比较哪列
	{
		MYSQL_ROW row;
		res = mysql_find(mysql,"test",res);
 
 
		while (( row = mysql_fetch_row(res) ) != NULL)//	row = mysql_fetch_row(res);进行数据的转换,需要循环转换,具体看程序最后的解释
		{
			if( strcmp(row[i],str1) == 0) //判断是否相等
			{
				cout<<"该生的信息为:"<<endl;
				cout<<row[0]<<"  "<<row[1]<<"  "<<endl;
				break;
			}
		}
		if(row == NULL)
		{
			cout<<"查无此人,大概是死了吧"<<endl;
		}
	}
 
 
/***************************************************判断重复****************************************************************/

	int mysql_repeat(MYSQL* mysql,const char *table,MYSQL_RES* res,int i,const char *str1)//因为row为const char *类型,故需要str1也为此类型,因为要两者进行比较,i为需要比较哪列
	{
		int flag=0;//返回为1为重复,0为不重复
		MYSQL_ROW row;
		res = mysql_find(mysql,"test",res);
 
 
		while (( row = mysql_fetch_row(res) ) != NULL)//	row = mysql_fetch_row(res);进行数据的转换,需要循环转换,具体看程序最后的解释
		{
			if( strcmp(row[i],str1) == 0) //判断是否相等
			{
				flag=1;
				break;
			}
		}
		return flag;
	}

/***************************************************删除函数(删除某一行)***************************************************************/
	void mysql_del(MYSQL* mysql,const char *table,const char *row,const char *str0)
	{
		char cmd[100];
 
 
		strcpy(cmd,"delete from ");//Mysql 删除语句为 delete from 表格名 where 列名 like 检索条件
		strcat(cmd,table);
		strcat(cmd," where ");
		strcat(cmd,row);
		strcat(cmd," like ");
		strcat(cmd,"\"");
		strcat(cmd,str0);
		strcat(cmd,"\"");
	//	cout<<cmd<<endl;
 
 
		mysql_operation(mysql,cmd);
	}
 
 
/**************************************************更改函数****************************************************************************/
	void mysql_change(MYSQL* mysql,const char *table,const char *row1,const char *row1_data,const char *row2,const char *row2_data)
	{					//(对象,表格名,列名(用于修改的列),该列数据(用于修改的数据),列名(用于查找),该列数据(用于查找))
		char cmd[100];
 
 
		strcpy(cmd,"update ");
		strcat(cmd,table);
		strcat(cmd," set ");
		strcat(cmd,row1);
		strcat(cmd,"=\"");
		strcat(cmd,row1_data);
		strcat(cmd,"\" where ");
		strcat(cmd,row2);
		strcat(cmd,"=\"");
		strcat(cmd,row2_data);
		strcat(cmd,"\"");
 
 
//		cout<<cmd<<endl;
 
 
		mysql_operation(mysql,cmd);
	}
 
 
/***************************************上一次查询、删除、添加的操作次数*****************************************************/
	const mysql_number(MYSQL* mysql)
	{
		const length = mysql_affected_rows(mysql);//记录刚才进行查询的次数
		return length;
	}
};

int menu_select()
{
	int i;
	printf("\n\n\t ****************************学生管理系统****************************\n");
	printf("\t}*                       1.增加学生信息                 *|\n");
	printf("\t}*                       2.删除学生信息                 *|\n");
	printf("\t}*                       3.查看全部学生信息             *|\n");
	printf("\t}*                       4.查找学生信息                 *|\n");
	printf("\t}*                       5.修改学生信息                 *|\n");
	printf("\t}*                       6.离开                         *|\n");
	printf("\n\n\t ********************************************************************\n");
	do
	{
		printf("\n\t请输入您的选择:");
		scanf("%d",&i);//扫描函数,将扫描的值存入i中
		getchar();
	}while(i<=0||i>7);//判断i值是否在1~7之间,否则继续要求输入
	return i;
}


class Operate
{
	
	public:
		void input(MYSQL* mysql)
		{
			struct student *current;
			Mysql _mysql;
			int flag;

			char name[10];//用于存储学生的名字
			char nu[10];//用于存储学生学号
//			char flag;//用于判断是否继续扫描

			current=(struct student *)malloc( sizeof(struct student) );
		
			printf("请输入学生名字:\n");
			scanf("%s", name);//扫描键盘
			getchar();//注意在前一次进行过扫描后要加getchar(),否则下次扫描会读取回车
			flag = _mysql.mysql_repeat(mysql,"test",NULL,0,name);
			if(flag)
			{
				cout<<"名字打重啦,换个大名试试"<<endl;
				getchar();
				return;
			}
			strcpy(current->name,name);

			printf("请输入学生学号:\n");
			scanf("%s", nu);//扫描键盘
			getchar();//注意在前一次进行过扫描后要加getchar(),否则下次扫描会读取回车
			flag = _mysql.mysql_repeat(mysql,"test",NULL,1,nu);
			if(flag)
			{
				cout<<"学号打重啦,再摇个号试试"<<endl;
				getchar();
				return;
			}
			strcpy(current->nu,nu);

			_mysql.mysql_insert(mysql,current);	
			printf("增加成功");
			getchar();
		}

		void del(MYSQL* mysql)
		{
			Mysql _mysql;
			char name[10];
			char nu[10];
			char flag = -1;
			
			printf("请选择用学号删除(0)或用姓名删除(1):");
			scanf("%c",&flag);
			getchar();
			if(flag == 48)//ASCII码
			{
				printf("\n请输入需要删除学生的学号:\n");
				scanf("%s",&nu);
				getchar();
				flag = _mysql.mysql_repeat(mysql,"test",NULL,1,nu);
				if(flag == 0)
				{
					cout<<"可惜没这个号啊"<<endl;
					getchar();
					return;
				}
				_mysql.mysql_del(mysql,"test","id",nu);
				printf("删除成功");
				getchar();
			}else if( flag == 49)
			{
				printf("\n请输入需要删除学生的姓名:\n");
				scanf("%s",&name);
				getchar();
				flag = _mysql.mysql_repeat(mysql,"test",NULL,0,name);
				if(flag == 0)
				{
					cout<<"可惜没这个人啊"<<endl;
					getchar();
					return;
				}
				_mysql.mysql_del(mysql,"test","name",name);
				printf("删除成功");
				getchar();
			}else
			{
				printf("输入错误");
				getchar();
			}
		
		}
		
		void list(MYSQL* mysql)
		{
			Mysql _mysql;
			MYSQL_RES* res;
			res = NULL;

			res = _mysql.mysql_find(mysql,"test",res);
			const length = _mysql.mysql_number(mysql);//记录刚才进行查询的次数
			cout<<"共有"<<length<<"名学生"<<endl;
			_mysql.mysql_show(res);
			getchar();
		}

		void find(MYSQL* mysql)
		{
			Mysql _mysql;
			char name[10];
			char nu[10];
			char flag = -1;
			
			printf("请选择用学号查找(0)或用姓名查找(1):");
			scanf("%c",&flag);
			getchar();
			if(flag == 48)//ASCII码
			{
				printf("\n请输入需要查找学生的学号:\n");
				scanf("%s",&nu);
				getchar();
				_mysql.mysql_found(mysql,"test",NULL,1,nu);
				getchar();
			}else if( flag == 49)
			{
				printf("\n请输入需要查找学生的姓名:\n");
				scanf("%s",&name);
				getchar();
				_mysql.mysql_found(mysql,"test",NULL,0,name);
				getchar();
			}else
			{
				printf("输入错误");
				getchar();
			}
		}
		
		void modify(MYSQL* mysql)
		{
			Mysql _mysql;
			char name[10];
			char nu[10];
			char flag = -1;

			printf("请选择修改姓名(0)或修改学号(1):");
			scanf("%c",&flag);
			getchar();
			if(flag == 48)//ASCII码
			{
				printf("\n请输入需要修改学生的学号:\n");
				scanf("%s",&nu);
				getchar();
				flag = _mysql.mysql_repeat(mysql,"test",NULL,1,nu);
				if(flag == 0)
				{
					cout<<"找不到,没这个号"<<endl;
					getchar();
					return;
				}
				printf("\n请输入需要把该生姓名修改为:\n");
				scanf("%s",&name);
				getchar();
				_mysql.mysql_change(mysql,"test","name",name,"id",nu);
				printf("修改成功");
				getchar();
			}else if( flag == 49)
			{
				printf("\n请输入需要修改学生的姓名:\n");
				scanf("%s",&name);
				getchar();
				flag = _mysql.mysql_repeat(mysql,"test",NULL,0,name);
				if(flag == 0)
				{
					cout<<"找不到,没人叫这个"<<endl;
					getchar();
					return;
				}
				printf("\n请输入需要把该生学号修改为:\n");
				scanf("%s",&nu);
				getchar();
				_mysql.mysql_change(mysql,"test","id",nu,"name",name);
				printf("修改成功");
				getchar();
			}else
			{
				printf("输入错误");
				getchar();
			}
		}

};

void main()
{
	MYSQL* conn;//用于实例化的新的对象
	MYSQL_RES* res;//用于存储查询返回的数据,但这个数据还不能显示,需要进行转换
//	MYSQL_ROW row;//这个是转换完的数据,可以进行显示

	struct conn_info info;
	Mysql mysql;
	Operate op1;
	
	res = NULL;//要先初始化,否则会报错
 
	info.host="localhost";
	info.user="root";
	info.password="123456";
	info.db="mysql";//我的数据库名字

	conn = mysql.mysql_connect(info); //初始化,包括创建对象和连接mysql
	
	struct student *p;//数据链表的头部
	p=(struct student *)malloc( sizeof(struct student) );
	p->next=NULL; 

		while(1)
	{
		system("cls");
		switch(menu_select())
		{
			case 1:
				op1.input(conn);
				break;
			case 2:
				op1.del(conn);
				break;
			case 3:
				op1.list(conn);
				break;
			case 4:
				op1.find(conn);
				break;
			case 5:
				op1.modify(conn);
				break;
			case 6:
				mysql_close(conn);
				exit(0);
			default:
				printf("输入出错,按任意键返回。");
				getchar();
				break;
		}
	}
}
相对于之前的,加入了报错,在mysql函数中加入了判断重复的函数mysql_repeat()。

猜你喜欢

转载自blog.csdn.net/qq_37358422/article/details/81045798