基于ODBC的学生选课与成绩管理实例.docx
- 文档编号:3099658
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:35
- 大小:458.01KB
基于ODBC的学生选课与成绩管理实例.docx
《基于ODBC的学生选课与成绩管理实例.docx》由会员分享,可在线阅读,更多相关《基于ODBC的学生选课与成绩管理实例.docx(35页珍藏版)》请在冰点文库上搜索。
基于ODBC的学生选课与成绩管理实例
地球科学与环境工程学院
实验报告书
课程名:
学号:
姓名:
指导老师:
日期:
目录
一、目的与要求1
二、开发语言与访问方式1
三、程序功能演示3
四、实验代码11
五、数据表23
六、实验体会24
一、目的与要求
针对教材上的学生-课程-选课数据库,编写一个数据库应用程序,让用户可以通过该应用查看课程信息并进行选课。
功能应包括:
1.按学号查看某位同学已修和已选修的全部课程;
2.可以查看选修某门课程的全部同学,并录入成绩。
3.可以查看所有课程的信息,并可以让同学按课程编号进行选课。
特征如下:
(1)数据库中不存在学生不能选课;
(2)不能选数据库中不存在的课程。
二、开发语言与访问方式
2.1、开发语言:
C++
C++是一种使用非常广泛的电脑程序设计语言。
它是一种静态数据类型检查的,支持多范型的通用程序设计语言。
C++支持过程化程序设计、数据抽象化、面向对象程序设计、泛型程序设计、基于原则设计等多种程序设计风格。
贝尔实验室的比雅尼·斯特劳斯特鲁普博士在20世纪80年代发明并实现了C++。
起初,这种语言被称作“CwithClasses”(“包含类的C语言”),作为C语言的增强版出现。
随后,C++不断增加新特性。
虚函数(virtualfunction)、操作符重载(operatoroverloading)、多重继承(multipleinheritance)、模板(template)、异常处理(exception)、RTTI(Runtimetypeinformation)、命名空间(namespace)逐渐纳入标准。
1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC14882-1998。
另外,就目前学习C++而言,可以认为它是一门独立的语言;它并不依赖C语言,我们可以完全不学C语言,而直接学习C++。
根据《C++编程思想》(ThinkinginC++)一书所评述的,C++与C的效率往往相差在正负5%之间。
所以有人认为在大多数场合中,C++完全可以取代C语言。
2.2、MFC简介
MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windowsAPI函数,VC++是微软公司开发的C/C++的集成开发环境,所谓集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。
vc也指它的内部编译器,集成开发环境必须有一个编译器内核,例如DevC++其中一个编译器内核就是gcc。
MFC除了是一个类库以外,还是一个框架,在VC++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。
xx是版本,它封装了MFC内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。
但是MFC的封装很浅,所以效率上损失不大。
2.3、数据库访问方式:
ODBC
开放数据库互连(OpenDatabaseConnectivity,ODBC)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。
这些API利用SQL来完成其大部分任务。
ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。
开放数据库互连(ODBC)是Microsoft提出的数据库访问接口标准。
开放数据库互连定义了访问数据库API的一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言(但是Microsoft的ODBC文档是用C语言描述的,许多实际的ODBC驱动程序也是用C语言写的。
)ODBC规范后来被X/OPEN和ISO/IEC采纳,作为SQL标准的一部分,具体内容可以参看《ISO/IEC9075-3:
1995(E)Call-LevelInterface(SQL/CLI)》等相关的标准文件。
三、程序功能演示
3.1、程序界面
3.11、登录界面如图1所示
图1登录界面
3.12、学生界面如图2所示
图2学生界面
3.13、教务员界面如图3所示
图3教务员界面
3.2、学生选课界面
3.21、学生可以通过按钮“查询全部课程信息”来查询数据库中的所有课程信息,如图4所示
图4查询全部课程信息
3.22、通过查询全部课程信息,学生可以选择指定课程到其选课记录中,学生也可以通过输入学号来查询已选择的课程,例如查询学号为201413279的学生的选课内容(图5)。
图5查询学生已选课程
此时该学生可以选择课程代码为1的数据库课程,选择时会弹框提示,再次查询时会显示更新后的内容,如图6、图7所示。
由于是刚选的课程,所以成绩栏为空。
图6提示信息
图7选课结果
3.23、学生在查询所有成绩信息后可以输入行数来删除该行的信息。
(这里感觉做的不是很好,但是实在做不出来更好的方法)。
删除成功后会弹框提示,再次查询时会显示该成绩已被移除,如图8、图9所示。
图8删除课程提示
图9课程已被删除
3.24、对于非法操作,由于数据库本身的外键约束,所以当学生选择不存在的课程或不存在的学生进行选课时都会提示操作失败,如图10、图11所示。
图10选择不存在的课程会失败
图11不存在的学生选课时会失败
3.3、教务员界面
3.31、教务员可以通过“查询所有课程信息”来了解课程代码、名称、先修课(在这个程序里没有作用)以及学分等信息。
也可以输入课程代码来查询选择该课程的全部学生及成绩信息,查询不存在的课程时列表为空。
如图12、图13以及图14所示。
图12查询所有课程信息
图13查询某一门课程的所有学生及成绩
图14选择不存在的课程时列表为空
3.32、教务员可以通过按钮来查询所有成绩信息,在总成绩表里通过输入行数与分数能够修改该行的成绩信息:
若该行没有成绩,则会添加进去,若该行已有成绩,就会修改为指定值,两者都会有弹框提示。
如果修改的行数超出列表信息,会提示操作失败。
分别如图15-19所示。
图15查询所有成绩信息
图16添加成绩成功后弹框提示
图17对原来不存在成绩(第7行)的学生添加成绩
图18对已有成绩的学生进行修改
图19对不存在的行添加成绩
四、实验代码
4.1、登录界面跳转按钮代码
//进入教务员界面
voidC尝试Dlg:
:
OnBnClickedButton1()
{
Acdemicdlg;
this->ShowWindow(SW_HIDE);
dlg.DoModal();
this->ShowWindow(SW_SHOW);
//TODO:
在此添加控件通知处理程序代码
}
//进入学生界面
voidC尝试Dlg:
:
OnBnClickedButton2()
{
Studentdlg;
this->ShowWindow(SW_HIDE);
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
4.2、学生界代码
BOOLStudent:
:
OnInitDialog()
{
CDialogEx:
:
OnInitDialog();
ListS.SetExtendedStyle(ListS.GetExtendedStyle()|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP
|LVS_EX_TWOCLICKACTIVATE|LVS_EX_FULLROWSELECT);
CRectrect;
ListS.GetClientRect(rect);
intlistWidth=rect.Width();
ListS.InsertColumn(0,_T("课程代码"),LVCFMT_LEFT,100);
ListS.InsertColumn(1,_T("课程名称"),LVCFMT_LEFT,100);
ListS.InsertColumn(2,_T("先修课代码"),LVCFMT_LEFT,100);
ListS.InsertColumn(3,_T("学分"),LVCFMT_LEFT,100);
ListS.InsertColumn(4,_T(""),LVCFMT_LEFT,100);
ListS.InsertColumn(5,_T("列6"),LVCFMT_LEFT,100);
returnTRUE;
}
//查询所有课程信息
voidStudent:
:
OnBnClickedButton1()
{try
{
CDatabasedb;
BOOLbOpen=db.OpenEx(_T("DSN=111;"),CDatabase:
:
noOdbcDialog);
if(!
bOpen)
{
MessageBox(_T("连接错误!
"));
return;
}
CRecordsetrs(&db);
rs.Open(CRecordset:
:
forwardOnly,_T("select*fromdbo.Course"));
shorticnt=rs.GetODBCFieldCount();
if(icnt>0)
{
ListS.DeleteAllItems();
while(ListS.DeleteColumn(0));
}
//输出所有列的信息
for(inti=0;i { CODBCFieldInfofieldInfo; rs.GetODBCFieldInfo(i,fieldInfo); ListS.InsertColumn(i,fieldInfo.m_strName,LVCFMT_LEFT,100); } //依次读取每一行 CDBVariantvar; inti=0; //依次读取每一行 while(! rs.IsEOF()) { for(intindex=0;index { CStringst; rs.GetFieldValue(index,st); if(index==0) ListS.InsertItem(i,st); else ListS.SetItemText(i,index,st); } rs.MoveNext(); i++; } rs.Close(); db.Close(); } catch(CDBException*e) { AfxMessageBox(e->m_strError); AfxMessageBox(e->m_strStateNativeOrigin); e->Delete(); } } //查询已选课程 voidStudent: : OnBnClickedButton3() {UpdateData(true); try { CDatabasedb; BOOLbOpen=db.OpenEx(_T("DSN=111;"),CDatabase: : noOdbcDialog); if(! bOpen) { MessageBox(_T("连接错误! ")); return; } CRecordsetrs(&db); if(S_Sno=="") {AfxMessageBox(_T("学生号不能为空")); return; } rs.Open(CRecordset: : forwardOnly,_T("SELECT*fromaaawhereSno="+S_Sno)); shorticnt=rs.GetODBCFieldCount(); if(icnt>0) { ListS.DeleteAllItems(); while(ListS.DeleteColumn(0)); } //输出所有列的信息 for(inti=0;i { CODBCFieldInfofieldInfo; rs.GetODBCFieldInfo(i,fieldInfo); ListS.InsertColumn(i,fieldInfo.m_strName,LVCFMT_LEFT,100); } //依次读取每一行 CDBVariantvar; inti=0; //依次读取每一行 while(! rs.IsEOF()) { for(intindex=0;index { CStringst; rs.GetFieldValue(index,st); if(index==0) ListS.InsertItem(i,st); else ListS.SetItemText(i,index,st); } rs.MoveNext(); i++; } rs.Close(); db.Close(); } catch(CDBException*e) { AfxMessageBox(e->m_strError); AfxMessageBox(e->m_strStateNativeOrigin); e->Delete(); //TODO: 在此添加控件通知处理程序代码 } //TODO: 在此添加控件通知处理程序代码 } //选择课程 voidStudent: : OnBnClickedButton2() {try { CDatabasedb; BOOLbOpen=db.OpenEx(_T("DSN=111;"),CDatabase: : noOdbcDialog); if(! bOpen) { MessageBox(_T("连接错误! ")); return; } CRecordsetrs(&db); UpdateData(true); if(S_Cno==""||S_Sno=="") {AfxMessageBox(_T("请输入完整的信息! ")); return; } Caaam_set; //添加一条新记录 if(m_set.IsOpen()) m_set.Close(); m_set.Open(); m_set.AddNew(); UpdateData(true); m_set.m_Sno=S_Sno; m_set.m_Cno=S_Cno; m_set.Update(); m_set.Requery(); m_set.Close(); AfxMessageBox(_T("选课成功! 请重新查询确认")); } catch(CDBException*e) { AfxMessageBox(e->m_strError); AfxMessageBox(e->m_strStateNativeOrigin); e->Delete(); } } //删除课程 voidStudent: : OnBnClickedButton4() {try { CDatabasedb; BOOLbOpen=db.OpenEx(_T("DSN=111;"),CDatabase: : noOdbcDialog); if(! bOpen) { MessageBox(_T("连接错误! ")); return; } CRecordsetrs(&db); UpdateData(true); if(num=="") {AfxMessageBox(_T("请输入行数! ")); return; } doubleNum=_wtof(num); Caaam_set; CRecordsetStatusstatus; //添加一条新记录 if(m_set.IsOpen()) m_set.Close(); m_set.Open(); m_set.SetAbsolutePosition(Num); m_set.GetStatus(status); m_set.Delete(); UpdateData(false); AfxMessageBox(_T("删除成功! 请重新查询确认")); m_set.Requery(); m_set.Close(); } catch(CDBException*e) { AfxMessageBox(e->m_strError); AfxMessageBox(e->m_strStateNativeOrigin); e->Delete(); } //TODO: 在此添加控件通知处理程序代码 } //查询所有选课信息 voidStudent: : OnBnClickedButton5() {UpdateData(true); try { CDatabasedb; BOOLbOpen=db.OpenEx(_T("DSN=111;"),CDatabase: : noOdbcDialog); if(! bOpen) { MessageBox(_T("连接错误! ")); return; } CRecordsetrs(&db); rs.Open(CRecordset: : forwardOnly,_T("SELECT*fromaaa")); shorticnt=rs.GetODBCFieldCount(); if(icnt>0) { ListS.DeleteAllItems(); while(ListS.DeleteColumn(0)); } //输出所有列的信息 for(inti=0;i { CODBCFieldInfofieldInfo; rs.GetODBCFieldInfo(i,fieldInfo); ListS.InsertColumn(i,fieldInfo.m_strName,LVCFMT_LEFT,100); } //依次读取每一行 CDBVariantvar; inti=0; //依次读取每一行 while(! rs.IsEOF()) { for(intindex=0;index { CStringst; rs.GetFieldValue(index,st); if(index==0) ListS.InsertItem(i,st); else ListS.SetItemText(i,index,st); } rs.MoveNext(); i++; } rs.Close(); db.Close(); } catch(CDBException*e) { AfxMessageBox(e->m_strError); AfxMessageBox(e->m_strStateNativeOrigin); e->Delete(); } } 4.2、教务界面代码 BOOLAcdemic: : OnInitDialog() { CDialogEx: : OnInitDialog(); CDialogEx: : OnInitDialog(); ListA.SetExtendedStyle(ListA.GetExtendedStyle()|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP |LVS_EX_TWOCLICKACTIVATE|LVS_EX_FULLROWSELECT); CRectrect; ListA.GetClientRect(rect); intlistWidth=rect.Width(); ListA.InsertColumn(0,_T("课程代码"),LVCFMT_LEFT,100); ListA.InsertColumn(1,_T("课程名称"),LVCFMT_LEFT,100); ListA.InsertColumn(2,_T("先修课代码"),LVCFMT_LEFT,100); ListA.InsertColumn(3,_T("学分"),LVCFMT_LEFT,100); ListA.InsertColumn(4,_T(""),LVCFMT_LEFT,100); ListA.InsertColumn(5,_T("列6"),LVCFMT_LEFT,100); returnTRUE; //TODO: 在此添加额外的初始化 returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //异常: OCX属性页应返回FALSE } //查询所有课程信息 voidAcdemic: : OnBnClickedButton1() {try { CDatabasedb; BOOLbOpen=db.OpenEx(_T("DSN=111;"),CDatabase: : noOdbcDialog); if(! bOpen) { MessageBox(_T("连接错误! ")); return; } CRecordsetrs(&db); rs.Open(CRecordset: : forwar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ODBC 学生 选课 成绩 管理 实例