xxlzdf-课程管理系统
开发语言:C++
使用工具:Visual Studio2012,MySQL,navicat
开发者:xxlzdf等
csdn源码及项目所用库下载:xxlzdf-课程管理系统及所用库
一、系统使用展示
二、系统主要结构
1.系统功能介绍
(1)学生查询课表功能:点击学生查询课表按钮后,通过输入学号即可查询课程。
(2)教师查询课程功能:点击教师查询课表按钮后,通过输入即可查询所有教师的授课信息。
(3)教师修改课程时间功能:点击教师修改课程时间按钮后,通过输入正确的工号,可得到相对应的课程信息,再次界面可修改课程时间。
(4)学生添加课程功能:点击学生添加课程按钮后,可浏览所有课程信息,点击想要选择的课程并输入学号即可完成课程的添加,不可重复选择。
(5)学生退课功能:点击学生删除课程按钮后,通过输入学号可浏览相应的选课信息,点击课程经确认后方可退课。
2.MySQL数据库中的几张有关表的设计
课程表
管理员表
教室表
学生表
教师表
建表思路:①管理员表(login)与其他表没有关联。
②课程编号Class_Id作为主键与其他表做为外键相连建立联系。
③为满足需求,一位教师只教授一门课程,Teacher_Id与Class_Id一一对应。
④学生选课表为student表,没有设置主键,同一学生选不同课程只有Class_Id不同。
3.MySQL数据库与vs连接
1、配置管理器
①、方案中选择属性,找到配置管理器
②、点击配置管理器,更改平台为x64平台
2、引入mysql的库
①方案–属性–C+±-常规—导入mysql的include
②链接器—常规—附加库目录–导入mysql的lib
③、头文件添加内容
#include <WinSock2.h>
#include <mysql.h>
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"libmysql.lib")
3、添加动态链接库文件
①运行项目,如果运行成功,则将libmysql.dll放入到debug目录下
②将lib文件夹下的libmysql.dll复制到生成的x64文件夹的debug目录下
VS与MySQL连接完成!
部分源代码及分析:
头文件
源文件
对话框文件
关于MySQL的连接
本项目内所有关于数据库登录连接部分的代码均在头文件中定义成员变量,在构造函数中初始化,故不一一展示。
一、用户管理员登录界面
管理员登录
功能:系统的登陆及管理员信息的修改。
分析:添加两个statictext点击事件,分别设置为注册和修改密码。
登录按钮获取edit中的用户名和密码,查询数据库,用户名设置为主键因此唯一,将查到的第二列与输入的密码对比,无误即登录成功。
需要先将statictext外观中的Notify改为true,响应的鼠标的点击消息
void CworkDlg::OnStnClickedStaticReg()
{
// TODO: 在此添加控件通知处理程序代码
Register reg;
reg.DoModal();
}
void CworkDlg::OnStnClickedStaticUpd()
{
// TODO: 在此添加控件通知处理程序代码
Revise rev;
rev.DoModal();
}
void CworkDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CString name,pass;
GetDlgItemText(IDC_EDIT_NAME,name);
GetDlgItemText(IDC_EDIT_PASS,pass);
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
sql.Format(L"select * from login where User_Name=%s",name);
//MessageBox(sql, MB_OK);
USES_CONVERSION;
char* mysql = T2A(sql);
if(mysql_query(conn,mysql))
{
MessageBox(_T("查询数据出错"),_T("警告"),MB_OK);
return ;
}
res=mysql_use_result(conn);
if ((row=mysql_fetch_row(res))!=NULL)
{
if ((CString)row[1]!=pass)
{
MessageBox(_T("用户名或密码错误!"),_T("警告"),MB_OK);
return ;
}
else
{
MessageBox(_T("登录成功"),_T("提示"),MB_OK);
Menu men;
men.DoModal();
return ;
}
}
mysql_close(conn);
}
注册用户
功能:添加管理员用户
分析:用户注册即向login表中添加数据,需要判断两次输入密码是否一致,不一致弹出警告提示框,一致即注册新用户成功。
void Register::OnBnClickedOk()
{
CString name,pass,re;
GetDlgItemText(IDC_EDIT_NAME,name);
GetDlgItemText(IDC_EDIT_PASS,pass);
GetDlgItemText(IDC_EDIT_NAME_RE,re);
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
if (pass!=re)
{
MessageBox(_T("两次输入密码不一致"), _T("警告"), MB_OK);
mysql_close(conn);
return;
}
else
{
sql.Format(L"INSERT INTO login VALUES ('%s', '%s');",name,pass);
//MessageBox(sql, MB_OK);
USES_CONVERSION;
char* mysql = T2A(sql);
if (mysql_query(conn, mysql))
{
MessageBox(_T("注册失败!"), _T("警告"), MB_OK);
mysql_close(conn);
return;
}
MessageBox(L"注册成功!", L"提示", MB_OK);
mysql_close(conn);
CDialog::OnOK();
}
}
忘记密码
功能:修改管理员密码
分析:从edit中获取输入的信息:
①首先查管理员表,判断是否存在此管理员账号。
②接着判断输入的密码和原密码是否一致,不一致弹出警告;
③最后获取新密码,判断两次密码输入是否一致,一致修改表中对应管理员账号的密码。
void Revise::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CString name,pass,re,pre;
GetDlgItemText(IDC_EDIT_NAME,name);
GetDlgItemText(IDC_EDIT_PRE,pre);
GetDlgItemText(IDC_EDIT_PASS,pass);
GetDlgItemText(IDC_EDIT_RE,re);
//MessageBox(str,L"",MB_OK);
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql,sql1;
//int id = _ttoi(cstr);
sql.Format(L"select * from login where User_Name='%s'",name);
USES_CONVERSION;
char* mysql=T2A(sql);
if (mysql_query(conn, mysql))//mysql_query(mysql连接,想要进行的查询语句)
{
MessageBox(_T("查询数据出错"), _T("警告"), MB_OK);
return;
}
res = mysql_use_result(conn);
if ((row = mysql_fetch_row(res)) != NULL)
{
if (row[1]==pre)
{
if (pass!=re)
{
MessageBox(_T("两次输入密码不一致"), _T("警告"), MB_OK);
mysql_close(conn);
return;
}else
{
mysql_free_result(res);
sql1.Format(L"update login set User_Pass='%s' where User_Name='%s'",pass,name);
//MessageBox(sql, MB_OK);
char* mysql1 = T2A(sql1);
if (mysql_query(conn, mysql1))
{
MessageBox(_T("修改失败!"), _T("警告"), MB_OK);
mysql_close(conn);
return;
}
MessageBox(L"密码修改成功!", L"提示", MB_OK);
mysql_close(conn);
CDialog::OnOK();
}
}
else
{
MessageBox(L"原密码输入错误!", L"警告", MB_OK);
return ;
}
}
else
{
MessageBox(_T("修改失败,查无此管理员账号!"), _T("警告"), MB_OK);
return ;
}
}
二、菜单
菜单展示
功能:菜单功能
分析:添加其他类的头文件,每个按钮的点击事件下定义相应的对象,访问对象的对话框。
这里的退出系统使用的IDCANCEL的默认退出,没有再添加事件
void Menu::OnBnClickedButtonStus()
{
// TODO: 在此添加控件通知处理程序代码
Stuquery stuq;
stuq.DoModal();
}
void Menu::OnBnClickedButtonTeas()
{
// TODO: 在此添加控件通知处理程序代码
Tea_search tea;
tea.DoModal();
}
void Menu::OnBnClickedButtonTear()
{
// TODO: 在此添加控件通知处理程序代码
Tea_Re tea;
tea.DoModal();
}
void Menu::OnBnClickedButtonStua()
{
// TODO: 在此添加控件通知处理程序代码
Stuadd stu;
stu.DoModal();
}
void Menu::OnBnClickedButtonStud()
{
// TODO: 在此添加控件通知处理程序代码
Studel stu;
stu.DoModal();
}
三、学生-查询课表
查询课表输入学号
功能:输入学号转到Stuquery1对话框
分析:首先查找学生表,没有查找成功提示错误,查找成功后将输入的学号传给Stuquery1定义的对象用以显示该学生的课表。
void Stuquery::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CString num;
GetDlgItemText(IDC_EDIT_NUM,num);
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
//int id = _ttoi(cstr);
sql.Format(L"select * from student where Stu_Id=%s",num);
//MessageBox(sql, MB_OK);
USES_CONVERSION;
char* mysql = T2A(sql);
if(mysql_query(conn,mysql))
{
MessageBox(_T("查询数据出错"),_T("警告"),MB_OK);
return ;
}
res=mysql_use_result(conn);
if ((row=mysql_fetch_row(res))!=NULL)
{
MessageBox(_T("查询成功!"),_T("提示"),MB_OK);
Stuquery1 stu(num);;
stu.DoModal();
return ;
}
else
{
MessageBox(_T("请输入正确的学号!"),_T("警告"),MB_OK);
return ;
}
mysql_close(conn);
CDialog::OnOK();
}
学生课表
首先需要添加表头的内容:
①将List Control的view改为报表模式report
②右键添加变量stuList
③在DoDataExchange()函数中添加表头内容
void Stuquery1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST2, stuList);
stuList.InsertColumn(0, _T("学生姓名"));
stuList.SetColumnWidth(0, 100);
stuList.InsertColumn(1, L"所选课程");
stuList.SetColumnWidth(1, 100);
stuList.InsertColumn(2, _T("教室安排"));
stuList.SetColumnWidth(2, 150);
stuList.InsertColumn(3, _T("授课教师"));
stuList.SetColumnWidth(3, 100);
stuList.InsertColumn(4, _T("上课时间"));
stuList.SetColumnWidth(4, 350);
//第一个参数表示列,第二个参数表示长度
}
功能:显示需要查找学生的课表
分析:首先在构造函数中初始化CString变量cstr用来接收从Stuquery传入的学号,然后查询学生姓名班级等信息,最后将查到的信息显示在stuList中。
void Stuquery1::OnBnClickedButtonShow()
{
// TODO: 在此添加控件通知处理程序代码
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
//int id=_ttoi(cstr);
sql.Format( L"select student.Stu_Name,class.Class_Name,room.Room_Name,teacher.Teacher_Name,class.Class_Time from student,class,room,teacher where student.Class_id=room.Class_Id and teacher.Class_Id=class.Class_id and student.Class_id=class.Class_Id and student.Stu_Id='%s'",cstr);
USES_CONVERSION;
//MessageBox(sql, MB_OK);
char* mysql=T2A(sql);
if(mysql_query(conn,mysql))
{
MessageBox(_T("查询数据出错"),_T("警告"),MB_OK);
return ;
}
res = mysql_use_result(conn);
stuList.DeleteAllItems();
int i = 0;
while ((row = mysql_fetch_row(res)) != NULL)
{
//MessageBox((CString)row[0],_T("提示"),MB_OK);
stuList.InsertItem(i, (CString)(row[0]));
stuList.SetItemText(i, 1, (CString)(row[1]));
stuList.SetItemText(i, 2, (CString)(row[2]));
stuList.SetItemText(i, 3, (CString)(row[3]));
stuList.SetItemText(i, 4, (CString)(row[4]));
i++;
}
mysql_free_result(res);
mysql_close(conn);
}
三、教师-查询课程
同样在DoDataExchange()函数中添加表头内容
为List Control添加变量teaList
void Tea_search::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST2, teaList);
teaList.InsertColumn(0, _T("教师工号"));
teaList.SetColumnWidth(0, 100);
teaList.InsertColumn(1, L"教师姓名");
teaList.SetColumnWidth(1, 100);
teaList.InsertColumn(2, _T("教师性别"));
teaList.SetColumnWidth(2, 150);
teaList.InsertColumn(3, _T("教师年龄"));
teaList.SetColumnWidth(3, 100);
teaList.InsertColumn(4, _T("所授科目"));
teaList.SetColumnWidth(4, 100);
teaList.InsertColumn(5, _T("上课时间"));
teaList.SetColumnWidth(5, 350);
}
功能:显示所有教师的课程安排
分析:由于设定一位老师只能教一门课程,所以查询所有老师的课程信息
数据显示按钮多表查询课程安排,结果显示在teaList上
void Tea_search::OnBnClickedButtonShow()
{
// TODO: 在此添加控件通知处理程序代码
conn = mysql_init(NULL);//conn分配初始化MySQL对象
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk");//设置字符集
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
sql.Format( L"select teacher.Teacher_Id,teacher.Teacher_Name,teacher.Teacher_Sex,teacher.Teacher_Age,class.Class_Name,class.Class_Time from teacher,class where teacher.Class_Id=class.Class_Id");
USES_CONVERSION;
char* mysql=T2A(sql);
if (mysql_query(conn, mysql))//mysql_query(mysql连接,想要进行的查询语句)
{
MessageBox(_T("查询数据出错"), _T("警告"), MB_OK);
return;
}
res = mysql_use_result(conn);
teaList.DeleteAllItems();
int i = 0;
// output table name
while ((row = mysql_fetch_row(res)) != NULL)
{
teaList.InsertItem(i, (CString)(row[0]));
teaList.SetItemText(i, 1, (CString)(row[1]));
teaList.SetItemText(i, 2, (CString)(row[2]));
teaList.SetItemText(i, 3, (CString)(row[3]));
teaList.SetItemText(i, 4, (CString)(row[4]));
teaList.SetItemText(i, 5, (CString)(row[5]));
i++;
}
mysql_free_result(res);
mysql_close(conn);
}
变量page和isLast在头文件中定义用于标记页码及是否为最后一页
void Tea_search::OnBnClickedButtonPre()
{
// TODO: 在此添加控件通知处理程序代码
page-=1;
isLast=false;
if (page<=0)
{
page=1;
}
//如果一页数据小于七行
int curRow=(page-1)*7;
CString sql=_T("select teacher.Teacher_Id,teacher.Teacher_Name,teacher.Teacher_Sex,teacher.Teacher_Age,class.Class_Name,class.Class_Time from teacher,class where teacher.Class_Id=class.Class_Id limit %i,7");
sql.Format(sql,curRow);
conn = mysql_init(NULL);
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk");//设置字符集
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
USES_CONVERSION;
char*mysql=T2A(sql);//CString ==> char*
if (mysql_query(conn, mysql))
{
MessageBox(_T("查询数据出错"), _T("警告"), MB_OK);
return;
}
res = mysql_use_result(conn);
teaList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//允许一行高亮选中
teaList.DeleteAllItems();//清空stuList中的所有数据,不清空表头
int i = 0;
// output table name
while ((row = mysql_fetch_row(res)) != NULL)
{
teaList.InsertItem(i, (CString)(row[0]));
teaList.SetItemText(i, 1, (CString)(row[1]));
teaList.SetItemText(i, 2, (CString)(row[2]));
teaList.SetItemText(i, 3, (CString)(row[3]));
teaList.SetItemText(i, 4, (CString)(row[4]));
teaList.SetItemText(i, 5, (CString)(row[5]));
i++;
}
mysql_free_result(res);
mysql_close(conn);
}
void Tea_search::OnBnClickedButtonAft()
{
// TODO: 在此添加控件通知处理程序代码
if (isLast==false)
{
page+=1;
}
else
{
return ;
}
//如果一页数据小于七行
int curRow=(page-1)*7;
//select * from student limit
CString sql=_T("select teacher.Teacher_Id,teacher.Teacher_Name,teacher.Teacher_Sex,teacher.Teacher_Age,class.Class_Name,class.Class_Time from teacher,class where teacher.Class_Id=class.Class_Id limit %i,7");
sql.Format(sql,curRow);
conn = mysql_init(NULL);
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk");//设置字符集
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
USES_CONVERSION;//定义宏
char* mysql=T2A(sql);//CString ==> char*
if (mysql_query(conn, mysql))
{
MessageBox(_T("查询数据出错"), _T("警告"), MB_OK);
return;
}
res = mysql_use_result(conn);//成功检索数据的每个查询必须使用将初始化结果集检索
teaList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);//调整选框
teaList.DeleteAllItems();//清空stuList中的所有数据,不清空表头
int i = 0;
// output table name
while ((row = mysql_fetch_row(res)) != NULL)
{
teaList.InsertItem(i, (CString)(row[0]));
teaList.SetItemText(i, 1, (CString)(row[1]));
teaList.SetItemText(i, 2, (CString)(row[2]));
teaList.SetItemText(i, 3, (CString)(row[3]));
teaList.SetItemText(i, 4, (CString)(row[4]));
teaList.SetItemText(i, 5, (CString)(row[5]));
i++;
}
if (!i)
{
//说明前一页就是最后一页
isLast=true;
mysql_free_result(res);
mysql_close(conn);
OnBnClickedButtonPre();
return ;
}
if (i<4)
{
isLast= true;
}
mysql_free_result(res);
mysql_close(conn);
}
四、教师-修改课程时间
教师输入工号
功能:输入工号转到Tea_Re1对话框
分析:首先查找教师表,没有查找成功提示错误,查找成功后将输入的工号传给Tea_Re1定义的对象用以显示该教师的课程时间安排。
void Tea_Re::OnBnClickedButtonOkk()
{
// TODO: 在此添加控件通知处理程序代码
CString num;
GetDlgItemText(IDC_EDIT_NUM,num);
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
//int id = _ttoi(cstr);
sql.Format(L"select * from teacher where Teacher_Id=%s",num);
//MessageBox(sql, MB_OK);
USES_CONVERSION;
char* mysql = T2A(sql);
if(mysql_query(conn,mysql))
{
MessageBox(_T("查询数据出错"),_T("警告"),MB_OK);
return ;
}
res=mysql_use_result(conn);
if ((row=mysql_fetch_row(res))!=NULL)
{
MessageBox(_T("查询成功!"),_T("提示"),MB_OK);
Tea_Re1 tea(num);
tea.DoModal();
//MessageBox((CString)row[5],_T("提示"),MB_OK);
return ;
}
else
{
MessageBox(_T("请输入正确的工号!"),_T("警告"),MB_OK);
return ;
}
mysql_close(conn);
}
教师修改课程时间
功能:查看教师课程信息,并修改授课时间
分析:首先多表查询课程时间及安排,利用四个StaticText显示查询到的课程安排,然后获取输入的内容更新的时间。
在DoDataExchange()函数中完成查询及输出
void Tea_Re1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//添加一些代码
SetDlgItemText(IDC_STATIC_TNAME,str);//text显示选中行的id
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
int id=_ttoi(str);
sql.Format( L"select teacher.Teacher_Name,class.Class_Name,room.Room_Name,class.Class_Time from teacher,class,room where teacher.Class_Id=class.Class_Id and teacher.Class_Id=room.Class_Id and teacher.Class_Id=%i",id);
USES_CONVERSION;
char* mysql=T2A(sql);
if(mysql_query(conn,mysql))
{
MessageBox(_T("查询数据出错"),_T("警告"),MB_OK);
return ;
}
res=mysql_use_result(conn);
if ((row=mysql_fetch_row(res))!=NULL)
{
SetDlgItemText(IDC_STATIC_TNAME,(CString)row[0]);
SetDlgItemText(IDC_STATIC_CNAME,(CString)row[1]);
SetDlgItemText(IDC_STATIC_ROOM,(CString)row[2]);
SetDlgItemText(IDC_STATIC_TEXT,(CString)row[3]);
}
else
{
MessageBox(_T("查询本行出错"),_T("警告"),MB_OK);
return ;
}
mysql_free_result(res);
mysql_close(conn);
}
点击确认按钮后更新授课时间
void Tea_Re1::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CString time;
GetDlgItemText(IDC_EDIT_TIME,time);
//MessageBox(str,L"",MB_OK);
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
int id = _ttoi(str);
sql.Format(L"update class set Class_Time='%s' where class.Class_Id=%i",time,id);
//MessageBox(sql, MB_OK);
USES_CONVERSION;
char* mysql = T2A(sql);
if (mysql_query(conn, mysql))
{
MessageBox(_T("更新数据出错"), _T("警告"), MB_OK);
mysql_close(conn);
return;
}
MessageBox(L"更新数据成功", L"提示", MB_OK);
mysql_close(conn);
CDialog::OnOK();
}
五、学生-增加课程
显示所有课程信息
功能:显示所有的课程
分析:初始化表头之后,多表查询课程信息及授课教师。
点击加载数据在stuList输出所有的课程信息。
点击添加,将选中行的Class_Id传给Stuadd1创建的对象。
在DoDataExchange()函数中初始化表头
void Stuadd::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, stuList);
stuList.InsertColumn(0, _T("课程编号"));
stuList.SetColumnWidth(0, 100);
stuList.InsertColumn(1, L"课程名");
stuList.SetColumnWidth(1, 100);
stuList.InsertColumn(2, _T("授课教师"));
stuList.SetColumnWidth(2, 100);
stuList.InsertColumn(3, _T("课程时间"));
stuList.SetColumnWidth(3, 350);
}
按下加载数据在stuList输出所有的课程信息。
void Stuadd::OnBnClickedButtonData()
{
stuList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
stuList.DeleteAllItems();
// TODO: 在此添加控件通知处理程序代码
conn = mysql_init(NULL);//conn分配初始化MySQL对象
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk");//设置字符集
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
sql.Format( L"select class.Class_Id,class.Class_Name,teacher.Teacher_Name,class.Class_Time from class,teacher where class.Class_Id=teacher.Class_Id");
USES_CONVERSION;
char* mysql=T2A(sql);
if (mysql_query(conn, mysql))//mysql_query(mysql连接,想要进行的查询语句)
{
MessageBox(_T("查询数据出错"), _T("警告"), MB_OK);
return;
}
res = mysql_use_result(conn);
stuList.DeleteAllItems();
int i = 0;
// output table name
while ((row = mysql_fetch_row(res)) != NULL)
{
stuList.InsertItem(i, (CString)(row[0]));
stuList.SetItemText(i, 1, (CString)(row[1]));
stuList.SetItemText(i, 2, (CString)(row[2]));
stuList.SetItemText(i, 3, (CString)(row[3]));
i++;
}
mysql_free_result(res);
mysql_close(conn);
}
点击添加按钮,创建POSITION对象得到选中的位置,将查询结果的第一列(Class_Id)赋值给CString类型对象str,把Class_Id传给Stuadd1创建的对象。
void Stuadd::OnBnClickedButtonAdd()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
int nId;
// TODO:得到选中的位置
POSITION pos = stuList.GetFirstSelectedItemPosition();
//如果没有选中,那么提示后退出
if (pos==NULL)
{
MessageBox(L"你没有选中任何行",L"提示 ",MB_OK);
return;
}
//选中后得到行号
nId=(int)stuList.GetNextSelectedItem(pos);
//从行号中的1列取出id,并想办法把id传入到另一个界面
str=stuList.GetItemText(nId,0);
//第一个参数nid是行号,后面的参数0是选中行的第一列(列号),行和列可以确定一个数据
//MessageBox(L"增加课程成功", L"提示", MB_OK);
Stuadd1 stu1(str);
stu1.DoModal();
}
加载数据和上一页、下一页按钮功能与上文类似,只是换了查询的语句以及内容输出不同,具体请在工程源代码中查看。
增加课程输入学号
功能:输入学号,添加stuList所选中行的课程
分析:避免学生重复添加相同的课程,因此先查学生表,并定义初始化bool类型变量whether=true。
将传入的str转为(int)id,因为Class_Id唯一,循环判断若所选课程与查到的已选课程id相同,将whether赋值flase,弹出错误框。
学生选多门课添加在学生表中,因此将查到的学生信息(唯一),除Class_Id外分别赋值给name,sex,age,addr用以满足插入语句的格式,最后按照格式将学生信息和新选课的Class_Id组合插入到学生表中。
void Stuadd1::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CString num;
GetDlgItemText(IDC_EDIT_NUM,num);
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
//int id = _ttoi(cstr);
sql.Format( L"select *from student where student.Stu_Id='%s'",num);
USES_CONVERSION;
char* mysql=T2A(sql);
if (mysql_query(conn, mysql))//mysql_query(mysql连接,想要进行的查询语句)
{
MessageBox(_T("查询数据出错"), _T("警告"), MB_OK);
return;
}
CString name,sex,age,addr;
whether=true;
res = mysql_use_result(conn);
int id = _ttoi(str);
while ((row = mysql_fetch_row(res)) != NULL)
{
//MessageBox((CString)row[5], _T("警告"), MB_OK);
if ( _ttoi((CString)row[5])==id)
{
whether=false;
}
name=(CString)row[1];
sex=(CString)row[2];
age=(CString)row[3];
addr=(CString)row[4];
}
CString sql1;
if (!whether)
{
MessageBox(_T("不能选择相同的课程!"), _T("警告"), MB_OK);
return;
}
else
{
sql1.Format(L"insert into student values('%s','%s','%s','%s','%s',%i)",num,name,sex,age,addr,id);
//MessageBox(sql, MB_OK);
char* mysql1 = T2A(sql1);
//MessageBox(sql1, _T("警告"), MB_OK);
mysql_free_result(res);
if (mysql_query(conn, mysql1))
{
MessageBox(_T("增加课程出错"), _T("警告"), MB_OK);
mysql_close(conn);
return;
}
MessageBox(L"增加课程成功", L"提示", MB_OK);
mysql_close(conn);
}
}
六、学生-删除课程
删除课程输入学号
功能:输入学号转到Studel1对话框
分析:首先查找学生表,没有查找成功提示错误,查找成功后将输入的学号传给Studel1定义的对象用以显示该学生的课表。
void Studel::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CString num;
GetDlgItemText(IDC_EDIT_NUM,num);
conn = mysql_init(NULL);//conn分配初始化MySQL对象
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
CString sql;
//int id = _ttoi(cstr);
sql.Format(L"select * from student where Stu_Id=%s",num);
//MessageBox(sql, MB_OK);
USES_CONVERSION;
char* mysql = T2A(sql);
if(mysql_query(conn,mysql))
{
MessageBox(_T("查询数据出错"),_T("警告"),MB_OK);
return ;
}
res=mysql_use_result(conn);
if ((row=mysql_fetch_row(res))!=NULL)
{
MessageBox(_T("查询成功!"),_T("提示"),MB_OK);
Studel1 stu(num);
//MessageBox((CString)row[5],_T("提示"),MB_OK);
stu.DoModal();
return ;
}
else
{
MessageBox(_T("请输入正确的学号!"),_T("警告"),MB_OK);
return ;
}
mysql_close(conn);
CDialog::OnOK();
}
显示课表、选择删除
功能:选中科目后点击"删除"删除课程
分析:在显示课表步骤中查询的结果是课程的名称,名称(Class_Name)与(Class_id)一一对应,故用名称查class表,得到int类型id = _ttoi(class_id)
。
再用学号(Stu_Id)和课程编号(Class_Id)删除对应唯一数据,即从学生表中删除了所选的课程。
需提示用户是否确定删除避免删除出错
当点击确认时MessageBox返回值1,利用这一特点确定是否删除。
void Studel1::OnBnClickedButtonDel()
{
// TODO: 在此添加控件通知处理程序代码
conn = mysql_init(NULL);
if (0 == mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"))//设置字符集
{
}
// connect to database
if (!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0))
{
MessageBox(_T("没有获得数据库连接"), _T("警告"), MB_OK);
return;
}
//CString str;
int nId;
// TODO:得到选中的位置
POSITION pos = stuList.GetFirstSelectedItemPosition();
//如果没有选中,那么提示后退出
if (pos==NULL)
{
MessageBox(L"你没有选中任何行",L"提示 ",MB_OK);
return;
}
//选中后得到行号
nId=(int)stuList.GetNextSelectedItem(pos);
//从行号中的1列取出id,并想办法把id传入到另一个界面
CString tr=stuList.GetItemText(nId,1);
//第一个参数nid是行号,后面的参数1是选中行的第二列(列号),行和列可以确定一个数据
CString sql;
sql.Format( L"select *from class where class.Class_Name='%s'",tr);
USES_CONVERSION;
char* mysql=T2A(sql);
if (mysql_query(conn, mysql))//mysql_query(mysql连接,想要进行的查询语句)
{
MessageBox(_T("查询数据出错"), _T("警告"), MB_OK);
return;
}
CString class_id;
res = mysql_use_result(conn);
if ((row=mysql_fetch_row(res))!=NULL)
{
class_id=row[0];
}
CString app;
int id = _ttoi(class_id);
app.Format(L"delete from student where student.Stu_Id='%s' and student.Class_id= %d",str,id);
char* mysql1 = T2A(app);
mysql_free_result(res);
if (mysql_query(conn, mysql1))
{
MessageBox(_T("删除课程出错"), _T("警告"), MB_OK);
mysql_close(conn);
return;
}
int i = MessageBox(L"是否确定删除", L"提示", MB_OKCANCEL);
if (i==1)
{
MessageBox(L"删除成功", L"提示", MB_OK);
}
else return ;
mysql_close(conn);
return ;
}
总结
第一次利用MFC连接MySQL进行桌面编程,高强度写下来大概用了将近两天时间,小组成员提供的界面设计让我省了很多力气,只需要关注代码的实现。
写代码的过程里vs2012好多次未响应,MFC组件时不时地出一些奇怪的问题,起初连接数据库时也有不少问题。
但是完成这样的程序还是受益匪浅的,在写完程序后我想发一篇博客来记录我整个项目编写的思路以及注意事项,写博客也用了将近两天时间,这次课题收获还是很大的。
至于美化方面的事我还没有做,添加背景之类的网上都能找到详细的教程,这篇博客只是纯粹项目的编写。
工程和我所用的数据库会发链接,xxlzdf原创欢迎下载。
xxlzdf-课程管理系统及所用库