VC数据库开发案例.docx
- 文档编号:28038412
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:17
- 大小:105.67KB
VC数据库开发案例.docx
《VC数据库开发案例.docx》由会员分享,可在线阅读,更多相关《VC数据库开发案例.docx(17页珍藏版)》请在冰豆网上搜索。
VC数据库开发案例
数据库综合实验报告
班级:
计科09级4班
学号:
05
姓名:
陈茜
2011年12月
数据库应用系统的初步开发
一、实验类别:
综合型实验
二、实验目的
1.掌握数据库设计的基本技术,熟悉数据库设计的每个步骤中的任务和实施方案,并加深对数据库系统系统概念和特点的理解。
2.初步掌握基于C/S的数据库应用系统分析、设计和实现方法。
3.进一步提高学生的知识综合运用能力。
三、实验内容
在SQLServer2000数据库管理系统上,利用前台vc++和后台sqlserver2000数据库工具开发一个成绩管理的数据库应用系统。
四、实验过程
1.系统需求说明
权限功能:
系统具有动态的权限分配功能,可按用户权限对用户进行分组。
可分为普通用户,一般用户,超级用户。
普通用户只是查询不能修改,一般用户只能对授权范围内进行相应修改及删除,超级用户能修改、删除所有信息。
录入功能:
为一般用户提供相应的录入功能,为超级用户提供对所有信息的录入功能。
查询功能:
为所有用户提供查询的功能,可查询允许范围内的所有信息。
维护功能:
为一般用户提供查询及相应的修改,删除功能,为超级用户提供对所有信息的修改删除功能。
退出功能:
结束并关闭系统。
2.数据库结构设计
(1)概念结构设计
在对系统进行需求分析的基础上,抽象出学生和课程两个实体。
一门课程可以有多个学生的成绩,一个学生也可以有多个课程的成绩,因此课程与学生之间是多对多的关系。
本系统的E-R图,如图所示。
(2)逻辑结构设计
详细描述将E-R图转换成关系模型的过程以及对关系模式的规范化,至少达到3NF)(3)(3)物理结构设计
以表格形式详细描述系统需要的基本表及属性、视图和索引,对基本表的主键、候选键、外键及被参照表进行说明,对基本表中数据的约束条件进行说明。
用户密码表(Userinfo)
课程表(C)
学生表(S)
选课表(SC)
在根据以上实体的关系,形成表与表之间的逻辑关系
3.系统功能设计
(阐述系统的每个功能。
系统应具有身份验证、对数据库数据的增加、删除、修改、查询、浏览、输出等基本功能。
)
4.系统实现
(1)系统的开发环境(软、硬件配置情况)
本系统在装有SQLserver2000数据库管理系统及VC++6.0开发工具的计算机上完成。
(2)数据库创建过程(简要一些)及其连接(说明数据库连接方法写出关键代码或步骤)
1》、创建数据库
2》、在Student数据库中设计用户密码表(Userinfo)、课程表(C)、学生表(S)、选课表(SC)。
3》、打开上述数据库中各表的所有行逐一添加数据。
(3)创建工程文件及窗体,添加所需的控件,为相应控件的事件编写代码,以实现目标功能。
(在此包括:
关键代码、运行后的界面)
1.配置数据源
利用系统自带的ODBC数据库管理器来建立一个名为student的用户DSN。
配置SQLserverODBC数据源;首先要保证SQLServer服务开启,打开我的电脑->控制面板->管理工具->ODBC数据源->系统DSN,然后单击添加按钮,在弹出对话框中寻找SQLServer,进入“创建到SQLserver新数据源”对话框:
输入信息如下:
名称:
student;服务器:
(local)
单击下一步;选择“使用用户登录ID和密码的SQLserver验证”同时将“连接SQLserver以获取其他默认配置选项的默认配置”选中,输入本机SQL的用户名(sa)和密码(123)。
单击下一步;选中“更改默认数据库为”,并选择Student;并选中“使用ANSI引用的标识符”和“使用ANSI的空值、填充及警告
单击下一步;单击完成;单击测试数据源,如果成功,弹出图所示对话框,说明SQLServer数据源配置成功选择这个条目,单击完成。
2.建立工程
使用VisualC++的应用程序向导建立起应用程序的框架,本系统采用单文档作为主窗口,建立工程的过程步骤如下:
(1)启动MicrosoftVisualC++新建一个“MFCAPPWizerd(exe)”工程,输入工程名,我们在这里使用“student”,选择工程所在的文件夹。
然后单击OK。
(2)在“MFCAPPWizerd-step1”对话框中选择“SingleDocument”,单击“Next”按钮。
(3)单击“Finish”按钮,结束项目的创建,至此,基于单文档的应用程序就创建成功。
3.登陆窗口的创建
启动时需要先进入登录窗口,所以先建立一个登陆窗口和一个名为CloginDlg的类,操作步骤如下:
(1)先建立名为“Dialog”的对话框资源。
(2)在对话框资源添加控件,填完后的登陆框口如下:
(3)创建为该对话框负责事件响应的名为“CloginDlg”类,并未各控件关联变量。
(4)添加数据库对象m_database和记录集对象m_recordset。
(5)由于当向导创建应用程序时,系统默认是启动调用主窗口,而我们需要系统启动后先创建登录窗口,登陆系统后在进入主界面,在CtudentApp这个类中InitInstance()方法中做修改:
CLoginDlglogin;//在启动主窗口之前先创建一个登录窗口对象
if(login.DoModal()==IDOK)
{
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,RUNTIME_CLASS(CStudentDoc),
RUNTIME_CLASS(CMainFrame),//mainSDIframewindow
RUNTIME_CLASS(CStudentView));
AddDocTemplate(pDocTemplate);
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
if(!
ProcessShellCommand(cmdInfo))
returnFALSE;
CMenu*pMenu=m_pMainWnd->GetActiveWindow()->GetMenu();
returnTRUE;
}
Else
{
returnfalse;
}
(6)为“确定”和“取消”按钮添加事件,在确定上双击,添加CloginDlg:
:
OnOK()方法。
在取消上双击,添加CloginDlg:
:
OnCancel()代码如下:
voidCLoginDlg:
:
OnOK()
{
//TODO:
Addextravalidationhere
CStringusername,password;
m_strUserName.GetWindowText(username);
m_strPassword.GetWindowText(password);
if(!
m_database.IsOpen())
{
if(m_database.Open(_T("DB")))
{
m_recordSet.m_pDatabase=&m_database;
CStringstrSQL;
strSQL.Format("select*fromUserinfowhereUsername='%s'andUserpwd='%s'",username,password);
m_recordSet.Open(CRecordset:
:
forwardOnly,strSQL);
if(m_recordSet.GetRecordCount()==0)
{
MessageBox("usernameorpassworderror!
","error!
",MB_OK|MB_ICONWARNING);
m_strPassword.SetWindowText("");
m_strPassword.SetFocus();
}
else
{
CDialog:
:
OnOK();
}
}
m_recordSet.Close();
m_database.Close();
}
else
{
MessageBox("can'topenthedatabase!
");
}
//CDialog:
:
OnOK();
}
voidCLoginDlg:
:
OnCancel()
{
//TODO:
Addextracleanuphere
if(MessageBox("areyousuretoexit?
"
"areyousuretoexit?
",MB_OK|MB_ICONQUESTION)==IDOK)
CDialog:
:
OnCancel();
}
4.系统主窗口
建立好登录窗口,下面设计主窗口中的菜单项,并未每个菜单添加事件。
(1)在资源视图下,打开菜单,设计结果:
(2)为各菜单项添加控件,并设置属性。
(3)在添加完控件后,分别为各个控件添加事件:
(4)添加代码处理事件
voidCMainFrame:
:
OnStudent()
{
//TODO:
Addyourcommandhandlercodehere
CStudentDlgStudent;
if(Student.DoModal()==IDOK)
{
}
else
{
}
}
(5)删除系统生成的工具栏
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
return0;
}
5.学生管理窗口
新建一个学生管理窗口,一个名为CStudentDlg的类和一个从CRecordset继承过来的数据库记录集CStudent。
(1)添加窗口资源。
在学生管理窗口上控件,添加事件后的学生管理窗口如图:
(2)添加数据库记录集操作类CStudentSet.这里需要创建一个名为CstudentSet的类,该类从Crecordset中继承。
这样就利用VisualC++的向导新建了与S表表项关联的记录集。
(3)定义全局CStudentSet的类对象。
需要添加一个全局的Cstudentset类的对象来控制整个窗口的数据库操作。
(4)添加RefreshList()和ResetButton()方法。
代码如下:
voidCStudentDlg:
:
RefreshList()
{
m_list.DeleteAllItems();
m_studentSet.Open();
m_studentSet.m_strFilter="";
m_studentSet.Requery();
for(inti=0;i { CStringtemp; m_studentSet.GetFieldValue("Sno",temp); m_list.InsertItem(i,temp); chara[10],s[3]; itoa(m_studentSet.m_Sno,a,10); m_list.SetItemText(i,0,a); m_list.SetItemText(i,1,m_studentSet.m_Sname); m_list.SetItemText(i,2,m_studentSet.m_Ssex); itoa(m_studentSet.m_Sage,s,10); m_list.SetItemText(i,3,s); m_studentSet.MoveNext(); } m_studentSet.Close(); } //添加一个使按钮恢复到初始状态的方法ResetButton(); voidCStudentDlg: : ResetButton() { m_strNo.EnableWindow(false); m_strName.EnableWindow(false); m_strAge.EnableWindow(false); femaleRadio->EnableWindow(false); maleRadio->EnableWindow(false); m_btnConfirm.EnableWindow(false); m_btnAdd.EnableWindow(true); m_btnDel.EnableWindow(true); m_btnEdit.EnableWindow(true); } //添加初始化对话框OnInitDialog()方法。 BOOLCStudentDlg: : OnInitDialog() { CDialog: : OnInitDialog(); m_list.InsertColumn(0,"学号"); m_list.InsertColumn(1,"姓名"); m_list.InsertColumn(2,"性别"); m_list.InsertColumn(3,"年龄"); RECTrectList; m_list.GetWindowRect(&rectList); intwid=rectList.right-rectList.left; for(inti=0;i<4;i++) m_list.SetColumnWidth(i,wid/4); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT); RefreshList(); for(intj=1;j<100;j++) { CStrings; s.Format("%d",j); m_strAge.AddString(s); } femaleRadio=(CButton*)this->GetDlgItem(IDC_RADIO_FEMALE); maleRadio=(CButton*)this->GetDlgItem(IDC_RADIO_MALE); femaleRadio->EnableWindow(false); maleRadio->EnableWindow(false); ResetButton(); returntrue; } //6)为CListCtrl控件添加事件。 voidCStudentDlg: : OnClickStudentList(NMHDR*pNMHDR,LRESULT*pResult) { //TODO: Addyourcontrolnotificationhandlercodehere introw=m_list.GetSelectionMark(); CStrings; s=m_list.GetItemText(row,0); m_strNo.SetWindowText(s); s=m_list.GetItemText(row,1); m_strName.SetWindowText(s); s=m_list.GetItemText(row,2); if(s=="女") { femaleRadio->SetCheck(true); maleRadio->SetCheck(false); } else { femaleRadio->SetCheck(false); maleRadio->SetCheck(true); } s=m_list.GetItemText(row,3); inti=m_strAge.FindString(0,s); m_strAge.SelectString(i,s); *pResult=0; } //7)添加按钮事件。 这几个按钮分别对应的事件方法为OnStudentAdd(),OnStudentEdit(), //OnStudentDel(),OnOK()和OnCancel().代码如下: voidCStudentDlg: : OnStudentAdd() { //TODO: Addyourcontrolnotificationhandlercodehere m_strNo.EnableWindow(true); m_strNo.SetWindowText(""); m_strName.EnableWindow(true); m_strName.SetWindowText(""); m_strAge.EnableWindow(true); m_strAge.SelectString(0,"20"); femaleRadio->EnableWindow(true); maleRadio->EnableWindow(true); m_studentSet.Open(); m_studentSet.AddNew(); m_btnConfirm.EnableWindow(true); m_btnAdd.EnableWindow(false); m_btnEdit.EnableWindow(false); m_btnDel.EnableWindow(false); } voidCStudentDlg: : OnStudentDel() { //TODO: Addyourcontrolnotificationhandlercodehere introw=m_list.GetSelectionMark(); CStrings,strSQL; s=m_list.GetItemText(row,0); if(s=="") { MessageBox("请选择一行! "); } else { if(MessageBox("确定要删除记录吗? ","删除询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { strSQL.Format("sno=%s",s); m_studentSet.Open(); m_studentSet.m_strFilter=strSQL; m_studentSet.Requery(); m_studentSet.Delete(); m_studentSet.Close(); RefreshList(); } } } voidCStudentDlg: : OnStudentEdit() { //TODO: Addyourcontrolnotificationhandlercodehere introw=m_list.GetSelectionMark(); CStrings,strSQL; s=m_list.GetItemText(row,0); if(s=="") { MessageBox("请选择一行! "); } else { strSQL.Format("sno=%s",s); m_studentSet.Open(); m_studentSet.m_strFilter==strSQL; m_studentSet.Edit(); m_btnConfirm.EnableWindow(true); m_btnAdd.EnableWindow(false); m_btnEdit.EnableWindow(false); m_btnDel.EnableWindow(false); m_strName.EnableWindow(true); femaleRadio->EnableWindow(true); maleRadio->EnableWindow(true); m_strNo.EnableWindow(true); m_strAge.EnableWindow(true); } } voidCStudentDlg: : OnCancel() { //TODO: Addextracleanuphere CDialog: : OnCancel(); } voidCStudentDlg: : OnOk() { //TODO: Addyourcontrolnotificationhandlercodehere CStringname,strSex; intage,no; CStringa,n; m_strNo.GetWindowText(n); no=atoi(n); m_strName.GetWindowText(name); intsex=this->GetCheckedRadioButton(IDC_RADIO_MALE,IDC_RADIO_FEMALE); if(sex==IDC_RADIO_FEMALE) strSex="女"; else strSex="男"; m_strAge.GetWindowText(a); age=atoi(a); if(name=="") { MessageBox("请输入学号姓名"); } else { m_studentSet.m_Sno=no; m_studentSet.m_Sname=name; m_studentSet.m_Ssex=strSex; m_studentSet.m_Sage=age; m_studentSet.Update(); m_studentSet.Close(); RefreshList(); ResetButton(); } } 点击“系统界面”的“信息管理”的下拉菜单“学生管理”,则弹出一下界面: 在点击添加添加按钮时右边窗口可进行编写: 点击确定后在左边列表处可点击显示: 同时数据库S表中也会新增一条记录: 点击删除时弹出问询框: 是否确认删除,确认后则删除记录。 点击修改按钮则可对已有记录在右边编辑框进行修改。 数据库中的S表都会有相应更改。 五、实验总结 通过本次课程设计我确实收获不少,从一开始按照课本按部就班的做、敲代码,不了解其本质,结果出了一堆的错误,请教了不少同学和老师,都没有解决根本问题,我终于下定决心把它的每个过程和前因后果全部掌握。 终于可以自己找到错误原因,自己可以调试。 在进入本科这一学期的学习生活中,我压力特别大,每门课的课程都非常难而且多,尤其在做这个课程设计的时候面临期末考试重压,正是这种压力我学到很多东西,学会了如何设计数据库,如何从最基本的搜集用户需求,到画出E-R图到写出关系表达式,最终转化为数据库中的二维表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 数据库开发案例 数据库 开发 案例