【文档说明】第11章数据库应用系统开发课件.ppt,共(84)页,888.000 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92333.html
以下为本文档部分文字说明:
1第11章数据库应用系统开发2主要内容11.1数据库应用系统开发的基本步骤11.2学生信息管理系统开发案例P263311.1数据库应用系统开发的基本步骤1.可行性分析(是否必要)2.需求分析(信息的收集、分析整理、评审)3.概要设计(将需求分析的结果转化为数据结构和软件的系统结构)4.详细设
计(为每一个模块确定使用的算法和数据结构)5.代码设计6.测试维护7.系统交付411.2学生信息管理系统开发案例11.2.1系统设计11.2.2设计工程框架11.2.3系统功能模块实现511.2.1系统设计1.系统功能分析学生信息管理系统的主要任务是实现对学校
各院系和所有学生的系统管理,主要功能包括:(1)院系信息管理(2)学生基本信息管理(3)学生照片管理(4)课程设置管理(5)学生成绩管理(6)系统用户管理62.功能模块划院系信息管理用户信息管理学生信息管理系统学生基本信息管理学生照片
管理学生信息管理学生成绩管理课程设置管理73.系统流程分析确定用户类型管理自己的用户密码管理自己的用户密码管理普通用户的信息院系信息管理学生信息管理课程信息管理学生成绩管理用户登录失败超过3次退出系统开始失败否,重试是普通用户系统用户用户管理模块成功84.数据库设计数据库
的设计涉及数据表字段、字段约束关系、字段间的约束关系、表间约束关系等方面。Student_db数据库包含4个表:院系信息表D_Info学生基本信息表St_Info课程设置表C_Info选课信息表S_C_Info。增加一个用户密码表911.2.2设计工
程框架一个工程由各种类型的文件组成,如vbp(工程文件)、frm(窗体文件)、bas(标准模块文件)等窗体、模块和类模块是VB的重要资源。窗体用来实现工程的外观显示模块用来管理全局变量、变量和用户自定义函数等。(工程\添加模块)10VB的3种模块:窗体模块,标准模块
,类模块窗体模块:简单的程序只有一个模块,程序的代码都存放在这个模块中。标准模块:为了避免重复,可以将多个窗体都要用到的共同代码集中起来,存放在一个独立的模块中。类模块:是面向对象编程的基础。用户可以使用类模块创建含有属性和方法的自己的对
象。一般的类模块和标准模块都没有可见的用户界面(窗体)。11标准模块与类模块的区别模块(Module)就是VB中公共函数、子程序、常数、变量、枚举和用户定义类型的集合。模块中的程序可以被整个程序访问。通常,用到某个模块的程序时,该模块才被加载。类模块(Class)是VB中对象
的模版,它定义了对象的方法、属性和事件。只有用类创建对象时,类模块被加载。只能用对象语法操作类模块中的程序,它是VB数据封装的有效手段。12模块文件的建立模块命名为MStM,保存为MStM.bas文件到StuP目录下:Publ
icstrCNoAsString'在窗体之间传递课程编号PublicvStrStIDAsStringPublicAddEditAsBoolean'判断是增加记录还是修改记录,True--添加,False--修改Co
nstBlockSize=2048'数据块的大小,用于照片的读写操作PublicTempFileAsString'将图像装入Image控件的临时文件名的路径变量PublicstrUserName'存储当前登录系统的用户名,
用于控制各种模块是否能执行PublicSubMain()TempFile="D:\tmpf.dat"mfrmMain.ShowfrmLogin.Show1'模式的作用是先执行完frmlogin窗体才可执行其他窗体EndS
ub1311.2.3系统功能模块实现系统按功能可分为:主界面模块登录模块学生基本信息管理模块学生成绩管理模块用户管理模块课程信息管理模块等。141.主界面实现15建立MDI窗体①将窗体命名为mfrmMain
,其Caption属性设置为“学生信息管理系统”MDI窗体(多重窗体)是指一个包含多个子窗体的父窗体。例:窗体名.Show();一个工程只能有一个MDI,建立一个MDI后,将普通的窗体的MDIChild属性设为真
,则该窗体就变成MDI的子窗体。②建立系统菜单。162.系统登录窗体设计用户要使用本系统,首先必须通过系统的身份认证,这个过程叫做登录。登录过程需要完成以下任务:(1)根据用户名和密码来判断是否可以进入系统;(2)根据用户类型决定用户拥有的权限。登录窗体为frmLogin17(1)公用变量。在fr
mLogin窗体的声明部分加入以下代码:PublicTryTimesAsInteger变量TryTimes记录用户登录尝试次数。18(2)身份验证。P272代码当用户单击“确定”按钮时,将触发cmdOk_Click事件,进行身份验证。身份验证时,把当
前用户输入的用户名和密码(存放在txtUserName和txtPwd控件中)与数据表Users中的对应用户进行比较:若用户名不正确,表示不存在该用户,不能登录;若只有密码不正确,则可以尝试三次,再不正确时,退出应用程序。1
9(3)取消操作。P273PrivateSubcmdCancel_Click()txtUserName=""txtPwd=""txtUserName.SetFocusEndSub(4)按回车键实现身份验证。Pr
ivateSubtxtPwd_KeyPress(KeyAsciiAsInteger)IfKeyAscii=13Then‘回车键的码值cmdOk_ClickEndIfEndSub20(5)调用登录窗体。登录窗体的代码设计完成后,可以在Main过程中加入以下代码:PublicSubMain()
TempFile="D:\tmpf.dat"mfrmMain.ShowfrmLogin.Show1EndSub21(6)重新登录。在系统运行过程中,若要更新用户,则需要重要登录。这可以通过“文件\重新登录”菜单项调
用frmLogin窗体,而不必退出系统,其代码如下:PrivateSubmnuReLg_Click()frmLogin.Show1EndSub其中mnuReLg为“重新登录”菜单项控件名称223.学生基本信息管理模块设计学生基本信
息管理模块实现以下功能:添加学生记录;修改学生基本信息;删除学生记录;查看学生基本信息。23Form_Load事件(P276)当frmStuM窗体载入时,需要使院系组合框cmbClg、班级列表框lstClass、学生列表框lstStName都显示一个初始值:PrivateSubForm_
Load()strClg=adoClg.Recordset.Fields("D_ID")adoClass.RecordSource="SELECTDISTINCTCl_NameFROMst_infoWHERE"_"SUBSTRING(St_I
d,1,2)='"&strClg&"'"adoClass.RefreshstrClass=""IfNotadoClass.Recordset.EOFThenstrClass=adoClass.Recordset.Fields("Cl_Name")EndIfadoNam
e.RecordSource="SELECT*FROMSt_InfoWHERECl_Name='"&strClass&"'"adoName.RefreshEndSub24(1)选择学生记录在frmStuM窗体中,学生的选择通
过数据绑定组合框(DataCombo)控件cmbClg确定院系,数据绑定列表框(DataList)控件lstClass确定班级,控件lstStName确定学生。25①院系选择。(P276)当鼠标单击控件cmbClg时,选择一个院
系名称,将使整个窗体数据随之而发生改变。PrivateSubcmbClg_Change()strClg=cmbClg.BoundTextadoClass.RecordSource="SELECTDISTINCTCl_NameFROMSt
_InfoWHERE"_SUBSTRING(St_Id,1,2)='"&strClg&"'"adoClass.RefreshlstClass_ClickEndSub26②班级选择。(P277)lstClass_Click事件的代码如下:PrivateSublstClass_Click
()strClass=lstClass.BoundTextIfstrClass=""AndNotadoClass.Recordset.EOFThenstrClass=adoClass.Recordset.Fi
elds("Cl_Name")EndIfadoName.RecordSource="SELECT*FROMSt_InfoWHERECl_Name='"&strClass&"'"adoName.RefreshlstStName_ClickEndSub2
7③学生姓名选择。(P277)lstStName_Click事件代码如下:PrivateSublstStName_Click()strName=Trim(lstStName.BoundText)IfstrName=""AndNotadoName.Recordset.EOFThenstr
Name=adoName.Recordset.Fields("st_id")EndIfadoStDetail.RecordSource="SELECT*FROMSt_InfoWHERESt_Id='"&strName&"'"adoSt
Detail.RefreshCallShowImage(ImgPhoto,adoStDetail)EndSub28(2)添加学生基本信息(P278)用户单击frmStuM的“添加学生”按钮时,执行cmdAdd_Click事件,其代码如下:PrivateSubcmdAdd_Clic
k()frmStAdd.Show1EndSubfrmStAdd窗体29①窗体载入。(P279)当窗体frmStAdd载入时,应使用adoEdit控件的Recordset处于添加数据状态,其代码如下:PrivateSubForm_Activate()ad
oEdit.Recordset.AddNewtxtStID.SetFocusEndSub30②日期输入。件txtBDate与ADOData控件adoEdit绑定,显示St_Info表的Born_Date字段。但使用文本框输入日期,对用户来
说很不方便,而且有可能输入无效日期数据,为此使用DateTimePicker控件为字段Born_Date提供格式化日期,使得日期选择操作很简单。31dtpBDate_Change事件(P279)选择的日期填充到txtBDate控件中的代码如下:PrivateSubtxtB
Date_GotFocus()dtpBDate.Visible=TrueEndSubPrivateSubdtpBDate_Change()txtBDate.Text=dtpBDate.ValueEndSub3
2③性别选择。与日期型数据相似,性别的选择可以使用ComboBox控件并绑定在adoEdit控件记录集的St_Sex字段上,其List属性在设计时输入男女两个选项,运行时用户可在下拉列表中选择,即方便快捷又不容易出错。33④电话号码输入。(P280)电话号码为数字字符,在输入
时应限制用户只能输入数字0~9,这可通过函数In_Int进行数据检查,在txtTel_KeyPress事件中实现PrivateSubtxtTel_KeyPress(KeyAsciiAsInteger)IfIn_Int(KeyAscii)=Fals
eThenMsgBox"电话号码应为数字",,"输入错误"KeyAscii=0EndIfEndSubPublicFunctionIn_Int(KeyAsciiAsInteger)AsBooleanIfChr(KeyAscii)>="0"AndChr
(KeyAscii)<="9"ThenIn_Int=TrueElseIn_Int=FalseEndIfEndFunction34⑤数据保存。(P280)当用户在frmStAdd窗体上完成了所有数据的输入后,
通过ADOData控件的Recordset方法Update将数据保存到表St_Info中,该操作由命令按钮cmdAdd_Click事件实现,其代码如下:PrivateSubcmdAdd_Click()IftxtStID=""OrtxtStName=
""OrtxtClName=""ThenMsgBox"学号、姓名或班级不能为空!",,"数据输入错误"ExitSubEndIfadoEdit.Recordset.UpdateadoEdit.Recordset.MoveLastfrmStuM.adoStDetail.Refresh
frmStuM.RcdUpdate(adoEdit.Recordset.Fields("St_Id"))UnloadMeEndSub35frmStuM窗体的RcdUpdate过程(P280)SubRcdUpdate(ByValvStIDAsString)strClg=Le
ft(Trim(vStID),2)adoClass.RecordSource="SELECTDISTINCTCl_NameFROMSt_Info"_&"WHERESUBSTRING(St_Id,1,2
)='"&strClg&"'"adoClass.RefreshadoName.RecordSource="SELECT*FROMSt_InfoWHERECl_Name="_&"(SELECTDISTINCTCl_NameFROMSt_InfoWHERESt_Id='"&Trim
(vStID)&"')"adoName.RefreshadoStDetail.RecordSource="SELECT*FROMSt_InfoWHERESt_Id='"&Trim(vStID)&"'"adoStDetail
.RefreshadoStDetail.Recordset.Find"St_Id='"&vStID&"'"EndSub36(3)修改学生记录的功能实现(P281)当前单击frmStuM窗体的“修改信息”按钮,执行cmdEdi
t_Click事件,其代码如下:PrivateSubcmdEdit_Click()vStrStID=Trim(adoStDetail.Recordset.Fields("St_Id"))frmStEdit.Show1EndSub37frmStEdit窗体用于显示当前选择的学生基本信息,并进行数据的
修改。(P281)PrivateSubForm_Load()adoEdit.RecordSource="SELECT*FROMSt_InfoWHERESt_Id='"&vStrStID&"'"adoEdit.RefreshEndSub38(4)删除学生记录(P281)当用户单击
frmStuM窗体的“删除学生”按钮时,将触发cmdDel_Click事件:PrivateSubcmdDel_Click()'检查是否选择要删除的学生记录IflstStName.BoundText=""Then
MsgBox"请选择要删除的学生",,"删除学生"ExitSubEndIfIfMsgBox("学生姓名:"+lbName+Chr(13),vbYesNo,"是否删除")=vbNoThenExitSubEndIfadoStDetail.Recordset.Delet
eadoStDetail.Recordset.MoveNextlstClass_ClickEndSub39(5)照片管理照片管理包括照片的显示、添加、删除等功能。①显示与存储照片子过程。设计两个过程ShowIma
ge和SaveImage,用来管理数据库读写图像字段的操作,其代码如下:40过程ShowImage(P282)PublicSubShowImage(Image1AsImage,Adodc1AsAdodc)Dim
ByteChunk()AsByteFieldSize=Adodc1.Recordset.Fields("Photo").ActualSizeIfFieldSize<=0ThenImage1.Picture=LoadPicture("")ExitSubEndIfSo
urceFile=FreeFileOpenTempFileForBinaryAccessWriteAsSourceFileNumBlocks=FieldSize\BlockSizeLeftOver=FieldSizeModIfLeftOv
er<>0ThenReDimByteChunk(LeftOver)AsByteByteChunk()=Adodc1.Recordset.Fields("Photo").GetChunk(LeftOver)PutSourc
eFile,,ByteChunk()EndIfFori=1ToNumBlocksReDimByteChunk(BlockSize)AsByteByteChunk()=Adodc1.Recordset.Fields("Photo").GetChunk(BlockSize)
PutSourceFile,,ByteChunk()NextiCloseSourceFileImage1.Picture=LoadPicture(TempFile)Kill(TempFile)EndSub41SaveImage过程(P283)PublicSubSaveImage
(ByValImageFileAsString,Adodc1AsAdodc)IfAdodc1.Recordset.BOF=TrueOrAdodc1.Recordset.EOF=TrueThenExitSub
EndIfIfImageFile=""ThenExitSubEndIfSourceFile=FreeFileOpenImageFileForBinaryAccessReadAsSourceFile'打开文件File
Length=LOF(SourceFile)IfFileLength=0ThenCloseSourceFileMsgBoxdisfile&"无内容或不存在!"ElseNumBlocks=FileLength\BlockSizeLeftOver=FileLengthModBlo
ckSize'得到剩余字节数Adodc1.Recordset.Fields("photo").Value=NullReDimByteData(BlockSize)AsByte'重新定义数据块的大小Fori=1ToNumBlocksGetSourceFile,,B
yteData()'读到内存块中Adodc1.Recordset.Fields("photo").AppendChunkByteData()'写入FLDNextiReDimByteData(LeftOver)AsByte'重新定义内存块的大小GetSourceFile,,
ByteData()'读到内存块中Adodc1.Recordset.Fields("photo").AppendChunkByteData()'写入FLDCloseSourceFileAdodc1.R
ecordset.UpdateEndIfEndSub42②建立照片管理快捷菜单。在frmStuM窗体中,ImgPhoto控件用于显示学生照片,当鼠标右击ImgPhoto控件时,弹出快捷菜单,快捷菜单由窗体frmPhotoMenu构
成43Label1_Click事件实现添加照片功能(P284)PrivateSubLabel1_Click()DimDiskFileAsStringCommonDialog1.Filter="JPEG文件(*.jpg)|*.jpg|BMP文件(*.bmp)|*.
bmp|GIF文件(*.gif)|*.gif"CommonDialog1.ShowOpenDiskFile=CommonDialog1.FileNameIfDiskFile=""ThenMsgBox"请选择照片文件",,"照片管理"UnloadMeExitSubEndIfCallSav
eImage(DiskFile,frmStuM.adoStDetail)CallShowImage(frmStuM.ImgPhoto,frmStuM.adoStDetail)UnloadMeEndSub44Label2_Click事件实现删除照片(P285)PrivateSub
Label2_Click()frmStuM.adoStDetail.Recordset.Fields("photo").AppendChunk""frmStuM.adoStDetail.Recordset.UpdatefrmStuM.ImgPhoto.P
icture=LoadPicture("")UnloadMeEndSub45③弹出快捷菜单。(P285)当鼠标右击frmStuM窗体的ImgPhoto控件时,通过ImgPhoto_MouseDown事件过程实现快捷菜单的弹出操作PrivateSubImgPhoto_Mo
useDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1ThenIffrmPhotoMenu.Visible=TrueThenUnloadfrmPhotoMenuEnd
IfEndIfIfButton=2ThenIffrmStuM.adoStDetail.Recordset.EOF=TrueOrfrmStuM.adoStDetail.Recordset.BOF=TrueThenExitSubEndIffrmPhotoMenu.Left=X+ImgPhoto.Le
ft+2000frmPhotoMenu.Top=Y+ImgPhoto.Top+500frmPhotoMenu.ShowEndIfEndSub46(6)通过主界面调用学生基本信息管理窗体(P285)当设计好了学生基本信息管理窗体frmStuM后,就可以通过主界面mfrmMain窗体的
“学生信息”菜单项来调用它,其代码如下:PrivateSubmnuStInfo_Click()frmStuM.ShowEndSub474.课程设置课程设置管理模块可以实现以下功能:添加课程信息;修改课程信息;删除课程信息;查看课程信息。48在Form_Load事件(P287)P
rivateSubForm_Load()adoCourseLst.RecordSource="SELECT*FROMC_InfoORDERBYC_Name"adoCourseLst.RefreshlstCName_Click
EndSub49lstCName_Click事件过程PrivateSublstCName_Click()strCNo=Trim(lstCName.BoundText)IfstrCNo=""ThenIfNotadoCourseLst.Recordset.E
OFOrNotadoCourseLst.Recordset.BOFThenstrCNo=Trim(adoCourseLst.Recordset.Fields("C_No"))EndIfEndIfadoCourse.RecordSource="SELECT*FROMC
_InfoWHEREC_No='"_&strCNo&"'ORDERBYC_Name"adoCourse.RefreshEndSub50(1)添加修改课程信息51①添加与修改课程记录。当用户单击frmCourse
M窗体的“添加课程”按钮时,设置AddEdit变量值为True,调用frmCourseEdit窗体PrivateSubcmdAdd_Click()AddEdit=True'添加记录frmCourseEdit.Show1EndSub52修改课程当用户单击frmCourseM窗体的“
修改课程”按钮时,设置AddEdit变量值为False,也调用frmCourseEdit窗体PrivateSubcmdEdit_Click()AddEdit=FalsestrCNo=lstCName.BoundTextIfstrCNo=""ThenMsgBox"请选择课程",,"信息"ExitSu
bEndIffrmCourseEdit.Show1EndSub53②建立编辑课程信息窗体。frmCourseEdit窗体载入时,根据AddEdit的值确定该窗体是添加记录还是修改已有记录。DimmBookmarkAsVariantPrivateSubForm_Load()IfAddE
ditThenadoLesson.Recordset.AddNewElseadoLesson.RecordSource="SELECT*FROMC_InfoWHEREC_No='"&strCNo&"'"adoLesson.R
efreshEndIfmBookmark=adoLesson.Recordset.BookmarkEndSub54③保存编辑的课程信息。当用户在frmCourseEdit窗体输入或修改了课程信息后,单击“确认”按钮以保存信息,cmdOk_Click事件代码如下:PrivateSubc
mdOk_Click()IfTrim(txtCCredit.Text)=""OrTrim(txtCNo.Text)=""OrTrim(txtCName.Text)=""ThenMsgBox"数据不完整,课程编号、课程名
称或学分不能为空!",,"输入错误"ExitSubEndIfadoLesson.Recordset.UpdateadoLesson.Recordset.MoveLastfrmCourseM.RcdUpdate(Trim(txtCNo.Text))UnloadMeEndSub55frmCou
rseM.RcdUpdate过程PublicSubRcdUpdate(ByValvStrCNoAsString)adoCourseLst.RecordSource="SELECT*FROMC_InfoORDE
RBYC_Name"adoCourseLst.RefreshadoCourse.RecordSource="SELECT*FROMC_InfoWHEREC_No='"_&vStrCNo&"'ORDERBYC_Name
"adoCourse.RefreshadoCourseLst.Recordset.Find"c_no='"&vStrCNo&"'"EndSub56(2)删除课程信息当用户单击frmCourseM窗体的“删除课程”按钮,触发cmdDel
_Click事件PrivateSubcmdDel_Click()IfTrim(lstCName.BoundText)=""ThenMsgBox"请选择要删除的课程"ExitSubEndIfIfMsgBox("课
程名称:"+lstCName.Text+Chr(13),vbYesNo,"是否删除")=vbNoThenExitSubEndIfadoCourse.Recordset.DeleteadoCourseLst.Re
cordSource="SELECT*FROMC_InfoORDERBYC_Name"adoCourseLst.RefreshadoCourse.RecordSource="SELECT*FROMC_Info
WHEREC_No='"_&Trim(adoCourseLst.Recordset.Fields("c_no"))&"'ORDERBYC_Name"adoCourse.RefreshEndSub57(3)课程设置模块的调用课程设置由mfrmMain窗体的“课
程信息”菜单项控件mnuCourse调用,其代码如下:PrivateSubmnuCourse_Click()frmCourseM.ShowEndSub585.成绩管理学生成绩管理包含两个子菜单:成绩编辑与成绩查询。成绩编辑实现添加、删
除、修改学生成绩等功能,成绩查询可以查询一个学生所有选修课程的成绩。59(1)成绩编辑成绩编辑窗体命名为frmScoreM60①窗体载入。PrivateSubForm_Load()adoDCScore.RecordSource="SELECTDISTINCT
Cl_NameFROMSt_Info"adoDCScore.RefreshWhileNotadoDCScore.Recordset.EOFcmbCls.AddItem(adoDCScore.Recordse
t.Fields("Cl_Name"))adoDCScore.Recordset.MoveNextWendstrCNo=adoCourse.Recordset.Fields("C_No")RefreshGridEndSub61②Data
Grid控件刷新子过程。RefreshGrid过程用于DataGrid控件显示数据的刷新,其代码如下:SubRefreshGrid()adoDCScore.RecordSource="SELECTs.St_Idas学号,s.St_Name
as姓名,"_&"sc.Scoreas成绩FROMSt_Infos,S_C_Infosc"_&"WHEREs.Cl_Name='"+Trim(cmbCls.Text)_&"'ands.St_Id=sc.St_Idandsc.C_No='"_&Trim(
strCNo)&"'"adoDCScore.RefreshgrdScore.RefreshEndSub62③班级选择。当用户单击控件cmbCls选择某一班级时,将触发cmbCls_Click事件,在grdScore中显示该所有学生的cmbCName控件
所选择的课程的成绩PrivateSubcmbCls_Click()RefreshGridIfadoDCScore.Recordset.EOFAndadoDCScore.Recordset.BOFThenMsgBoxcmbCls.Text&"无"&cmbCName.Text&"成
绩",,"成绩信息"EndIfEndSub63④课程选择。当用户单击cmbCName控件,重新选择课程名称时,触发cmbCName_Change事件,在grdScore中重置该课程、cmbCls控件
所班级的所有学生的成绩PrivateSubcmbCName_Change()strCNo=cmbCName.BoundTextRefreshGridEndSub64⑤成绩编辑。当用户单击“添加成绩”时,将调用frmScoreEdit窗体为cmbCls所选班级的学生添加
cmbCName控件所选课程的成绩PrivateSubcmdAdd_Click()IfcmbCName.Text=""OrcmbCls.Text=""ThenMsgBox"请选择课程名称与班级",,"添加成绩"
ExitSubEndIfAddEdit=TruefrmScoreEdit.Show1RefreshGridEndSub65修改成绩当用户单击“修改成绩”按钮时,将在frmScoreEdit窗体上显示在fr
mScoreM窗体的grdScore网格中选择的学生为成绩信息给用户修改PrivateSubcmdEdit_Click()IfadoDCScore.Recordset.EOFAndadoDCScore.Recordset.BOFThenMs
gBox"请选择学生成绩",,"修改成绩"ExitSubEndIfAddEdit=FalsefrmScoreEdit.Show1RefreshGridEndSub66⑥建立成绩编辑窗体。67初始化窗体DimstrCidAsStringDi
mstrCourseAsStringDimstrClNameAsStringDimstrStIDAsStringPrivateSubForm_Load()strClName=Trim(frmScoreM.cmbCls.Text)
strCourse=Trim(frmScoreM.cmbCName.Text)strCid=Trim(frmScoreM.cmbCName.BoundText)lbCName.Caption=strCourselbClass.Caption=strClNameIfAddEditThenadoS
tName.RecordSource="SELECT*FROMSt_InfoWHERECl_Name='"&strClName_&"'ANDSt_IdNOTIN(SELECTSt_IdFROMS_C_InfoWHEREC_No='"_&strCid&"'
)"adoStName.RefreshadoScore.RecordSource="SELECT*FROMS_C_info"adoScore.RefreshtxtScore=""ElsestrStID=frmScoreM.adoDCScore.Recordset.Fields("
学号")adoStName.RecordSource="SELECT*FROMSt_InfoWHERESt_Id='"&strStID&"'"adoStName.RefreshadoScore.RecordSource="SELECT*FROMS_C_InfoWHERESt_Id=
'"&strStID_&"'ANDC_No='"&strCid&"'"adoScore.RefreshcmbStName.Text=adoStName.Recordset.Fields("St_Name")txtScore=adoScore.Recordset.Fields("Sc
ore")EndIfEndSub68cmdOk_Click事件当用户单击frmScoreEdit窗体的“确定”按钮时,触发,将保存用户添加或修改后的数据到S_C_Info表中PrivateSubcmdOk_Click()IfcmbStName.Text=""Ort
xtScore=""ThenMsgBox"没有选择学生或没有成绩",,"添加成绩"ExitSubEndIfIfAddEditThenadoScore.Recordset.AddNewadoScore.Reco
rdset.Fields("St_Id")=Trim(adoStName.Recordset.Fields("st_id"))adoScore.Recordset.Fields("C_No")=Trim(strCid)adoScore.Rec
ordset.Fields("Score")=txtScoreadoScore.Recordset.UpdateadoStName.RecordSource="SELECT*FROMSt_InfoWHERECl_Name='"&
strClName_&"'ANDSt_IdNOTIN(SELECTSt_IdFROMS_C_InfoWHEREC_No='"_&strCid&"')"adoStName.RefreshtxtScore=""ElseadoScore.Recordset.Fields("Scor
e")=txtScoreadoScore.Recordset.UpdateEndIfEndSub69⑦成绩删除。当用户单击frmScoreM窗体“删除成绩”按钮时,触发cmdDel_Click事件PrivateSubcmdDel_Click()IfadoDCSc
ore.Recordset.BOFAndadoDCScore.Recordset.EOFThenMsgBox"请选择要删除的成绩",,"删除成绩"ExitSubEndIfIfMsgBox("学生姓名:"+adoDCScore.Recordset.Fields("
姓名")+Chr(13),_vbYesNo,"是否删除")=vbNoThenExitSubEndIfstrStID=adoDCScore.Recordset.Fields("学号")strCNo=Trim(cmbCName.BoundText)adoDCScore
.RecordSource="SELECT*FROMS_C_InfoWHEREST_id='"&strStID_&"'ANDC_No='"&strCNo&"'"adoDCScore.RefreshadoDCScore.Recordset.DeleteRefr
eshGridEndSub70(2)成绩查询frmScoreQ窗体71Form_Load事件PrivateSubForm_Load()adoDCScore.RecordSource="SELECTDISTINCT
Cl_NameFROMSt_Info"adoDCScore.RefreshWhileNotadoDCScore.Recordset.EOFcmbCls.AddItem(adoDCScore.Recordset.Fields("Cl_Name"))adoDC
Score.Recordset.MoveNextWendcmbCls.ListIndex=0cmbCls_ClickSetgrdScore.DataSource=adoDCScorevStrStID=ado
StName.Recordset.Fields("St_Id")RefreshGridEndSub72班级通过cmbCls.AddItem方法添加到组合框的List中PrivateSubcmbCls_Click()adoStName.RecordSource="SELECT*FRO
MSt_InfoWHERECl_Name='"_&Trim(cmbCls.Text)&"'"adoStName.RefreshadoStName.Recordset.MoveFirstcmbStName_Click0EndSub73使当前记录为第一条cmbStName
_Click事件PrivateSubcmbStName_Click(AreaAsInteger)vStrStID=cmbStName.BoundTextRefreshGridEndSub74RefreshGrid过程cmbStName.BoundT
ext的绑定值为显示的学生姓名的对应学号,以此通过RefreshGrid过程更新grdScore的数据为选定班级选定学生的所修课程的成绩。SubRefreshGrid()adoDCScore.RecordSource="SELECTc.C_NoAS课程编号,c.C_Name
AS课程名称,"_&"sc.ScoreAS成绩FROMC_Infoc,S_C_Infosc"_&"WHEREsc.C_No=c.C_NoANDsc.St_Id='"&Trim(vStrStID)&"'"
adoDCScore.RefreshgrdScore.RefreshEndSub756.用户管理根据用户类型的不同,用户管理模块的功能也不相同,可以包含以下情形:(1)系统管理员(用户名为admin)用户可以创建普通用
户,对普通用户的用户名和密码进行修改,删除普通用户;(2)admin用户也可以修改自身的密码;(3)普通用户只能修改自身的密码。76frmUserM窗体初始化PrivateSubForm_Load()IfstrUserName="admin"ThenlbUs
erType="系统管理员"ElselbUserType="普通用户"EndIfEndSub77(1)查看用户信息PrivateSublstUserName_Click()'如果没有选择用户名,则返回IfTrim(lstUse
rName.Text)=""ThenExitSubEndIf'设置用户名lbUserName=Trim(lstUserName.BoundText)'设置用户类型IflbUserName="admin"Th
enlbUserType="系统管理员"ElselbUserType="普通用户"EndIfEndSub78(2)添加修改用户PrivateSubcmdAdd_Click()AddEdit=TruefrmUserEdit.Show1EndSub79
修改用户信息PrivateSubcmdEdit_Click()AddEdit=FalseIflstUserName.BoundText=""ThenMsgBox"请选择要删除的用户",,"修改用户"ExitSubEndIfIflstUserName.BoundText="admin
"ThenfrmUserEdit.txtUserName.Enabled=FalsefrmUserEdit.txtUserName.BackColor=&H8000000FElsefrmUserEdit.txtUserName.Enabled=TruefrmUserE
dit.txtUserName.BackColor=&H80000009EndIffrmUserEdit.Show1EndSub80frmUserEdit窗体81Form_Load事件PrivateSubForm_Load()'
如果是普通用户,则不能修改用户名,只能修改密码IfNotAddEditThenIfstrUserName<>"admin"ThentxtUserName.Text=strUserNametxtUserName.BackColor=&H8000000F
txtUserName.Enabled=FalseElsetxtUserName.Text=frmUserM.lstUserName.BoundTextEndIfadoUser.RecordSource="SELECT*FROMUsersWHEREUsername='"_&Tri
m(txtUserName)&"'"adoUser.RefreshEndIfEndSub82mnuUser_Click事件代码PrivateSubmnuUser_Click()IfstrUserName="admin"ThenfrmUserM.ShowElsefrmUserEdit.Sh
ow1EndIfEndSub83cmdOk_Click事件对添加的用户或修改的用户信息进行保存PrivateSubcmdOk_Click()IfTrim(txtUserName)=""ThenMsgB
ox"请输入用户名"txtUserName.SetFocusExitSubEndIfIfLen(Trim(txtPwd))<6ThenMsgBox"密码长度不能小于6"txtPwd.SetFocustxtPwd.SelStart=0txtP
wd.SelLength=Len(txtPwd)ExitSubEndIfIftxtPwdOk<>txtPwdThenMsgBox"密码和确认密码不相同,请重新输入"txtPwdOk.SetFocustx
tPwdOk.SelStart=0txtPwdOk.SelLength=Len(txtPwdOk)ExitSubEndIfIfAddEditThenadoUser.RefreshadoUser.Recordset.Fi
nd"UserName='"&txtUserName&"'"IfNotadoUser.Recordset.EOFThenMsgBox"用户名已存在,请重新输入"txtUserName.SetFocustxtUserName.SelSt
art=0txtUserName.SelLength=Len(txtUserName)ExitSubEndIfadoUser.Recordset.AddNewEndIfadoUser.Recordset.Fields("usern
ame")=Trim(txtUserName)adoUser.Recordset.Fields("password")=Trim(txtPwd)adoUser.Recordset.UpdateIfstrUserName="admin"Thenf
rmUserM.adoUser.RefreshfrmUserM.adoUser.Recordset.Find"username='"&Trim(txtUserName)&"'"frmUserM.UpUserEndIfUnloadMeEndSub84(3
)删除用户cmdDel_Click事件PrivateSubcmdDel_Click()'系统用户不能删除IfTrim(lstUserName.BoundText)="admin"ThenMsgBox"系统用户不能删除",,"删除用户"Exit
SubEndIf'检查是否选择要删除的用户记录IfTrim(lstUserName.BoundText)=""ThenMsgBox"请选择要删除的用户"ExitSubEndIf'确定是否删除IfMsgBox("用户名称:"+lstUserName.Text+Chr(13),
vbYesNo,"是否删除")=vbNoThenExitSubEndIf'调用Delete方法删除选择的用户信息adoUser.RecordSource="SELECT*FROMUsersWHEREUse
rName='"&lstUserName&"'"adoUser.RefreshadoUser.Recordset.DeleteadoUser.RecordSource="SELECT*FROMUsers"adoU
ser.RefreshEndSub