成绩管理系统设计报告.docx

上传人:b****5 文档编号:3549803 上传时间:2022-11-23 格式:DOCX 页数:32 大小:729.30KB
下载 相关 举报
成绩管理系统设计报告.docx_第1页
第1页 / 共32页
成绩管理系统设计报告.docx_第2页
第2页 / 共32页
成绩管理系统设计报告.docx_第3页
第3页 / 共32页
成绩管理系统设计报告.docx_第4页
第4页 / 共32页
成绩管理系统设计报告.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

成绩管理系统设计报告.docx

《成绩管理系统设计报告.docx》由会员分享,可在线阅读,更多相关《成绩管理系统设计报告.docx(32页珍藏版)》请在冰豆网上搜索。

成绩管理系统设计报告.docx

成绩管理系统设计报告

成绩管理系统设计报告

一、设计分析

编写一个成绩管理系统,要求:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1