成绩管理系统设计报告.docx
《成绩管理系统设计报告.docx》由会员分享,可在线阅读,更多相关《成绩管理系统设计报告.docx(32页珍藏版)》请在冰豆网上搜索。
![成绩管理系统设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/23/4287fb28-768d-4e8d-b8d6-5bfdea73086c/4287fb28-768d-4e8d-b8d6-5bfdea73086c1.gif)
成绩管理系统设计报告
成绩管理系统设计报告
一、设计分析
编写一个成绩管理系统,要求:
1、用数据库建立两张表,本别存储成绩信息包括姓名、课程名及成绩和用户登录信息(数据库类型不限);
2、用户登录后可以录入、删除、修改成绩;
3、能够分别按姓名和课程名查询相应记录;
4、能够统计没门课程的平均分、最高分和最低分并分别显示在相应的界面上。
成绩管理系统,需要连接数据库,在本系统中,使用ACCESS数据库,在数据库中建立两张表,一张成绩信息,包括ID、姓名、课程、成绩;一张用户信息,包括ID、用户名、密码。
使用VC++提供的高度可视化的应用程序开发工具MFC来设计程序,连接数据库。
在系统界面运行后,连接数据库,需要用户登录方可操作。
用户登录成功以后,可以查看整个成绩信息表中的数据,并且可以对其中的数据进行添加、修改、删除等操作,并将操作结果存入ACCESS数据库中。
设计一个数据查询区,然后用户选择按照姓名查询或者按照课程查询,并且在输入框中输入查询的姓名或者课程名,然后程序执行查询过程,并且将查询结果显示出来。
再设计一个数据统计区,用户输入要统计的课程名,然后进行统计,把平均分、最高分和最低分分别显示出来。
二、程序结构
系统运行以后,连接数据库,然后需要用户登录,当用户正常登录以后,就可以执行查看、添加、修改、删除、查询、统计等等操作。
三、各模块的功能及程序说明
按照需求进行系统的设计,可以分为数据库连接模块、用户登录模块、添加修改删除模块、查询模块、统计模块等五个主要模块,以下逐个说明各模块的功能及程序说明。
1、数据库连接模块。
数据库的连接是本系统正常运行的基础,无论是用户的登录还是后续数据的查询统计等等,都是基于数据库已经连接并且能够进行操作的这个基础上进行的。
在本系统中使用ADO操作Access数据库,首先要引入ADO的动态连接库,所以在在stdafx.h里面添加如下的代码:
#import"C:
\programfiles\commonfiles\system\ado\msado15.dll"\
no_namespacerename("EOF","adoEOF")
#include
然后定义两个变量指针:
_ConnectionPtrm_pConnection;
_RecordsetPtrm_pRecordset;
接下来,在系统初始化函数里面添加如下代码初始化COM库:
if(!
AfxOleInit())//这就是初始化COM库
{
MessageBox("OLE初始化出错!
");
returnFALSE;
}
做完了上述工作以后,就可以连接我们的Access数据库文件,继续在系统初始化函数中添加如下代码:
//使用ADO连接数据库...
//---------------------------------------------------------------------------------
//_ConnectionPtrm_pConnection;
CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些想不到的错误。
try
{
//打开本地Access库db1.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=chengjiguanli.mdb","","",adModeUnknown);
}
catch(_com_errore)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!
");
returnFALSE;
}
这样,我们的系统就和Access数据库文件chengjiguanli.mdb进行了连接,我们就可以在后续的使用中对数据库进行操作了。
2、用户登录模块。
系统运行以后,因为还没有用户登录,所以除登录菜单按钮以外,其他的控件都不可使用。
点击登录菜单,会跳出用户登录界面,输入用户名和密码,当用户名和密码都正确以后,用户正常登录,可以使用其他控件,进行后续的操作。
验证用户名和密码的时候,需要在用户信息表中进行查询,并且核对用户名、密码。
当用户名和密码不对的时候,给出提示信息,其他控件依然不可以使用。
3、添加修改删除模块。
在这个模块中实现对于数据的查看、添加、修改、删除等功能。
在系统初始化的时候,已经跟数据库进行了连接,我们就可使用一个_RecordsetPtr实例来执行一条SQL语句,得到一个结果集。
如下代码:
m_pRecordset.CreateInstance(__uuidof(Recordset));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些意想不到的错误
try
{
m_pRecordset->Open("SELECT*FROM成绩信息",//查询成绩信息表中所有字段
m_pConnection.GetInterfacePtr(),//获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
这段代码执行了"SELECT*FROM成绩信息"这条SQL语句,就是查询成绩信息并且返回这个表中的所有字段和数据。
返回的结果,就在m_pRecordset这个结果集中。
那么我们就可以对这个结果集进行操作,让他显示在界面上指定的区域内。
添加、删除、修改这三个操作,都是基于这个结果集进行的。
添加一条记录的时候,使用如下代码:
m_pRecordset->AddNew();//添加新记录
m_pRecordset->PutCollect("ID",_variant_t(m_id));
m_pRecordset->PutCollect("姓名",_variant_t(strName));
m_pRecordset->PutCollect("课程",_variant_t(strClass));
m_pRecordset->PutCollect("成绩",_variant_t(strScore));
m_pRecordset->Update();
删除的时候,使用如下语句:
m_pRecordset->Move(ff);
//参数ff是要删除的数据的索引
m_pRecordset->Delete(adAffectCurrent);
//参数adAffectCurrent为删除当前记录
m_pRecordset->Update();
修改数据的时候,选中这条数据,先删除,然后再添加修改后的数据即可。
执行完查看、添加、修改、删除等操作以后,一定要记得把这个结果集关闭掉。
要使用如下的语句:
m_pRecordset->Close();
4、查询模块。
由用户先选中是按照用户名进行查询还是按照课程名进行查询,不过这两种查询,除了查询的时候,使用的SQL语句不同以外,其他的操作都是相同的。
对于这两种查询,使用一个标志符区别,然后根据标识符决定SQL语句,代码如下:
if(m_tag==true)
{
xianshiddd="SELECT*FROM成绩信息WHERE姓名=\""+m_chaxun+"\"";
}
else
{
xianshiddd="SELECT*FROM成绩信息WHERE课程=\""+m_chaxun+"\"";
}
在进行数据查询的时候,使用_CommandPtr和_RecordsetPtr配合,用_CommandPtr的实例记录SQL语句并且执行查询,把返回的结果存入_RecordsetPtr的实例中,然后可以对其进行后续的操作。
相应的代码如下:
_CommandPtrm_pCommand;
_RecordsetPtrm_pRecordsetling;
//MessageBox("111");
m_pCommand.CreateInstance(__uuidof(Command));
//MessageBox("11122");
//将库连接赋于它
m_pCommand->ActiveConnection=m_pConnection;
//MessageBox("11133");
//SQL语句_variant_t
m_pCommand->CommandText=_bstr_t(xianshiddd);
//MessageBox("11144");
//执行SQL语句,返回记录集
m_pRecordsetling=m_pCommand->Execute(NULL,NULL,adCmdText);
//MessageBox("11155");
if(m_pRecordsetling->adoEOF)
{
MessageBox("结果为空!
");
}
查询完毕以后,把数据显示出来即可。
5、统计模块。
统计模块类似于按照课程名进行查询,也是使用_CommandPtr和_RecordsetPtr配合,用_CommandPtr的实例记录SQL语句并且执行查询,把返回的结果存入_RecordsetPtr的实例中,然后可以对其进行后续的操作。
需要统计平均分、最高分、最低分,所以一共要执行三遍查询,每次查询的SQL语句如下:
统计课程的平均分:
SELECTavg(成绩)asavgvalueFROM成绩信息WHERE课程="m_tongji"
统计课程的最高分:
SELECTmax(成绩)asmaxvalueFROM成绩信息WHERE课程="m_tongji"
统计课程的最低分:
SELECTmin(成绩)asminvalueFROM成绩信息WHERE课程="m_tongji"
执行完毕以后,再把相应的结果显示。
四、源程序
根据程序模块的划分,依次来对源程序进行说明。
1、数据库连接模块:
if(!
AfxOleInit())//这就是初始化COM库
{
MessageBox("OLE初始化出错!
");
returnFALSE;
}
//使用ADO连接数据库...
//---------------------------------------------------------------------------------
//_ConnectionPtrm_pConnection;
CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些想不到的错误。
try
{
//打开本地Access库db1.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=chengjiguanli.mdb","","",adModeUnknown);
}
catch(_com_errore)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!
");
returnFALSE;
}
m_AccessListCtrl.InsertColumn(0,"id");
m_AccessListCtrl.InsertColumn(1,"姓名");
m_AccessListCtrl.InsertColumn(2,"课程");
m_AccessListCtrl.InsertColumn(3,"成绩");
RECTrect;
m_AccessListCtrl.GetWindowRect(&rect);
intwidth=rect.right-rect.left;
m_AccessListCtrl.SetColumnWidth(0,width/4);
m_AccessListCtrl.SetColumnWidth(1,width/4);
m_AccessListCtrl.SetColumnWidth(2,width/4);
m_AccessListCtrl.SetColumnWidth(3,width/4);
m_AccessListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);
2、用户登录模块:
voidCChenJiGuanLiDlg:
:
OnMenuitem32771()
{
//TODO:
Addyourcommandhandlercodehere
CLogInlogindlg;
logindlg.pusername=&m_username;
logindlg.ppassword=&m_password;
if(logindlg.DoModal()==IDOK)
{
//MessageBox(m_username);
//MessageBox(m_password);
CStringxianshiddd;
//UpdateData(true);
xianshiddd="SELECT密码FROM用户信息WHERE用户名=\""+m_username+"\"";
//MessageBox(xianshiddd);
_variant_tvar;
//CStringstrId;
//CStringstrName;
//CStringstrClass;
CStringmp_password;
_CommandPtrm_pCommand;
_RecordsetPtrm_pRecordsetling;
m_pCommand.CreateInstance(__uuidof(Command));
//将库连接赋于它
m_pCommand->ActiveConnection=m_pConnection;
//SQL语句
//m_pCommand->CommandText="SELECT*FROM成绩信息WHEREID=6";
m_pCommand->CommandText=_bstr_t(xianshiddd);
//执行SQL语句,返回记录集
m_pRecordsetling=m_pCommand->Execute(NULL,NULL,adCmdText);
if(m_pRecordsetling->adoEOF)
{
MessageBox("用户名不对,请确认!
");
return;
}
var=m_pRecordsetling->GetCollect("密码");
if(var.vt!
=VT_NULL)
mp_password=(LPCSTR)_bstr_t(var);
if(m_password==mp_password)
{
MessageBox("登录成功!
");
F_InitUI(true);
}
else
{
MessageBox("用户名或者密码不对,请确认!
");
return;
}
}
}
3、添加修改删除模块:
voidCChenJiGuanLiDlg:
:
OnBUTTONtianjia()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringm_id;
CStringstrName;
CStringstrClass;
CStringstrScore;
DataDuRu();
_CommandPtrm_pCommand;
_RecordsetPtrm_pRecordsetling;
m_pCommand.CreateInstance(__uuidof(Command));
//将库连接赋于它
m_pCommand->ActiveConnection=m_pConnection;
intidhao=0;
CStringxianshiddd;
do
{
//////////////////
idhao++;
//MessageBox("111");
xianshiddd.Format("SELECT*FROM成绩信息WHEREID=%d",idhao);
//MessageBox(xianshiddd);
//SQL语句
m_pCommand->CommandText=_bstr_t(xianshiddd);//"SELECT*FROM成绩信息WHEREID=idhao";
//执行SQL语句,返回记录集
m_pRecordsetling=m_pCommand->Execute(NULL,NULL,adCmdText);
////////////////////////
//MessageBox("222");
}while(!
m_pRecordsetling->adoEOF);
m_pRecordsetling->Close();
CStringxianshi;
xianshi.Format("%d",idhao);
MessageBox(xianshi);
CDataDlgm_datadlg;
m_datadlg.m_mid=idhao;
m_datadlg.pstrname=&strName;
m_datadlg.pstrclass=&strClass;
m_datadlg.pstrscore=&strScore;
if(m_datadlg.DoModal()==IDOK)
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些意想不到的错误。
jingzhouxu
try
{
m_pRecordset->Open("SELECT*FROM成绩信息",//查询DemoTable表中所有字段
m_pConnection.GetInterfacePtr(),//获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
//MessageBox("fform");
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
m_id.Format("%d",idhao);
//UpdateData(true);
//MessageBox("fform1");
m_pRecordset->AddNew();//添加新记录
//MessageBox("fform2");
m_pRecordset->PutCollect("ID",_variant_t(m_id));//time是字段名称,test是存入time字段里面的数据
//因为这里time被我设置为CString类,"test"可以用CString类变量替代,下同
//MessageBox("fform3");
m_pRecordset->PutCollect("姓名",_variant_t(strName));
//MessageBox("fform33");
m_pRecordset->PutCollect("课程",_variant_t(strClass));
m_pRecordset->PutCollect("成绩",_variant_t(strScore));
//MessageBox("fform4");
m_pRecordset->Update();//使插入生效,就是更新
m_pRecordset->Close();
}
DataDuRu();
}
voidCChenJiGuanLiDlg:
:
DataDuRu()
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些意想不到的错误。
try
{
m_pRecordset->Open("SELECT*FROM成绩信息",//查询成绩信息表中所有字段
m_pConnection.GetInterfacePtr(),//获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
_variant_tvar;
CStringstrId;
CStringstrName;
CStringstrClass;
CStringstrScore;
inti=0;
//MessageBox("ff111111111orm3");
m_AccessListCtrl.DeleteAllItems();
//CStringm_AccessList;m_AccessListCtrl.InsertItem(0,"11");
while(!
m_pRecordset->adoEOF)
{
var=m_pRecordset->GetCollect("id");
if(var.vt!
=VT_NULL)
strId=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("姓名");
if(var.vt!
=VT_NULL)
strName=(LPCSTR)_bstr_t(var);
var=m