VC的学生信息管理完整.docx
《VC的学生信息管理完整.docx》由会员分享,可在线阅读,更多相关《VC的学生信息管理完整.docx(11页珍藏版)》请在冰豆网上搜索。
![VC的学生信息管理完整.docx](https://file1.bdocx.com/fileroot1/2023-1/1/7f0a66b3-ed52-475e-8a77-bb0dca37c2dc/7f0a66b3-ed52-475e-8a77-bb0dca37c2dc1.gif)
VC的学生信息管理完整
《VisualC++程序设计》课程设计报告
班级:
计算机系软件Z102班姓名:
曹立红学号:
104431
一.引言
该次课程设计后台数据库连接ACCESS并创建数据库应用程序。
创建支持数据库的单文档的应用程序
使用ListControl控件显示并操作原数据库表格内容,其功能可实现表格中信息工程的添加、修改、删除、刷新、查询,其中查询功能分为单条件查询和多条件查询两种。
二.系统设计
1.主页面如下:
运行之后ACCESS表中的数据就会在ListControl控件中显示通过主页面可以对表格中信息工程进行简单的刷新,删除,单条件查询(按姓名,学号,所在系,性别,出生年份的单独查询)和多条件查询(按姓名,学号,所在系,性别,出生年份的组合查询)。
2.点击添加按钮即可进入添加对话框如下:
可以输入相关数据点击添加按钮之后即可在原数据表中进行添加一行,并且可以进行多次添加,点击确定之后刷新即可在ListControl控件中显示。
3.点击修改按钮即可进入修改对话框如下:
可以对已有的相关数据进行修改点击确定按钮之后即可改变原数据表中数据行,刷新即可在ListControl控件中显示。
三.系统实现
1.运行界面图及各模块主要代码:
a.刷新功能的实现:
voidCKeView:
:
Onshuaxin()
{
if(m_pSet->IsOpen())
m_pSet->Close()。
//如果此时数据库表打开则进行关闭。
CStringstr="select*fromstudent"。
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,str)。
//然后以S所示条件对数据库表进行
打开。
m_Clist.DeleteAllItems()。
//将ListControl控件现有的数据工程全部删除。
Disp()。
//调用Disp()函数将原数据库表中的内容重新显示。
}
voidCKeView:
:
Disp()
{
inti=0。
CStringstr,str1。
while(!
m_pSet->IsEOF())//m_pSetCSet类的指针用于指向原数据库表格内容。
m_column1,m_column2,m_column3,m_column4,m_column5分别对应原数据库表格的学号,姓名,性别,出生日期,系所在列。
{
m_Clist.InsertItem(i,m_pSet->m_column1)。
m_Clist.SetItemText(i,1,m_pSet->m_column2)。
m_Clist.SetItemText(i,2,m_pSet->m_column3)。
intyear=m_pSet->m_column4.GetYear()。
intmonth=m_pSet->m_column4.GetMonth()。
intday=m_pSet->m_column4.GetDay()。
str1.Format("%d/%d/%d",year,month,day)。
//将原数据库表格的第i行的相应列列的
m_Clist.SetItemText(i,3,str1)。
内容插到ListControl控件的i行各列中;
m_Clist.SetItemText(i,4,m_pSet->m_column5)。
i++。
m_pSet->MoveNext()。
//m_pSet所指向的行下移。
}
intn=m_Clist.GetItemCount()。
if(n==0)//如果ListControl控件中的显示的内容为空
AfxMessageBox("sorry!
没有找到匹配项!
")。
}
b.删除功能的实现:
voidCKeView:
:
Onshanchu()
{
intn=-1。
n=m_Clist.GetSelectionMark()。
//n为选中的行号;
if(n<0)//如果没有进行选择则给出提示
{
AfxMessageBox("请选择删除项!
")。
return。
}
CStrings,str。
if(m_pSet->IsOpen())
m_pSet->Close()。
/如果此时数据库表打开则进行关闭
str=m_Clist.GetItemText(n,0)。
//取出第n行的第0列的字段即学号列
s="select*fromstudentwhere学号='"+str+"'"。
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,s)。
以S所示条件对数据库表进行
打开。
m_pSet->Delete()。
//删除
m_pSet->Requery()。
Onchaxun()。
//调用刷新函数在ListControl控件中显示
}
c.修改功能的实现:
voidCKeView:
:
Onxiugai()
{
intn=m_Clist.GetSelectionMark()。
//n为选中的行号
if(n<0)//如果没有进行选择则给出提示
{
AfxMessageBox("请选择修改项!
")。
return。
}
CStringstr,str1,s。
str=m_Clist.GetItemText(n,0)。
//取出第n行的第0列的字段即学号列
if(m_pSet->IsOpen())
m_pSet->Close()。
如果此时数据库表打开则进行关闭
str1="select*fromstudentwhere学号='"+str+"'"。
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,str1)。
以S所示条件对数据库表进行
打开。
CXgDlgobj。
//修改对话框中建立的类的对象
obj.m_xh=m_pSet->m_column1。
obj.m_xm=m_pSet->m_column2。
obj.m_vc1=m_pSet->m_column3。
obj.m_vrq=m_pSet->m_column4。
obj.m_vc2=m_pSet->m_column5。
//将需要修改的的行中的各列的内容传递给修改对话框的各变量中
if(obj.DoModal()==IDOK)//修改完毕点击确定后则将修改后的修改对话框的各变量中的值传
{递给数据表中对应行中的各列
m_pSet->Edit()。
UpdateData
(1)。
m_pSet->m_column1=obj.m_xh。
m_pSet->m_column2=obj.m_xm。
m_pSet->m_column3=obj.m_vc1。
m_pSet->m_column4=obj.m_vrq。
m_pSet->m_column5=obj.m_vc2。
m_pSet->Update()。
}
}
d.添加功能的实现:
在主页面的“添加”按钮中写入下面的代码:
voidCKeView:
:
Ontianjia()
{
CTjDlgobj。
//定义添加对话框类的对象
obj.DoModal()。
//打开添加对话框;
}
在添加对话框中的添加按钮中加入以下代码:
voidCTjDlg:
:
Ontj()
{
UpdateData
(1)。
if(m_xuehao=="")//如果添加时学号主键为空则提示错误信息
{
AfxMessageBox("请输入完整信息项!
")。
return。
}
if(m_pSet2.IsOpen())
m_pSet2.Close()。
//如果此时数据库表打开则进行关闭
m_pSet2.Open()。
//在进行打开
m_pSet2.AddNew()。
//为原数据添加新的一行
m_pSet2.m_column1=m_xingming。
m_pSet2.m_column2=m_xuehao。
m_pSet2.m_column3=m_xb。
m_pSet2.m_column4=m_time。
m_pSet2.m_column5=m_xi。
//将添加对话框中新设定的值依此赋给原数据库表格中的各列;
m_pSet2.Update()。
}
刷新之后即可在ListControl控件中显示。
d.查询功能的实现:
1.单条件查询:
选中单条件查询的单选按钮后则主页面中的总查询按钮不可用,而每一个组框中对应的查询按钮均可用,则在单条件查询的单选按钮中写入以下代码:
voidCKeView:
:
OnRadio6()
{
GetDlgItem(IDC_BUTTON10)->EnableWindow(FALSE)。
//获取对应按钮的ID并设定相应按钮的
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE)。
EnableWindow属性FALSE为不可用TRUE为GetDlgItem(IDC_BUTTON6)->EnableWindow(TRUE)。
可用;
GetDlgItem(IDC_BUTTON7)->EnableWindow(TRUE)。
GetDlgItem(IDC_BUTTON8)->EnableWindow(TRUE)。
GetDlgItem(IDC_BUTTON9)->EnableWindow(TRUE)。
}
(1)按姓名查询:
在按姓名查询组框的查询按钮中写如以下代码:
voidCKeView:
:
Onchaxun()
{
UpdateData
(1)。
if(m_pSet->IsOpen())
m_pSet->Close()。
CStrings。
s="select*fromstudentwhere姓名like'"+m_ve1+"%'";//在表中查询姓名列与edit中的输入的变量相匹
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,s)。
配的行。
并以该条件打开数据表。
m_pSet->Requery()。
m_Clist.DeleteAllItems()。
//将ListControl控件现有的数据工程全部删除。
Disp()。
//调用Disp()函数将原数据库表中的内容重新显示。
}
(2)按学号查询:
在按学号查询组框的查询按钮中写如以下代码:
voidCKeView:
:
Onchaxun1()
{
UpdateData
(1)。
if(m_pSet->IsOpen())
m_pSet->Close()。
CStrings。
s="select*fromstudentwhere学号='"+m_ve2+"'"。
//在表中查询学号列与edit中的输入的变量相匹
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,s)。
配的行。
并以该条件打开数据表。
m_pSet->Requery()。
m_Clist.DeleteAllItems()。
//将ListControl控件现有的数据工程全部删除。
Disp()。
//调用Disp()函数将原数据库表中的内容重新显示。
}
(3)按性别查询:
在按性别查询组框的查询按钮中写如以下代码:
voidCKeView:
:
Onchaxun3()
{
UpdateData
(1)。
if(m_pSet->IsOpen())
m_pSet->Close()。
CStrings,s1。
if(m_vr1==0)//如果单选按钮中选中第一个按钮
s1="男"。
//则令单选按钮的变量赋值为“男”;
elses1="女"。
//否则赋值为“女”;
s="select*fromstudentwhere性别='"+s1+"'"。
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,s)。
m_pSet->Requery()。
m_Clist.DeleteAllItems()。
Disp()。
}
(4)按所在系查询:
在按所在系查询组框的查询按钮中写如以下代码:
voidCKeView:
:
Onchaxun2()
{
//UpdateData
(1)。
if(m_pSet->IsOpen())
m_pSet->Close()。
CStrings,s1。
intn=m_cc1.GetCurSel()。
//n为当前选中项的下标;
m_cc1.GetLBText(n,s1)。
//获取当前选中项的值并赋给变量s1;
m_vc1=s1。
//并将该变量赋给组合框的变量。
UpdateData(0)。
s="select*fromstudentwhere系='"+m_vc1+"'"。
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,s)。
m_pSet->Requery()。
m_Clist.DeleteAllItems()。
Disp()。
}
(5)按出生年份查询:
在按出生年份查询组框的查询按钮中写如以下代码:
voidCKeView:
:
Onchaxun4()
{
UpdateData
(1)。
if(m_pSet->IsOpen())
m_pSet->Close()。
CStrings,s1,s3。
if(m_vr2==0)
s1=">"。
//如果单选按钮选中第一项则为变量s1赋值为>
elseif(m_vr2==1)s1="="。
选中第二项则为变量s1赋值为=
elses1="<"。
选中第三项则为变量s1赋值为<。
s3.Format("%d",m_ve3)。
//将编辑框中的int类型的变量转换为字符串类型并赋给s3。
s="select*fromstudentwhereyear(出生日期)"+s1+s3。
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,s)。
m_pSet->Requery()。
m_Clist.DeleteAllItems()。
Disp()。
}
2.多条件查询
选中多条件查询的单选按钮后则主页面中的总查询按钮可用,而每一个组框中对应的查询按钮均不可用,则在多条件查询的单选按钮中写入以下代码:
voidCKeView:
:
OnRadio7()
{GetDlgItem(IDC_BUTTON10)->EnableWindow(TRUE)。
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE)。
GetDlgItem(IDC_BUTTON6)->EnableWindow(FALSE)。
GetDlgItem(IDC_BUTTON7)->EnableWindow(FALSE)。
GetDlgItem(IDC_BUTTON8)->EnableWindow(FALSE)。
GetDlgItem(IDC_BUTTON9)->EnableWindow(FALSE)。
}
在主页面中的总查询按钮中写入以下代码:
voidCKeView:
:
Onchaxun5()
{
CStrings,s1,s2,s3。
UpdateData
(1)。
if(m_vk1==1)//如果姓名的复选框被选中则为str10进行赋值以下字符串
str10="姓名like'"+m_ve1+"%'"。
elsestr10=""。
//否则为其赋空值
if(m_vk2==1)//如果姓名的复选框被选中则为str11进行赋值以下字符串
str11="and系='"+m_vc1+"'"。
elsestr11=""。
//否则为其赋空值
if(m_vk3==1)//如果性别的复选框被选中
{
if(m_vr1==0)//如果选中第一项则为s1赋值为”男”否则为其赋值为“女”
s1="男"。
elses1="女"。
str12="and性别='"+s1+"'"。
}
elsestr12=""。
if(m_vk4==1)
{
if(m_vr2==0)
s2=">"。
elseif(m_vr2==1)s2="="。
elses2="<"。
s3.Format("%d",m_ve3)。
str13="andyear(出生日期)"+s2+s3。
//year(出生日期)为获取出生日期列的年份
}
elsestr13=""。
if(m_pSet->IsOpen())
m_pSet->Close()。
s="select*fromstudentwhere"+str10+str11+str12+str13。
//进行多条件字符串的连接
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,s)。
m_pSet->Requery()。
m_Clist.DeleteAllItems()。
Disp()。
}
2.开发过程中遇到的问题及解决的办法.
在设计过程中原表中的出生日期列为CTime类型,在转换成字符串的过程中出现问题,解决方法为:
intyear=m_pSet->m_column4.GetYear()。
//获取出生日期的年份;
intmonth=m_pSet->m_column4.GetMonth()。
//获取出生日期的月份;
intday=m_pSet->m_column4.GetDay()。
//获取出生日期的天数;
str1.Format("%d/%d/%d",year,month,day)。
//将年月日转换为字符串
m_Clist.SetItemText(i,3,str1)。
四.结论
本系统可实现信息的查询,添加,修改,删除等基本功能,但本系统不具有依次连续查找相关记录的功能即不具有显示上一条或下一条的记录的功能;
此外,在修改时只能一次修改一项不能连续修改多项,添加时可连续添加但必须刷新才能在ListControl控件显示。