首先我們先創建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; }