您的位置:首页 > 数据库

C#.net实验——数据库应用管理系统

2014-05-28 18:04 495 查看

一.实验要求

      掌握并运用ADO.NET技术,实现一个C/S版本的信息管理系统。

(1)设计一个学生成绩管理信息系统,能对学生的成绩记录进行方便的输入、查询、修改等操作,以及综合统计查询等。

(2)对学生成绩的综合查询,如查询个人的单科或所有成绩/不及格成绩,查询某门课程的所有程序等。

(3)参考示例文件DbDemo。

(4)至少实现对一个数据表的完整操作(CRUD,增删查改)、综合(复合条件)查询。

(5)鼓励使用分层方式完成实验。

(6)正确理解和熟练运用ADO.NET 数据访问模型,理解并练习运用数据库相关理论:事务、关系/外键约束、存储函数等。

二. 设计思路

       本次实验是要做一个基于数据库的应用软件,采用了表示层、业务逻辑层和数据访问层的三层结构。由于之前做数据库课程设计已经采用过C#和Linq完成,所以我使用Linq来操作数据,相对来说会比较熟悉,所以这次的实验仍然采用Linq来完成——使用Linq读取和操作数据,再绑定到控件上。

1.数据访问层(代码在Model文件夹内)

       数据访问层主要分为两个部分,一个部分是DBContext的建立,另外一部分是把每一个数据库表建立为一个个独立的对象,并声明里面的属性。

//建立DBContext
public System.Data.Linq.Table<Classes> Classes;//声明班级表对象
public System.Data.Linq.Table<Courses> Courses; //声明课程表对象
public System.Data.Linq.Table<Roles> Roles; //声明角色表对象
public System.Data.Linq.Table<Sorces> Sorces; //声明成绩表对象
public System.Data.Linq.Table<Student> Student;	//声明学生表对象
public System.Data.Linq.Table<Users> Users; //声明用户表对象
public SchoolMgrDataSetDataContext():base(connectionString){} //数据库上下文
//声明对象表中的属性以及数据类型,get、set操作,以班级表(Classes)为例
[Key]//声明ClassID为主键
private int ClassID { get; set; };

[StringLength(4,ErrorMessage="请正确输入4为年份"),Required ]
private string Year { get; set; };

[StringLength(50,ErrorMessage="请正确专业"),Required ]
private string Major{ get; set; };

[Required(ErrorMessage="请输入班号!")]
private int ClassNumber{ get; set; };

private EntitySet<Student> _Student;

2.逻辑业务层(代码在Logic文件夹内)

       该层主要是用于接收来时表示层的数据处理请求,包括对数据的增删查改,以及数据库中表与表之间的各种连接。

//增:以在成绩表中增加一条成绩记录为例
try
{
SchoolMgr.Model.SchoolMgrDataSetDataContext myDB =
new Model.SchoolMgrDataSetDataContext();
//建立数据库上下文
var mySorce =
myDB.Sorces.Where(p => p.CourseID == CourseID && p.StudentID == StudentID);
//检查准备插入的成绩记录是否已经在表中,以防重复插入

if (mySorce.Count() ==0)//如果成绩表(Sorce)中没有该数据则插入
{
var myNewSorce = new Model.Sorces();//新建一个成绩表元组对象
myNewSorce.CourseID = CourseID;//课程ID
myNewSorce.StudentID = StudentID;//学号
myNewSorce.Sorce = SorceNumber;//成绩
myDB.Sorces.InsertOnSubmit(myNewSorce);//在成绩表插入该记录
}
……
myDB.SubmitChanges();//提交插入,由于在数据库中已经采用了Check的约束,
//如果成绩不在0~100之间的范围内,将会出现异常。
return true;//如果插入成功,就返回true,表示插入成功。
}
catch
{
return false;//插入失败,返回false,表示插入失败。
}

//删:以删除一条成绩记录为例。
SchoolMgr.Model.SchoolMgrDataSetDataContext myDB =
new Model.SchoolMgrDataSetDataContext();
var mySorceLog = myDB.Sorces.First(p => p.SorceID == SorceID);
//查找出需要被删除的元组
try
{
myDB.Sorces.DeleteOnSubmit(mySorceLog);//删除该元组
myDB.SubmitChanges();//提交
return true;//如果删除成功,则不会有异常出现,返回删除成功
}
catch
{
return false; //如果删除失败,则会有出现异常,返回删除失败
}
//删:以删除成绩表中某学号的所有成绩记录为例,同时删除多条记录
SchoolMgr.Model.SchoolMgrDataSetDataContext myDB =
new Model.SchoolMgrDataSetDataContext();
IEnumerable<SchoolMgr.Model.Sorces> deleteSorceLog =
myDB.Sorces.Where(p => p.StudentID.Contains(StudentID));
//选择出包含(Contain)StudentID的成绩记录
try
{
myDB.Sorces.DeleteAllOnSubmit(deleteSorceLog);//删除枚举队列中的所有元组
myDB.SubmitChanges();//提交到数据库
return true;
}
catch
{
return false;
}

//查:以显示一张成绩表为例,根据学号,找出某名学生的所有课程的成绩。
SchoolMgr.Model.SchoolMgrDataSetDataContext myDB =
new Model.SchoolMgrDataSetDataContext();

//以下是自然连接的Linq语句
IQueryable<SchoolMgr.Model.SorceTable> sorceTable =
from myClass in myDB.Classes
join myStudent in myDB.Student.Where(p => p.StudentID == StudentID)
on myClass.ClassID equals myStudent.ClassID
into myStudentClasses
from myStudentClass in myStudentClasses
//获得该学生的学生信息:班级、姓名和学号
join mySorce in myDB.Sorces
on myStudentClass.StudentID equals mySorce.StudentID
into mySoceStudentClasses
//获得该学生的成绩信息:成绩
from mySorceStudentClass in mySoceStudentClasses
join myCourse in myDB.Courses
on mySorceStudentClass.CourseID equals myCourse.CourseID
into myCourseSorceStudentClasses
//获得该学生的课程信息:课程名称
from myCourseSorceStudentClass in myCourseSorceStudentClasses
join myTeacher in myDB.Users
on myCourseSorceStudentClass.UserName equals myTeacher.UserName
into myTeacherCourseSorceStudentClasses
//获得该学生的学生信息:班级、姓名和学号
from myTeacherCourseSorceStudentClass in myTeacherCourseSorceStudentClasses
select new SchoolMgr.Model.SorceTable
{
ClassName = myCourseSorceStudentClass.CourseName,
StudentID = StudentID,
StudentName = myStudentClass.StudentName,
CourseName = myCourseSorceStudentClass.CourseName,
TeacherName = myTeacherCourseSorceStudentClass.UserNickName,
SorceNumber = mySorceStudentClass.Sorce
};

return sorceTable;//返回成绩单表

//改:以下以修改成绩单中的成绩为例。
SchoolMgr.Model.SchoolMgrDataSetDataContext myDB =
new Model.SchoolMgrDataSetDataContext();
SchoolMgr.Model.Sorces mySorceLog =
myDB.Sorces.FirstOrDefault(p => p.SorceID == SorceID);
//在成绩单表中找到该记录
if (mySorceLog != null)//如果存在该记录,则修改成绩
{
try
{
mySorceLog.Sorce = SorceNumber;//修改成绩
myDB.SubmitChanges();//提交到数据库
return true;//修改成功,返回true
}
catch { }
}

return false;//修改失败或不存在该记录返回false

3.表示层(界面、功能设计部分)

       在这个部分,主要是对应用具体功能的实现部分,包括登录验证、各种控件的数据绑定、成绩录入、条件查询、成绩分析等功能的代码实现部分。

//登录验证部分代码
if (TextboxUserName.Text.Trim().Length <= 0)//验证用户名不为空
{
TextboxUserName.Focus();
MessageBox.Show("请输入用户名!");
}
else if (TextboxPassword.Text.Trim().Length <= 0)//验证密码不为空
{
TextboxPassword.Focus();
MessageBox.Show("请输入密码!");
}
else
{
SchoolMgr.Logic.Users myUsers = new Logic.Users();
if (myUsers.IsUser(TextboxUserName.Text, TextboxPassword.Text))
{
……//登录成功
}
else
{
MessageBox.Show("用户名、密码输入错误或该用户不存在!");
//登录失败提示
}
}

//数据绑定:以课程选择下拉框(ComboBoxList)的数据绑定为例。
SchoolMgr.Logic.Courses myCourse = new Logic.Courses();//新建逻辑层的课程对象
ComboBoxCourse.DataSource = myCourse.GetCoursesList();//获取课程列表
ComboBoxCourse.DisplayMember = "CourseName";//下拉框显示的内容的属性
ComboBoxCourse.ValueMember = "CourseID";//下拉框选项值的值属性
ComboBoxCourse.SelectedIndex = -1;//当前选中的项的索引设置为-1(未选中)

//数据录入部分,以插入新的成绩记录或修改成绩记录为例。
if (e.RowIndex >= 0)//如果被修改的行的索引大于等于0
{
DataGridViewRow myRow = DataGridViewSorce.Rows[e.RowIndex];//获得被修改的行
SchoolMgr.Logic.Sorce mySorce = new Logic.Sorce();//新建逻辑层的成绩对象
SchoolMgr.Logic.Courses myCourse = new Logic.Courses();//新建逻辑层的课程对象
int CourseID = myCourse.GetCourseIDByTeacherNameAndCourseName(
(string)myRow.Cells[4].Value, (string)myRow.Cells[3].Value
);//获得被修改行的课程ID
bool isOK = mySorce.InsertOrUpdateSorceLog(
CourseID,
(string)myRow.Cells[1].Value,
(double)myRow.Cells[5].Value);//在数据库中插入该记录或更新该记录的成绩

……//提示语句,如果修改失败则弹出框进行提示,提示用户重新输入合法的成绩。
}

//成绩查询,以学生查询自身学号下所用课程的成绩为例。
string studentID = TextboxStudentID.Text.Trim().toString();//从学号输入框中获得学生学号

SchoolMgr.Logic.Sorce mySorce = new Logic.Sorce();
var mySorceTable = mySorce.GetSorceTable(studentID);//获取学生的所有课程的成绩
if (mySorceTable != null)//返回的成绩单不为空
{
DataGridViewSorce.DataSource = mySorceTable;//将成绩单显示在主界面的表格中
}
else
{
MessageBox.Show("输入的学号有误,请重新输入!");
//如果查询的成绩单为空,则提示用户输入正确的学号。
}

//综合统计查询,下面以成绩分析为例。
double[] SorceNumber = new double[DataGridViewSorce.Rows.Count];
int i=0;
foreach (DataGridViewRow x in DataGridViewSorce.Rows)
{
SorceNumber[i] = (double)x.Cells[5].Value;//获得成绩表中的成绩
i++;
}
SchoolMgr.Logic.Sorce mySorce = new Logic.Sorce();
int[] Analysisesult = mySorce.GetSorceAnalysis(SorceNumber);
//成绩分析返回的结果,分别是不及格、及格、良好、优秀的4级的人数
i=DataGridViewSorce.Rows.Count;
Below60Label.Text =
string.Format("不及格(<60):{0}人,{1}%",
Analysisesult[0], Math.Round(Analysisesult[0] / i * 100.0, 2));
//以文字形式显示成绩分析结果
ChartSorceAnalysis.DataSource = Analysisesult;
//以图片形式显示结果

三. 程序运行效果图

1.登录功能

       启动本应用,首先我们需要输入用户名和密码,每个用户的用户名和密码都在数据库中记录,其中用户的密码会以加密的方式在数据库中记录,如图1所示。



图1 以加密的形式记录用户密码



图2 输入用户名和密码

       正确输入用户名和密码(图2)后,会提示登录成功,并显示主界面。



图3 登录成功



图4 主界面

2. 增:以插入成绩记录到成绩表中为例

       打开菜单栏的“开始”,点击“新建成绩单”,就会弹出新建成绩单窗口,选择课程和班级,选中需要记录成的学生名单,如图5所示。点击“进入成绩录入”,成绩单表格将会在主界面中显示,如图6所示。



图4 “开始”菜单



图5 新建成绩单窗口



图6 新建的成绩单

       点击成绩表中的“成绩”属性学生的单元格,可以直接录入成绩,键入回车,应用会提示成绩录入是否成功。如果录入成功,应用会在主界面的底下的状态栏上显示插入或修改成功记录,如图7所示。



图7 插入或修改成绩成功的提示



图8 插入或修改的成绩格式有误的提示
       如果输入的成绩不合法,应用则会提示修改错误,要求用户输入正确的成绩,如图8所示。

3.查:以“打开成绩单”为例

       打开菜单栏的“开始”,点击“打开成绩单”,就会弹出打开成绩单窗口,选择课程或班级中的一个或两个条件,如图9所示。点击“打开成绩单”,成绩单表格将会在主界面中显示。



图8 打开成绩单窗口

4. 条件查询:以“按班级查询”或“按课程名称”查询学生成绩为例

       打开菜单栏的“查询”,点击“按课程查询成绩”,如图10所示,就会弹出课程选择窗口,选择课程,如图11所示。点击“打开成绩单”,将会在主界面中显示选中课程的所有学生的成绩单。



图10 打开成绩单窗口



图11 打开成绩单窗口

       类似地,“按班级查询成绩”实现的功能与“按课程查询成绩”类似。个性化查询则提供了6个不同的条件的单条件查询,如图12所示。点击“查询成绩”,将会在主界面中显示对应条件下的成绩单。



图12 个性化查询成绩

       打开菜单栏的“分析”,点击“成绩分析”,应用将会在对当前打开的成绩单进行成绩分析,包括文字、饼图和柱状图的成绩分析,如图14~16所示。



图13 个性化查询成绩



图14 文字成绩分析



图15 柱状图成绩分析



图16 饼图成绩分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐