學生管理系統(三層架構)


 

首先我們先創建UI層

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 result.subjectid=@subid";
            }
            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 gradeid=@id";
           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;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM