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 饼图成绩分析
相关文章推荐
- C# ASP.NET 走火入魔通用权限管理系统组件V3.2试用版下载地址【含数据库设计文档、使用手册】
- ASP.NET 生成唯一不重复的订单号 支持多用户并发、持多数据库的实现参考(C#.NET通用权限管理系统组件源码组成部分)
- C# ASP.NET 权限设计 完全支持多数据库多语言包的通用权限管理系统组件源码
- 自动生成清空数据库的SQL语句 ----C#.NET 通用权限管理系统,.NET 开发者的福音
- 【商业版】C# ASP.NET 通用权限管理系统组件源码中的数据库访问组件可以全面支持Access单机数据库了
- C#.NET中的 sender Tag 功能在支持多语言的通用权限管理系统组件中的实际应用范例
- C# ASP.NET 走火入魔通用权限管理系统组件V3.2试用版下载地址【含数据库设计文档、使用手册】
- C# ASP.NET 走火入魔通用权限管理系统组件V3.2试用版下载地址【含数据库设计文档、使用手册】
- C#.NET中的 sender Tag 功能在支持多语言的通用权限管理系统组件中的实际应用范例
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 适合大型企业信息化应用使用的角色权限管理体系
- C# ASP.NET 权限设计 完全支持多数据库多语言包的通用权限管理系统组件源码
- 【商业版】C# ASP.NET 通用权限管理系统组件源码中的数据库访问组件可以全面支持Access单机数据库了
- C# ASP.NET 权限设计 完全支持多数据库多语言包的通用权限管理系统组件源码
- 【商业版】C# ASP.NET 通用权限管理系统组件源码中的数据库访问组件可以全面支持Access单机数据库了
- C# ASP.NET 权限设计 完全支持多数据库多语言包的通用权限管理系统组件源码
- C#.NET 大型企业信息化系统集成快速开发平台 4.1 版本 - 面向数据库SQL语句的应用开发二
- C#.NET 大型企业信息化系统集成快速开发平台 4.1 版本 - 面向数据库SQL语句的应用开发一
- .net数据库应用管理系统
- C# ASP.NET 通用权限管理系统组件源码中WCF例子程序服务器端运行详细配置参考
- ASP.NET应用管理系统框架概述(三)