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

5 篇文章 0 订阅
4 篇文章 0 订阅

一.实验要求

      掌握并运用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 饼图成绩分析

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值