学生管理系统---三层架构

Student.UI

我们看一下窗体框架(参照上图顺序)

接下来我们看一下Model层

我们就以Model里面Studeng.cs类里面谁写的代码为例(数据根据库表里面的数据来写)。

public class Student
    {        //编号
        private int studentNo;
        public int StudentNo
        {
            get { return studentNo; }
            set { studentNo = value; }
        }
        //密码
        private string loginPwd;
        public string LoginPwd
        {
            get { return loginPwd; }
            set { loginPwd = value; }
        }
       ...
}

紧接着我们来看一下DAL层(StudentDAL)

GradeDAL.cs

 public class GradeDAL
    {
       //01.检索所有的年级名称集合,返回的是泛型集合List<Grade>
        public List<Grade> getAllGradeList()
        {
            string sql = "select * from grade";
            //1.1 强SQL 转成内存中的一个张表
            DataTable dt=SQLHelper.ExecuteDataTable(sql);
            MyTool tool=new MyTool();
            //dt转List
            List<Grade> list = tool.DataTableToList<Grade>(dt);
            return list;
        }
    }

MyTool.cs(自定义工具类)

 public class MyTool
    {
        /// <summary>
        /// DataSetToList
        /// </summary>
        /// <typeparam name="T">转换类型</typeparam>
        /// <param name="dataSet">数据源</param>
        /// <param name="tableIndex">需要转换表的索引</param>
        /// <returns></returns>
        public List<T> DataTableToList<T>(DataTable dt)
        {
            //确认参数有效
            if (dt == null )
                return null;
            List<T> list = new List<T>();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                //创建泛型对象
                T _t = Activator.CreateInstance<T>();
                //获取对象所有属性
                PropertyInfo[] propertyInfo = _t.GetType().GetProperties();
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    foreach (PropertyInfo info in propertyInfo)
                    {
                        //属性名称和列名相同时赋值
                        if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
                        {
                            if (dt.Rows[i][j] != DBNull.Value)
                            {
                                info.SetValue(_t, dt.Rows[i][j], null);
                            }
                            else
                            {
                                info.SetValue(_t, null, null);
                            }
                            break;
                        }
                    }
                }
                list.Add(_t);
            }
            return list;
        }
    }

ResultDAL

public class ResultDAL
    {
        public List<ResultExt> getAllResult()
        {
            string sql = "select studentname,subjectname,studentresult,examdate from student,subject,result where student.studentno=result.studentno and result.subjectid=subject.subjectid";
            DataTable dt=SQLHelper.ExecuteDataTable(sql);
            MyTool tool=new MyTool();
            List<ResultExt> list = tool.DataTableToList<ResultExt>(dt);
            return list;
        }

        public List<ResultExt> getResultByParameter(int subjectid,string stuname)
        {
            string sql = "select studentname,subjectname,studentresult,examdate from student,subject,result where student.studentno=result.studentno and result.subjectid=subject.subjectid ";

            if (subjectid!=-1)
            {
                sql += " and [email protected]";
            }
            if (!string.IsNullOrEmpty(stuname))//null ""
            {
                sql += " and studentname like @name";
            }
            SqlParameter[] para =
            {
                new SqlParameter("@subid",subjectid),
                new SqlParameter("@name",‘%‘+stuname+‘%‘)
            };

            DataTable dt = SQLHelper.ExecuteDataTable(sql,para);
            MyTool tool = new MyTool();
            List<ResultExt> list = tool.DataTableToList<ResultExt>(dt);
            return list;
        }

    }

SQLHelper

public static  class SQLHelper
    {
      public static string Constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
      public static int id;
      /// <summary>
      /// 执行NonQuery命令
      /// </summary>
      /// <param name="cmdTxt"></param>
      /// <param name="parames"></param>
      /// <returns></returns>
      public static int ExecuteNonQuery(string cmdTxt, params SqlParameter[] parames)
      {
          return ExecuteNonQuery(cmdTxt, CommandType.Text, parames);
      }
      //可以使用存储过程的ExecuteNonquery
      public static int ExecuteNonQuery(string cmdTxt, CommandType cmdtype, params SqlParameter[] parames)
      {
          //判断脚本是否为空 ,直接返回0
          if (string.IsNullOrEmpty(cmdTxt))
          {
              return 0;
          }
          using (SqlConnection con = new SqlConnection(Constr))
          {
              using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
              {
                  if (parames != null)
                  {
                      cmd.CommandType = cmdtype;
                      cmd.Parameters.AddRange(parames);
                  }
                  con.Open();
                  return cmd.ExecuteNonQuery();
              }
          }
      }
      public static SqlDataReader ExecuteDataReader(string cmdTxt, params SqlParameter[] parames)
      {
          return ExecuteDataReader(cmdTxt, CommandType.Text, parames);
      }
      //SQLDataReader存储过程方法
      public static SqlDataReader ExecuteDataReader(string cmdTxt, CommandType cmdtype, params SqlParameter[] parames)
      {
          if (string.IsNullOrEmpty(cmdTxt))
          {
              return null;
          }
          SqlConnection con = new SqlConnection(Constr);

          using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
          {
              cmd.CommandType = cmdtype;
              if (parames != null)
              {

                  cmd.Parameters.AddRange(parames);
              }
              con.Open();
              //把reader的行为加进来。当reader释放资源的时候,con也被一块关闭
              return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
          }

      }
      //params 可变参数
      public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parames)
      {
          return ExecuteDataTable(sql, CommandType.Text, parames);
      }
      //调用存储过程的类,关于(ExecuteDataTable)
      public static DataTable ExecuteDataTable(string sql, CommandType cmdType, params SqlParameter[] parames)
      {
          if (string.IsNullOrEmpty(sql))
          {
              return null;
          }
          DataTable dt = new DataTable();
          using (SqlDataAdapter da = new SqlDataAdapter(sql, Constr))
          {
              da.SelectCommand.CommandType = cmdType;
              if (parames != null)
              {
                  da.SelectCommand.Parameters.AddRange(parames);
              }
              da.Fill(dt);
              return dt;
          }
      }

      /// <summary>
      /// ExecuteScalar
      /// </summary>
      /// <param name="cmdTxt">第一个参数,SQLServer语句</param>
      /// <param name="parames">第二个参数,传递0个或者多个参数</param>
      /// <returns></returns>
      public static object ExecuteScalar(string cmdTxt, params SqlParameter[] parames)
      {
          return ExecuteScalar(cmdTxt, CommandType.Text, parames);
      }
      //可使用存储过程的ExecuteScalar
      public static object ExecuteScalar(string cmdTxt, CommandType cmdtype, params SqlParameter[] parames)
      {
          if (string.IsNullOrEmpty(cmdTxt))
          {
              return null;
          }
          using (SqlConnection con = new SqlConnection(Constr))
          {
              using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
              {
                  cmd.CommandType = cmdtype;
                  if (parames != null)
                  {
                      cmd.Parameters.AddRange(parames);
                  }
                  con.Open();
                return   cmd.ExecuteScalar();
              }
          }
      }
      //调用存储过程的DBHelper类(关于ExeceutScalar,包含事务,只能处理Int类型,返回错误号)
      public static object ExecuteScalar(string cmdTxt, CommandType cmdtype,SqlTransaction sqltran, params SqlParameter[] parames)
      {
           if (string.IsNullOrEmpty(cmdTxt))
          {
              return 0;
          }
          using (SqlConnection con = new SqlConnection(Constr))
          {
              int sum = 0;
              using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
              {
                  cmd.CommandType=cmdtype;
                  if (parames != null)
                  {
                      cmd.Parameters.AddRange(parames);
                  }
                  con.Open();
                  sqltran = con.BeginTransaction();
                  try
                  {
                      cmd.Transaction = sqltran;
                      sum=Convert.ToInt32( cmd.ExecuteScalar());
                      sqltran.Commit();
                  }
                  catch (SqlException ex)
                  {
                      sqltran.Rollback();
                  }
                  return sum;
              }
          }
      }
    }

StudentDAL

 public class StudentDAL
    {
        public List<Student> GetAllStudentList()
        {
            string sql = "select * from student";
            DataTable dt = SQLHelper.ExecuteDataTable(sql);
            MyTool tool=new MyTool();
            List<Student> list = tool.DataTableToList<Student>(dt);

            return list;

        }

        public DataTable GetAllStudent()
        {
            string sql = "select * from student";
            DataTable dt = SQLHelper.ExecuteDataTable(sql);
            return dt;
        }

        public bool IsLogin(Student stu)
        {
            bool flag = false;
            string sql = "select count(1) from student where studentno=‘"+stu.SName+"‘ and loginpwd=‘"+stu.LoginPwd+"‘";
            int count=Convert.ToInt32(SQLHelper.ExecuteScalar(sql));
            if (count>0)
            {
                flag = true;
            }
            return flag;
        }
    }

SubjectDAL

 public class SubjectDAL
    {
       //01.写一个根据年级编号检索该年级下所有科目集合的方法
       public List<Subject> getAllSubjectByGradeId(int id)
       {
           string sql = "select * from subject where [email protected]";
           SqlParameter para = new SqlParameter("@id",id);
           DataTable dt=SQLHelper.ExecuteDataTable(sql, para);
           MyTool tool=new MyTool();
           List<Subject> list = tool.DataTableToList<Subject>(dt);
           return list;
       }
    }

我们在来看一下BLL层(StudentBLL)BLL层用于连接UI层和DAL层

在这里我们就简单的看一下StudentBLL.cs类里面的代码

public class StudentBLL
    {
       public List<Student> GetAllStudent()
       {
           List<Student> list=dal.GetAllStudentList();
           //DataTable dt= dal.GetAllStudent();
           return list;
       }

       StudentDAL dal=new StudentDAL();

       public bool IsLogin(Student stu)
       {
          bool result= dal.IsLogin(stu);
           return result;
       }

    }

最后就是向UI层填写完整代码了

登录窗体

登录

       StudentBLL bll = new StudentBLL();
       //确定按钮
        private void btnLogin_Click(object sender, EventArgs e)
        {
            //1.1 拼接处一个Student对象,并且赋值
            Student stu=new Student();
            stu.SName = txtName.Text;
            stu.LoginPwd = txtPwd.Text;

            //1.2 调用 bll层的对应的登录方法,传入student对象
            bool flag = bll.IsLogin(stu);
            if (flag)
            {
                MessageBox.Show("success");
            }
        }

登录类型

查询窗体

        GradeBLL gradebll=new GradeBLL();
        SubjectBLL subBll=new SubjectBLL();
        ResultBLL resultBll=new ResultBLL();
        private bool flag;
        //Load事件
        private void FrmSelectResultM1_Load(object sender, EventArgs e)
        {
            dgvResult.AutoGenerateColumns = false;
            LoadGrade();
            List<ResultExt> list = resultBll.getAllResult();
            dgvResult.DataSource = list;
        }

        public void LoadGrade()
        {
            cboSubject.DropDownHeight = 106;
            //01.对年级下拉框绑定数据
            List<Grade> list = gradebll.getAllGradeList();

            //两行代码()
            cboGrade.ValueMember = "gradeId";
            cboGrade.DisplayMember = "gradeName";
            cboGrade.DataSource = list;
            flag = true;
        }

        //年级下拉框选中项改变的事件
        private void cboGrade_SelectedIndexChanged(object sender, EventArgs e)
        {

                //1.1  先获取到选中的年级名称对应的年级编号
                //如何获取下拉框的隐藏值  ()
                int selectid = Convert.ToInt32(cboGrade.SelectedValue);
                //code a little ,debug a little
                //1.2  介入BLL ,调用方法,传入ID,获取List<Subject>
                List<Subject> list = subBll.getAllSubjectByGradeId(selectid);

                Subject sub=new Subject();
                sub.SubjectId = -1;
                sub.SubjectName = "请选择";

                list.Insert(0,sub);
                cboSubject.DataSource = list;
                //两行代码()
                cboSubject.ValueMember = "subjectId";
                cboSubject.DisplayMember = "subjectName";
        }

       //查询
        private void btnSearch_Click(object sender, EventArgs e)
        {
            //下拉框隐藏值
            int subid = Convert.ToInt32(cboSubject.SelectedValue);
            //文本框的值
            string name = txtName.Text;
            List<ResultExt> list = resultBll.getResultByParameter(subid, name);
            dgvResult.DataSource = list;
        }

显示全部信息窗体

StudentBLL bll=new StudentBLL();
        private void FrmStuList_Load(object sender, EventArgs e)
        {
         List<Student> list=   bll.GetAllStudent();
            dgvList.DataSource = list;
        }
时间: 2024-10-06 19:44:37

学生管理系统---三层架构的相关文章

教师信息管理系统 ----三层架构

任务描述: 拿到这个项目,首先我们要了解教师信息管理系统,增加教师信息的维护功能 主要功能主要包括以下几个方面: 1.列表显示教师信息 2.增加教师信息 3.删除教师信息 首先我们要搭建三层框架(UI   DAL   BLL) 先搭建第一个框架 UI: 首先我们先创建UI层 Student.UI 我们看一下窗体框架(参照上图顺序) 接下来我们看一下Model层 我们就以Model里面Studeng.cs类里面谁写的代码为例(数据根据库表里面的数据来写). public class Student

MFC原创:三层架构01(人事管理系统)DAL

VC++/MFC Window编程原创教程文件夹 C++课程设计来着.但还没学过数据,也还没理解过三层架构,就把这个作业深化点来做了.尽管要做的这个人事管理系统看起来是挺简单的,无非就是处理员工信息.但事情就是那样,仅仅有动手了才知道什么叫做现实.     一開始是没想要用三层架构的,我们小组人员能力參差不齐,那就仅仅能从控制台(黑窗体)做起.后来我想做三层架构的时候,发现这是对的.从网上理解到的资料:三层有3层:表现层(UI).业务逻辑层(BLL).数据訪问层(DAL).最好是从逻辑层做起,而

MVC实例及用三层架构实现对学生信息的增删改查

一.MVC设计模式实例 M层 Login.java package org.entity; public class Login { private int id; private String uname; private String upwd; public Login() { } public Login( String uname, String upwd) { this.uname = uname; this.upwd = upwd; } public Login(int id, S

C# 三层架构之系统的登录验证与添加数据的实现

利用三层架构体系,实现学生管理系统中用户的登录与添加班级信息的功能,一下代码为具体实现步骤的拆分过程: 一.用户登录界面功能的实现 1.在数据访问层(LoginDAL)进行对数据库中数据的访问操作 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 //引入命名空间 7 using System

三层架构分析

三层一般分为两类:物理上的三层和逻辑上的三层架构:物理三层架构是以逻辑的三层架构为基础的,假设没有了逻辑的三层.就根本谈不上物理三层架构的部署. 什么是物理三层架构呢? 从简单了说就是每一层都分别做成一个组件.如业务逻辑组件,业务实体组件,数据訪问组件等.在到复杂一些就是构建分布式系统,比如将业务逻辑层与数据訪问分别部署在不同的server上. 我们这里讲的主要是逻辑上的三层架构. 三层基础知识 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构. 微软推荐的分层式结构一般分为三层,

从三层架构迈向领域驱动设计

本文读者基本要求:从事信息管理系统开发,略懂GOF设计模式及SOLID设计原则,对三层面向过程机械编码厌倦,并且不知道出路在何方,如果还掌握代码坏味和重构手法,那是极好的. 1. 三层架构 理论介绍-->实际经验-->总结反思 1.1 简单介绍三层架构 严格分层架构模式的特点是上层只能访问相邻的下层,其他层次间的调用都不允许.三层架构就是一种严格分层模式,它把职责划分为界面展示.业务逻辑.数据访问三层,还有一个业务实体,前面三层都要依赖它,所以它并不构成一个层.结构如图1. 三层架构的特点是一

从MVC和三层架构说到ssh整合开发-下

这章主要讲整合开发,直接从实战讲起,对与ssh的单方面了解,请继续等待我的兴许文章. 解说不到位的地方欢迎大家指正:联系方式rlovep.com 具体请看源码凝视: 全部代码下载(csdn):链接 Github链接:链接https://github.com/wpeace1212/javaBlog/tree/master/sshDemo 写文章不易,欢迎大家採我的文章,以及给出实用的评论.当然大家也能够关注一下我的github.多谢. 1.整合流程 针对一个简单项目.让大家对三层机构和MVC有一个

ASP.NET典型三层架构企业级医药行业ERP系统实战

我这里有一套课程和大家分享,我的qq是2059055336,   课程说明: 国内首部完整讲述ERP系统架构.业务逻辑.开发的项目实战课程.考虑到本系统的庞大及复杂性.本课程原价购买学员每人赠送一个U盾设备,U盾可插在任意电脑上进行学习,使用方便,学习灵活!可永久学习! 项目由来: 此项目是讲师亲自参与构架及参与开发的大型ERP项目,此项目已被太阳石药业,九芝堂药业,拜欧药业等多家大中型企业使用,为其创造巨大经济价值.整个项目由10多个研发人员全程打造,项目总价值接近3000万,给企业创造的价值

从零开始编写自己的C#框架(5)——三层架构介绍

原文:从零开始编写自己的C#框架(5)--三层架构介绍 三层架构对于开发人员来说,已经是司空见惯了,除了大型与超小型项目外,大多都是这种架构来进行开发. 在这里为初学者们简单介绍一下三层架构: (下面内容摘自<趣味理解:三层架构与养猪-<.NET深入体验与实战精要>>,这是以前看到的关于三层架构介绍,觉得挺经典的,大家有时间的话认真看看) 对比以上两图,我们可以看出: 1)数据库好比猪圈 ,所有的猪有序地按区域或编号,存放在不同的猪栏里. 2)DAL 好比是屠宰场 ,把猪从猪圈取出