学生信息管理系统win+sqlWord文档格式.docx
《学生信息管理系统win+sqlWord文档格式.docx》由会员分享,可在线阅读,更多相关《学生信息管理系统win+sqlWord文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
5.2实训中遇到的问题及解决方法30
5.3设计中尚存的不足之处30
5.4感想和心得体会30
5.5最满意地方30
附录:
30
学生信息管理系统
本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉面向对象程序设计过程。
本程序中涉及MFC,class等方面的知识。
通过本程序的训练,使学生能对MFC有一个更深刻的了解,掌握利用MSSQL通过ADO实现对学生成绩管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。
1、问题定义
创建一个学生信息管理系统。
假设系统中每个学生记录只包括学号、姓名、手机号、身份证号、联系地址。
程序的运行效果如下图所示,选择任意菜单后,实现相应功能。
图1.1学生信息管理系统功能需求
在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2、系统设计
2.1总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。
需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。
解决方案关系图
2.2详细设计
通过登陆验证后然后出现一个界面,改界面作为一个login类
然后主界面的操作,以项目名+dlg作为类名
学生数据操作部分,新建一个对话框界面,以DataOperation作为类名。
2.3运行环境
目标是写windowsxp可以运行,但是编写程序的机子是windows7,用vs2010编写,因此产生兼容性问题,最后程序运行环境为Windows7以上,装有MSSQL的计算机。
3、系统设计
3.1编码
项目名取为testmfc,因为每次做新东西的时候。
不用含test就经常干不成,所以项目名还是加test好点。
3.1.1ADO
因为需要ADO的支持,所以在stdafx.h中要引入ADO的dll并重命名下结束标记,避免与文件的EOF冲突。
因为主要执行操作都在CtestmfcDlg,也就是主要的界面,所以把ADO的相关操作语句放到该类下面
Switchint是作为一个开关用,作为是否刷新表单中的内容,1为刷新,其他不刷新。
Querycommand作为查询语句
查询函数里面用过ACCESS但是发现兼容性不是很好,所以还是用习惯用的MSSQL去做数据库了。
voidCtestmfcDlg:
:
sqlquery(intswitchint,CStringquerycommand)
{
//TODO:
在此添加控件通知处理程序代码
CoInitialize(NULL);
//初始化COM组件
_ConnectionPtrpConn(__uuidof(Connection));
//实例化一个connection对象pConn
_RecordsetPtrpRst(__uuidof(Recordset));
//实例化一个Recordset对象pRst
_CommandPtrpCmd(__uuidof(Command));
//实例化一个Command对象pCmd
try
{
//ACCESS
//pConn->
ConnectionString="
Provider=Microsoft.Jet.OLEDB.4.0;
UserID=Admin;
DataSource=C:
\\cppdb.mdb;
Mode=ShareDenyNone;
ExtendedProperties=\"
\"
;
JetOLEDB:
Systemdatabase=\"
RegistryPath=\"
DatabasePassword=\"
EngineType=5;
DatabaseLockingMode=1;
GlobalPartialBulkOps=2;
GlobalBulkTransactions=1;
NewDatabasePassword=\"
CreateSystemDatabase=False;
EncryptDatabase=False;
Don'
tCopyLocaleonCompact=False;
CompactWithoutReplicaRepair=False;
SFP=False"
//MSSQL
pConn->
Provider=SQLNCLI10.1;
IntegratedSecurity=\"
PersistSecurityInfo=False;
UserID=cpp;
InitialCatalog=cppwork;
DataSource=(local);
UseProcedureforPrepare=1;
AutoTranslate=True;
PacketSize=4096;
WorkstationID=LZY;
InitialFileName=\"
UseEncryptionforData=False;
Tagwithcolumncollationwhenpossible=False;
MARSConnection=False;
DataTypeCompatibility=0;
TrustServerCertificate=False"
Open("
"
"
adConnectUnspecified);
pCmd->
put_ActiveConnection(_variant_t((IDispatch*)pConn));
CommandText=(_bstr_t)querycommand;
pRst=pCmd->
Execute(NULL,NULL,adCmdText);
}
catch(_com_errore)
{}
if(switchint==1)
{
m_list.DeleteAllItems();
intcount=0;
while(!
pRst->
rsEOF)
{
m_list.InsertItem(count,_T("
data"
));
m_list.SetItemText(count,1,(_bstr_t)pRst->
GetCollect("
id"
m_list.SetItemText(count,2,(_bstr_t)pRst->
number"
m_list.SetItemText(count,3,(_bstr_t)pRst->
name"
m_list.SetItemText(count,4,(_bstr_t)pRst->
cellphonenumber"
m_list.SetItemText(count,5,(_bstr_t)pRst->
cardnumber"
m_list.SetItemText(count,6,(_bstr_t)pRst->
address"
pRst->
MoveNext();
//下移一个
count++;
}
pRst->
Close();
//关闭对象
pConn->
pCmd.Release();
//释放对象
pRst.Release();
pConn.Release();
CoUninitialize();
//卸载COM组件
}
3.1.2控件绑定变量及初始化变量
CtestmfcDlg:
CtestmfcDlg(CWnd*pParent/*=NULL*/)
:
CDialogEx(CtestmfcDlg:
IDD,pParent)
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
m_edit=_T("
select*frommain"
);
m_query1=_T("
DoDataExchange(CDataExchange*pDX)
CDialogEx:
DoDataExchange(pDX);
DDX_Text(pDX,IDC_EDIT1,m_edit);
DDX_Control(pDX,IDC_LIST5,m_list);
DDX_Control(pDX,IDC_COMBO2,m_cb);
DDX_Text(pDX,IDC_EDIT2,m_query1);
BEGIN_MESSAGE_MAP(CtestmfcDlg,CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1,&
OnBnClickedButton1)
ON_BN_CLICKED(IDOK,&
OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON3,&
OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON2,&
OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON4,&
OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5,&
OnBnClickedButton5)
ON_CBN_SELCHANGE(IDC_COMBO2,&
OnCbnSelchangeCombo2)
ON_EN_CHANGE(IDC_EDIT1,&
OnEnChangeEdit1)
ON_NOTIFY(NM_DBLCLK,IDC_LIST5,&
OnDblclkList5)
ON_BN_CLICKED(IDCANCEL,&
OnBnClickedCancel)
ON_BN_CLICKED(IDC_BUTTON6,&
OnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON7,&
OnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON8,&
OnClickedButton8)
END_MESSAGE_MAP()
3.1.3程序初始化工作
BOOLCtestmfcDlg:
OnInitDialog()
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
BOOLbNameValid;
CStringstrAboutMenu;
bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if(!
strAboutMenu.IsEmpty())
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);
//设置大图标
SetIcon(m_hIcon,FALSE);
//设置小图标
在此添加额外的初始化代码
m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
m_list.InsertColumn(0,L"
0,0,0);
m_list.InsertColumn(1,L"
索引编号"
LVCFMT_LEFT,100);
m_list.InsertColumn(2,L"
学号"
m_list.InsertColumn(3,L"
姓名"
m_list.InsertColumn(4,L"
手机号"
m_list.InsertColumn(5,L"
身份证号"
LVCFMT_LEFT,140);
m_list.InsertColumn(6,L"
地址"
LABLE:
logindlg;
dlg.m_statue=L"
学生信息管理系统——登陆"
if(dlg.DoModal()==IDOK)
CStringqstr=L"
select*fromloginwhereusername='
+dlg.m_username+"
'
sqlquery(2,qstr);
intcount=m_list.GetItemCount();
if(count>
0)
if(dlg.m_username==m_list.GetItemText(0,2)&
&
dlg.m_password==m_list.GetItemText(0,3))
{
}
else
AfxMessageBox(L"
用户名或者密码错误"
gotoLABLE;
else
AfxMessageBox(L"
gotoLABLE;
else
CDialogEx:
OnCancel();
m_cb.AddString(L"
编号"
m_cb.SetCurSel(0);
CStringcs;
GetDlgItem(IDC_EDIT1)->
GetWindowTextW(cs);
sqlquery(1,cs);
returnTRUE;
//除非将焦点设置到控件,否则返回TRUE
3.1.4新增按钮操作的函数
OnBnClickedButton2()
DataOperationdlg;
intx=m_list.GetItemCount();
m_list.InsertItem(x,_T("
m_list.SetItemText(x,2,dlg.m_number);
m_list.SetItemText(x,3,dlg.m_name);
m_list.SetItemText(x,4,dlg.m_cellnumber);
m_list.SetItemText(x,5,dlg.m_cardnumber);
m_list.SetItemText(x,6,dlg.m_address);
CStringcmd=L"
insertintomain([number],[name],[cellphonenumber],[cardnumber],[address])values('
+dlg.m_number+"
'
+dlg.m_name+"
+dlg.m_cellnumber+"
+dlg.m_cardnumber+"
+dlg.m_address+"
)"
sqlquery(0,cmd);
3.1.5修改按钮操作的函数
OnBnClickedButton4()
CStringstr;
intselectrow=-1;
boolisselect=false;
for(inti=0;
i<
m_list.GetItemCount();
i++)
if(m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)
selectrow=i;
isselect=true;
if(isselect)
str=m_list.GetItemText(selectrow,1);
if(str!
="
)
DataOperationdlg;
dlg.m_number=m_list.GetItemText(selectrow,2);
dlg.m_name=m_list.GetItemText(selectrow,3);
dlg.m_cellnumber=m_list.GetItemText(selectrow,4);
dlg.m_cardnumber=m_list.GetItemText(selectrow,5);
dlg.m_address=m_list.GetItemText(selectrow,6);
if(dlg.DoModal()==IDOK)
{
m_list.SetItemText(selectrow,2,dlg.m_number);
m_list.SetItemText(selectrow,3,dlg.m_name);
m_list.SetItemText(selectrow,4,dlg.m_cellnumber);
m_list.SetItemText(selectrow,5,dlg.m_cardnumber);
m_list.SetItemText(selectrow,6,dlg.m_address);
CStringcmd=L"
update[main]set[number]='
[name]='
[cellphonenumber]='
[cardnumber]='
[address]='
where[id]='
+m_list.GetItemText(selectrow,1)+"
sqlquery(0,cmd);
修改成功"
sqlquery(1,L"
刷新数据中,请再选择一次"
sqlquery(1,L"
AfxMessageBox(L"
请用鼠标单击要操作的行,然后再按此按钮"
3.1.6删除按钮操作的函数
OnBnClickedButton3()
str=m_list.GetItemText(selectrow,2);
if(str!
CStringdelstr=L"
deletefrommainwhere[number]='
+str+"
m_list.SetItemText(selectrow,1,L"
此行已删除"
m_list.SetItemText(selectrow,2,L"
m_list.SetItemText(selectrow,3,L"
m_list.SetItemText(selectrow,4,L"
m_list.Se