高级数据库技术学生考试管理系统.docx
《高级数据库技术学生考试管理系统.docx》由会员分享,可在线阅读,更多相关《高级数据库技术学生考试管理系统.docx(39页珍藏版)》请在冰豆网上搜索。
高级数据库技术学生考试管理系统
目录
1.设计目的和任务1
2.开发环境2
2.1硬件环境2
2.2软件环境2
3.设计题目3
3.1题目名称3
3.2题目详细描述3
3.3功能要求3
4.相关技术及知识点6
5.数据库设计9
5.1系统总体结构9
5.2管理系统表关系9
5.3表详细信息10
6.设计与实现13
6.1登陆界面13
6.2新用户注册14
6.3教师界面14
1.设计目的和任务
本次期末大作业采用课程设计的形式进行,作为《高级数据库技术(ADO.NET&XML)》课程的期末考核。
要求综合运用ADO.NET相关知识,设计一个具有实用夹着的学生考试管理系统,并撰写课程设计报告。
其目的和任务是:
(1)巩固和加深学生对本课程基本知识的理解和掌握;
(2)掌握C#编程和ADO.NET程序调试的基本技能;
(3)掌握设计ADO.NET应用软件的基本思路和方法;
(4)提高运用ADO.NET解决实际问题的能力;
(5)培养撰写设计报告的能力。
2.开发环境
2.1硬件环境
计算机
2.2软件环境
XP操作系统;
MicrosoftSQLServer2005;
MicrosoftVisualStudio2005;
3.设计题目
3.1题目名称
学生考试管理系统
3.2题目详细描述
1.登录界面
2.新用户注册:
学员、教员
3.教师管理界面
4.管理员管理界面
5.学生在线考试
3.3功能要求
登录窗口:
功能:
1,用户对应权限登录。
分教员,学生,管理员。
根据选择的权限进入相应的界面。
2,输入用户名框非空,密码框非空,权限选择判断。
3,新学员用户注册。
注册后需管理员激活才能登录。
教师窗口:
菜单项:
一,试题管理
子菜单:
1,增加试题。
功能:
增加试题
2,查询试题。
功能:
按科目查询试题,并选择类型来查询试题,本系统中默认两种类型的试题,即选择题和填空题。
3,试题列表。
功能:
按难度以及试题类型,查询试题列表。
并可增加,修改试题各属性。
二,考试管理
子菜单:
1,生成试卷
功能:
(1),开始选题窗体:
用户输入试卷名,进入选题窗体。
(2),选题窗体:
按难度以及试题类型选择试题列表,右击将此题选入此次试卷。
提示:
你已选择1题。
显示当前试卷号,已选择题号。
按钮:
结束选题。
2,试卷管理
功能:
(1)查询所有试卷列表。
(2)激活或冻结试卷。
三,成绩管理
功能:
按试卷名查寻成绩。
要算出平均分,并对及格(>=60)以及优秀的学生(>=85)比例进行统计。
表格格式为:
学生名,成绩
文本框显示平均分,文本框显示及格率和优秀率
四,学生评价查看
教师在下拉框中选择某份试题,可以看到所有考试过此试卷的学生对此试卷的评价和意见。
五,窗口。
功能:
显示当前窗口。
六,帮助
子菜单:
关于。
功能:
显示动画。
管理员窗口
菜单项:
一,用户管理
子菜单:
1,新建用户。
(1)功能:
新建学员用户。
(2)功能:
新建教员用户。
2,查询及修改学员。
功能:
(1)按用户名模糊查询学员。
(2)右键修改学员状态。
(3)右键删除学员。
3,用户信息列表。
(1)学员信息列表。
功能:
按性别查询学员列表。
并可增加,修改学员各属性。
(2)教员信息列表。
功能:
按性别查询教师列表。
并可增加,修改教师各属性。
4,窗口。
功能:
显示当前窗口。
5,帮助。
子菜单:
关于。
功能:
倒计时。
学员窗口
一维护个人信息对个人信息进行查询,修改
二:
在线答题。
功能:
(1)可以选择已激活试卷答题。
(2)在线评分。
(3)保存考试成绩可供教师查询。
三:
学生评价
学生评价此次考试的难度,与大纲符合程度,为教师以后出试卷提供参考
具体设计可以学生在下拉框中选择本次考试的一个难度,并在文本框中输入一个主观意见。
4.相关技术及知识点
ADO.NET提供了多种对象模型,比较典型的以下有五种,它们全部归类System.Data.SqlClient名称空间下。
4.1SqlConnection对象
ADO.NET使用SqlConnection对象与SQLServer进行连接。
连接字符串的常用形式有两种:
1.使用Windows集成安全身份认证,例如:
stringconnectionString="IntegratedSecurity=SSPI;Database=MyDatabase.mdf;Server=localhost;";
2.在连接字符串中指定服务器名、用户id、用户口令、数据库名等信息。
例如:
stringconnectionString="server=localhost;uid=sa;pwd=123;database=MyDatabase.mdf";
然后通过连接字符串直接创建SqlConnection对象,如SqlConnectionconn=newSqlConnection(connectionString);
4.2SqlCommand对象
在ADO.NET中,有两种操作数据库的方式:
1.无连接的方式;
2.保持连接的方式。
不论哪种都可以通过SqlCommand对象提供的方法传递对数据库操作的命令,并返回命令执行结果。
在保持连接的方式下操作数据库的一般步骤为:
1.创建SqlConnection的实例;
2.创建SqlCommand的实例;
3.打开连接;
4.执行命令;
5.关闭连接。
SqlCommand对象提供了多种完成对数据库操作的方法。
常用有:
1.ExecuteNonQuery
该方法执行SQL语句的结果,但不返回命令执行的表数据,仅返回操作所影响的行数。
2.ExecuteReader
ExecuteReader方法提供了只向前的、顺序的快速读取数据库中数据的方法。
3.ExecuteScaler()
该方法用于执行SELECT查询,得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。
4.3SqlDataAdapter对象
SqlDataAdapter对象通过无连接的方式完成数据库和本地DataSet之间的交互。
使用这种方式操作数据库的一般步骤为:
1.创建SqlConnection的实例;
2.创建SqlDataAdapter的实例,需要的话,根据select语句生成其他SQL语句;
3.创建DataSet的实例;
4.使用Fill方法将数据库中的表填充到DataSet的表中;
5.利用DataGridView或者其他控件对象编辑或显示数据;
6.需要的话,使用Update方法更新数据库。
SqlDataAdapter对象通过SelectCommand、InsertCommand、UpdateCommand和DeleteCommand属性为后台数据库提供对应的操作命令,并传递需要的参数。
一般情况下,只需要提供SELECT语句和连接字符串创建SqlDataAdapter对象,然后利用SqlCommandBuilder对象生成InsertCommand、UpdateCommand和DeleteCommand属性。
4.4DataTable对象
ADO.NET可以在与数据库断开连接的方式下通过DataSet或DataTable对象进行数据处理,当需要更新数据时才重新与数据源进行连接,并更新数据源。
DataTable对象表示保存在本机内存中的表,它提供了对表中行列数据对象的各种操作。
可以直接将数据从数据库填充到DataTable对象中,也可以将DataTable对象添加到现有的DataSet对象中。
在断开连接的方式下,DataSet对象提供了和关系数据库一样的关系数据模型,代码中可以直接访问DataSet对象中的DataTable对象,也可以添加、删除DataTable对象。
1.创建DataTable对象
可以通过以下两种方式创建DataTable对象:
1)通过DataTable类的构造函数创建DataTable对象,例如:
DataTabletable=newDataTable();
2)通过DataSet的Tables对象的Add方法创建DataTable对象,例如:
DataSetdataset=newDataSet();
DataTabletable=dataset.Tables.Add("MyTableName");
2.在DataTable对象中添加列
在DataTable对象中添加列的最常用的方法是通过DataTable对象的Column属性中的Add方法。
添加后的每一列都是一个DataColumn对象。
3.设置DataTable对象的主键
关系数据库中的表一般都有一个主键,用来惟一标识表中的每一行记录。
通过DataTable对象的PrimaryKey属性可以设置Datatable的主键。
主键可以是一个或者多个DataColumn对象组成的数组。
例如:
DataColumn[]key=newDataColumn[1];//dt是一个DataTable对象
key[0]=dt.Columns[0];
dt.PrimaryKey=key;
4.在DataTable对象中创建行
DataTable对象的每一行都是一个DataRow对象,所以创建行时可以先利用DataTable对象的NewRow方法创建一个DataRow对象,并设置新行中各列的数据,然后利用Add方法将DataRow对象添加到表中
5.将SQLServer数据库中的表填充到DataTable中
除了可以直接创建DataTable对象的行列信息外,也可以通过DateAdapter对象的Fill方法将SQLServer数据库中的表填充到DataTable对象中。
4.5DataSet对象
1.创建DataSet对象
使用创建的DataSet对象可以完成各种数据操作,利用向导生成的数据库数据源是一个强类型的DataSet以及一对或多对强类型的DataTable和TableAdapter的组合。
类型化的DataSet是一个生成的类,是从.NETFramework的一般DataSet类衍生来的,但提供了已定义的架构以及特定于该架构的属性和方法。
同时,对于DataSet中的每个表,还生成了特定于该DataSet的附加衍生类,而且每个类都为相关的表提供了特定的架构、属性和方法。
当然,也可以直接创建一般的DataSet对象,例如:
DataSetmyDataset=newDataSet();
2.填充DataSet对象
创建DataSet后,就可以使用SqlDataAdapter对象把数据导入到DataSet对象中,比如通过Fill方法将数据填充到DataSet中的某个表中。
4.6DataView
DataView就时数据视图,为数据库结构提供了外模式的实现。
同时DataView也可以为窗体控件和Web控件提供数据绑定功能,在每一个DataTable中内建了一个DataView为:
DataTable.DefaultView();创建DataViewDataViewsortedView=newDataView(dataTable);对DataView进行排序dataTable.DefaultView.sort="lastName";
dataTable.DefaultView.sort="lastName,FirstNameDESC";
4.7更新DB
在DataSet中,每一个DataTable对应着一个DataAdapter,DataAdapter.Update()时,DataTable自动更新。
4.8事务
tx=conn.BeginTransaction(IsolationLevel.Serializable);
invDA.SelectCommand.Transaction=tx;
5.数据库设计
5.1系统总体结构
系统总体结构设计采用了MVC的思想。
根据面向对象分析阶段中类划分结果,规划界面类、控制类、实体类及调用关系。
在面向对象分析阶段,我们把类大体上分成了界面和实体两类。
但是,为了提高代码的易维护性、易读性,增加类内部的纯度、类之间调用的灵活性,我们把控制代码另封装为一个类,即控制类,使系统中类之间的调用关系如下图所示:
5.2管理系统表关系
5.3表详细信息
5.3.1管理员表Admin详细信息
图5.3.1管理员表Admin详细信息
5.3.2学生表Student详细信息
图5.3.2学生表Student详细信息
5.3.3年级表Grade详细信息
5.3.3年级表Grade详细信息
5.3.4班级表Class详细信息
5.3.4班级表Class详细信息
5.3.5状态表UserState详细信息
5.3.5状态表UserState详细信息
5.4程序实现:
privatevoidtsmiAddStuUser_Click(objectsender,EventArgse)
{
AddStudentFormaddStudentForm=newAddStudentForm();
addStudentForm.MdiParent=this;
addStudentForm.Show();
}
privatevoidtsmiaddNewTeacher_Click(objectsender,EventArgse)
{
AddTeacherFormaddTeacherForm=newAddTeacherForm();
addTeacherForm.MdiParent=this;
addTeacherForm.Show();
}
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceMySchool
{
publicpartialclassAddStudentForm:
Form
{
publicAddStudentForm()
{
InitializeComponent();
}
///
///确认增加用户
///
///
///
privatevoidbtnAddStuUserOK_Click(objectsender,EventArgse)
{
if(IsValidate())//输入验证成功
{
Studentstudent=newStudent();//新建学员对象student
student.LoginId=txtStuName.Text.Trim();//以下依次给student属性set值
student.LoginPwd=txtStuPwd.Text.Trim();
student.UserStateId=rdoStatusIn.Checked?
(int)rdoStatusIn.Tag:
(int)rdoStatusOut.Tag;//条件表达式,选择活动状态,返回活动状态Id
student.ClassId=ClassDao.GetClassId(cboClass.Text);//通过班级名获得班级编号
student.StudentNO=txtStuNO.Text.Trim();
student.StudentName=txtStuRealName.Text.Trim();
student.Sex=rdoStuMale.Checked?
rdoStuMale.Text:
rdoStuFemale.Text;
student.Phone=txtStuTel.Text.Trim();
student.Email=txtStuEmail.Text.Trim();
StudentDAO.AddStudent(student);//增加新学员
txtStuName.Text="";//增加成功清空输入框
txtStuPwd.Text="";
txtStuConfirmPwd.Text="";
txtStuRealName.Text="";
txtStuNO.Text="";
txtStuTel.Text="";
txtStuEmail.Text="";
}
}
///
///关闭按钮
///
///
///
privatevoidbtnAddStuUserCancel_Click(objectsender,EventArgse)
{
this.Close();
}
///
///界面加载时给年级框赋值
///
///
///
privatevoidAddStudentForm_Load(objectsender,EventArgse)
{
Listlist=newList();//新建List
list=GradeDao.GradeList();//得到所有年级的list
foreach(Gradegradeinlist){//遍历list,给年级下拉框cboGrade赋值
this.cboGrade.Items.Add(grade.GradeName);
}
}
///
///当年级下拉框变动时,动态给班级下拉框对应赋值
///
///
///
privatevoidcboGrade_SelectedIndexChanged(objectsender,EventArgse)
{
cboClass.ResetText();//重置cboClass使之非选。
cboClass.Items.Clear();//清空cboClass原有下拉选项
stringgradeName=this.cboGrade.Text;//获取年级
intgradeId=GradeDao.GetGradeIdByName(gradeName);//通过年级名获取年级编号
Listlist2=newList();//新建Class集合list2
list2=ClassDao.FindClassByGradeId(gradeId);//通过年级编号查找班级,并返回班级的集合
foreach(Classclass1inlist2)//遍历list2给cblClass赋值
{
this.cboClass.Items.Add(class1.ClassName);
}
}
///
///输入验证
///
///
privateboolIsValidate()
{
if(txtStuName.Text=="")
{
MessageBox.Show("请输入用户名","输入提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
txtStuName.Focus();
returnfalse;
}
elseif(txtStuPwd.Text=="")
{
MessageBox.Show("请输入密码","输入提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
txtStuPwd.Focus();
returnfalse;
}
elseif(!
txtStuPwd.Text.Equals(txtStuConfirmPwd.Text))
{
MessageBox.Show("两次密码输入不一致","输入提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
txtStuConfirmPwd.Focus();
returnfalse;
}
elseif(!
rdoStatusIn.Checked&&!
rdoStatusOut.Checked)
{
MessageBox.Show("请选择状态","输入提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
returnfalse;
}
elseif(txtStuRealName.Text=="")
{
MessageBox.Show("请输入学员姓名","输入提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
txtStuRealName.Focus();
returnfalse;
}
elseif(txtStuNO.Text=="")
{
MessageBox.Show("请输入学号","输入提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
txtStuNO.Focus();
returnfalse;
}
elseif(!
rdoStuMale.Checked&&!
rdoStuFemale.Checked)
{
MessageBox.Show("请选择性别","输入提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
returnfalse;
}
elseif(c