數據庫大作業代碼展示

在評論區裏說代碼垃圾之前,我先說了:這代碼寫的挺垃圾的。在即將完成一半的時候意識到了,代碼冗餘太多,基本沒有遵循DRY原則,還能再降低一些代碼的耦合性。高內聚低耦合,剛聽別人講這個概念時沒怎麼聽懂,只是跟着把代碼示例寫了一下,現在想想,那個例子的代碼確實挺好的。


在CSDN上放全部代碼不是很方便,所以挑了一些比較集中的代碼在這裏做了展示,完整的源碼放GitHub上了https://github.com/Cheng-xiaozhen/Educational-Administration-Management

首先是數據庫方面的代碼

採用生成腳本的方式,生成的代碼。

USE [master]
GO
/****** Object:  Database [EAMDatabase]    Script Date: 2020/5/29 16:03:59 ******/
CREATE DATABASE [EAMDatabase]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'EAMDatabase', FILENAME = N'D:\C# for vs\Educational Administration Management\EAMDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'EAMDatabase_log', FILENAME = N'D:\C# for vs\Educational Administration Management\EAMDatabase_log.ldf' , SIZE = 73728KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
ALTER DATABASE [EAMDatabase] SET COMPATIBILITY_LEVEL = 140
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [EAMDatabase].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [EAMDatabase] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [EAMDatabase] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [EAMDatabase] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [EAMDatabase] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [EAMDatabase] SET ARITHABORT OFF 
GO
ALTER DATABASE [EAMDatabase] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [EAMDatabase] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [EAMDatabase] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [EAMDatabase] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [EAMDatabase] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [EAMDatabase] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [EAMDatabase] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [EAMDatabase] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [EAMDatabase] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [EAMDatabase] SET  DISABLE_BROKER 
GO
ALTER DATABASE [EAMDatabase] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [EAMDatabase] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [EAMDatabase] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [EAMDatabase] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [EAMDatabase] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [EAMDatabase] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [EAMDatabase] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [EAMDatabase] SET RECOVERY FULL 
GO
ALTER DATABASE [EAMDatabase] SET  MULTI_USER 
GO
ALTER DATABASE [EAMDatabase] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [EAMDatabase] SET DB_CHAINING OFF 
GO
ALTER DATABASE [EAMDatabase] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [EAMDatabase] SET TARGET_RECOVERY_TIME = 60 SECONDS 
GO
ALTER DATABASE [EAMDatabase] SET DELAYED_DURABILITY = DISABLED 
GO
EXEC sys.sp_db_vardecimal_storage_format N'EAMDatabase', N'ON'
GO
ALTER DATABASE [EAMDatabase] SET QUERY_STORE = OFF
GO
USE [EAMDatabase]
GO
/****** Object:  Table [dbo].[Class]    Script Date: 2020/5/29 16:04:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Class](
	[CLID] [varchar](11) NOT NULL,
	[CLName] [nvarchar](10) NOT NULL,
 CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED 
(
	[CLID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ_Class_CLID] UNIQUE NONCLUSTERED 
(
	[CLID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[College]    Script Date: 2020/5/29 16:04:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[College](
	[COID] [varchar](11) NOT NULL,
	[COName] [nvarchar](12) NOT NULL,
 CONSTRAINT [PK_College] PRIMARY KEY CLUSTERED 
(
	[COID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ_College_COID] UNIQUE NONCLUSTERED 
(
	[COID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Course]    Script Date: 2020/5/29 16:04:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Course](
	[CID] [varchar](11) NOT NULL,
	[CName] [nvarchar](10) NOT NULL,
	[Departments] [varchar](11) NOT NULL,
	[Teacher] [varchar](11) NOT NULL,
 CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED 
(
	[CID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ_Course_CID] UNIQUE NONCLUSTERED 
(
	[CID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Student]    Script Date: 2020/5/29 16:04:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Student](
	[StudentID] [varchar](11) NOT NULL,
	[PassWord] [varchar](50) NOT NULL,
	[StudentName] [nvarchar](10) NOT NULL,
	[StudentGender] [bit] NOT NULL,
	[Birthday] [datetime] NOT NULL,
	[AdmissionTime] [datetime] NOT NULL,
	[Departments] [varchar](11) NOT NULL,
	[Class] [varchar](11) NOT NULL,
	[Image] [image] NULL,
 CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED 
(
	[StudentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ_Student_SID] UNIQUE NONCLUSTERED 
(
	[StudentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Student_Grade]    Script Date: 2020/5/29 16:04:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Student_Grade](
	[AutoID] [int] IDENTITY(1,1) NOT NULL,
	[SID] [varchar](11) NOT NULL,
	[CID] [varchar](11) NOT NULL,
	[Score] [float] NULL,
 CONSTRAINT [PK_Student_Grade_1] PRIMARY KEY CLUSTERED 
(
	[AutoID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ_Student_Grade_SIDCID] UNIQUE NONCLUSTERED 
(
	[SID] ASC,
	[CID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Teacher]    Script Date: 2020/5/29 16:04:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Teacher](
	[TID] [varchar](11) NOT NULL,
	[PassWord] [varchar](50) NOT NULL,
	[TName] [nvarchar](10) NOT NULL,
	[TGender] [bit] NOT NULL,
	[Birthday] [datetime] NOT NULL,
	[AdmissionTime] [datetime] NOT NULL,
	[Departments] [varchar](11) NOT NULL,
	[TSalary] [money] NOT NULL,
	[Image] [image] NULL,
	[Address] [nvarchar](20) NOT NULL,
 CONSTRAINT [PK_Teacher] PRIMARY KEY CLUSTERED 
(
	[TID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ_Teacher_TID] UNIQUE NONCLUSTERED 
(
	[TID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Student] ADD  CONSTRAINT [DF_Student_StudentGender]  DEFAULT ((1)) FOR [StudentGender]
GO
ALTER TABLE [dbo].[Teacher] ADD  CONSTRAINT [DF_Teacher_TGender]  DEFAULT ((1)) FOR [TGender]
GO
ALTER TABLE [dbo].[Course]  WITH CHECK ADD  CONSTRAINT [FK_Course_College] FOREIGN KEY([Departments])
REFERENCES [dbo].[College] ([COID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Course] CHECK CONSTRAINT [FK_Course_College]
GO
ALTER TABLE [dbo].[Course]  WITH CHECK ADD  CONSTRAINT [FK_Course_Teacher] FOREIGN KEY([Teacher])
REFERENCES [dbo].[Teacher] ([TID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Course] CHECK CONSTRAINT [FK_Course_Teacher]
GO
ALTER TABLE [dbo].[Student]  WITH CHECK ADD  CONSTRAINT [FK_Student_Class] FOREIGN KEY([Class])
REFERENCES [dbo].[Class] ([CLID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Student] CHECK CONSTRAINT [FK_Student_Class]
GO
ALTER TABLE [dbo].[Student]  WITH CHECK ADD  CONSTRAINT [FK_Student_College] FOREIGN KEY([Departments])
REFERENCES [dbo].[College] ([COID])
GO
ALTER TABLE [dbo].[Student] CHECK CONSTRAINT [FK_Student_College]
GO
ALTER TABLE [dbo].[Student_Grade]  WITH CHECK ADD  CONSTRAINT [FK_Student_Grade_Course] FOREIGN KEY([CID])
REFERENCES [dbo].[Course] ([CID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Student_Grade] CHECK CONSTRAINT [FK_Student_Grade_Course]
GO
ALTER TABLE [dbo].[Student_Grade]  WITH CHECK ADD  CONSTRAINT [FK_Student_Grade_Student] FOREIGN KEY([SID])
REFERENCES [dbo].[Student] ([StudentID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[Student_Grade] CHECK CONSTRAINT [FK_Student_Grade_Student]
GO
ALTER TABLE [dbo].[Teacher]  WITH CHECK ADD  CONSTRAINT [FK_Teacher_College] FOREIGN KEY([Departments])
REFERENCES [dbo].[College] ([COID])
GO
ALTER TABLE [dbo].[Teacher] CHECK CONSTRAINT [FK_Teacher_College]
GO
ALTER TABLE [dbo].[Student]  WITH CHECK ADD  CONSTRAINT [CK_Student_Gender] CHECK  (([StudentGender]=(0) OR [StudentGender]=(1)))
GO
ALTER TABLE [dbo].[Student] CHECK CONSTRAINT [CK_Student_Gender]
GO
ALTER TABLE [dbo].[Teacher]  WITH CHECK ADD  CONSTRAINT [CK_Teacher_Salary] CHECK  (([TSalary]>(0)))
GO
ALTER TABLE [dbo].[Teacher] CHECK CONSTRAINT [CK_Teacher_Salary]
GO
ALTER TABLE [dbo].[Teacher]  WITH CHECK ADD  CONSTRAINT [CK_Teacher_TGender] CHECK  (([TGender]=(0) OR [TGender]=(1)))
GO
ALTER TABLE [dbo].[Teacher] CHECK CONSTRAINT [CK_Teacher_TGender]
GO
/****** Object:  StoredProcedure [dbo].[usp_getStudentScoreByPage]    Script Date: 2020/5/29 16:04:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE proc [dbo].[usp_getStudentScoreByPage]
 @pageSize int =16, --每頁記錄條數
 @pageIndex int=1, --當前要查看第幾頁的記錄
 @TID varchar(11) ,--教師ID
 @recordCount int output, --總的記錄條數
 @pageCount int output-- 總的頁數
 as 
 begin 
	select StudentID,StudentName,CName,Score,CID from
	(select  s.StudentID,s.StudentName,c.CName,sg.Score ,c.CID,rn=ROW_NUMBER() over(order by AutoID asc) from Student_Grade as sg
	inner join Student as s on s.StudentID=sg.SID
	inner join Course as c on c.CID=sg.CID
	where sg.CID in (select Course.CID from Course where Teacher= @TID)) as sc
	where sc.rn between (@pageIndex-1)*@pageSize+1 and @pageSize*@pageIndex

	--計算總的記錄條數
	set @recordCount=(select count(*) from Student_Grade)

	--計算總頁數
	set @pageCount=CEILING(@recordCount*1.0/@pageSize)
 end
GO
USE [master]
GO
ALTER DATABASE [EAMDatabase] SET  READ_WRITE 
GO

將訪問數據庫的方法抽象成一個類

因爲在數據庫裏對數據加了一些約束,違反約束時會報錯,所以對兩個常用的方法多加了一次異常捕捉

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EAM.DAL
{
    public static class SqlHelper
    {
        //從配置文件中讀取數據庫連接字符串
        private static readonly string conStr = ConfigurationManager.ConnectionStrings["mssql"].ConnectionString;


        public static int ExecuteNonquery(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.CommandType = cmdType;
                    if (pms != null)
                    {
                        com.Parameters.AddRange(pms);
                    }
                    con.Open();
                    try
                    {
                        return com.ExecuteNonQuery();
                    }
                    catch (Exception)
                    {

                        return 0;
                    }
                }
            }

        }

        public static object ExecuteScalar(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.CommandType = cmdType;
                    if (pms != null)
                    {
                        com.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return com.ExecuteScalar();
                }
            }
        }

        public static SqlDataReader ExecuteReader(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            SqlConnection con = new SqlConnection(conStr);
            using (SqlCommand com = new SqlCommand(sql, con))
            {
                com.CommandType = cmdType;
                if (pms != null)
                {
                    com.Parameters.AddRange(pms);
                }
                try
                {
                    con.Open();
                    return com.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                }
                catch
                {
                    con.Close();
                    con.Dispose();
                    throw;
                }
            }
        }

        public static DataTable ExecuteDataTable(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conStr))
            {
                adapter.SelectCommand.CommandType = cmdType;
                if (pms != null)
                {
                    adapter.SelectCommand.Parameters.AddRange(pms);
                }
                try
                {
                    adapter.Fill(dt);
                }
                catch (Exception)
                {
                    throw;
                }
            }
            return dt;
        }
    }
}

登錄功能的實現

在這裏插入圖片描述
學生的
數據訪問層

    /// <summary>
        /// 登錄時,根據用戶名查詢相應的對象信息
        /// </summary>
        /// <param name="sid">用戶名</param>
        /// <returns></returns>
        public Student getStudentInfoBySid(string sid)
        {
            string sql = "select * from Student where StudentID=@sid";
            SqlParameter pms = new SqlParameter("@sid", SqlDbType.VarChar, 11) { Value = sid };
            DataTable dt = SqlHelper.ExecuteDataTable(sql, CommandType.Text, pms);
            Student student = null;
            if (dt.Rows.Count > 0)
            {
            	//RowToStudent是一個方法,將一行數據轉換爲一個學生對象
                student = RowToStudent(dt.Rows[0]);
            }
            return student;
        }


  		private Student RowToStudent(DataRow dr)
        {
            Student student = new Student();
            student.SID = dr["StudentID"].ToString();
            student.PassWord = dr["PassWord"].ToString();
            student.SName = dr["StudentName"].ToString();
            student.SGender = (Convert.ToBoolean(dr["StudentGender"])) ? "男" : "女";
            student.Birthday = Convert.ToDateTime(dr["Birthday"]);
            student.AdmissionTime = Convert.ToDateTime(dr["AdmissionTime"]);
            student.Departments = dr["Departments"].ToString();
            student.Class = dr["Class"].ToString();
			
			//這裏考慮了數據庫中是否有學生的圖像,有的話,顯示的就是學生的圖像,沒有的話,就顯示默認圖像
            if (!dr.IsNull("Image"))
            {
                byte[] imageByte = (byte[])dr["Image"];
                MemoryStream stream = new MemoryStream(imageByte);
                student.Image = new Bitmap(stream);
            }


            return student;
        }

業務邏輯層

  /// <summary>
        /// 登錄時,根據用戶名查詢相應的對象信息
        /// </summary>
        /// <param name="sid">用戶名</param>
        /// <param name="pwd">密碼</param>
        /// <param name="msg">提示信息</param>
        /// <param name="stu">學生對象</param>
        /// <returns>成功與否</returns>
        public bool getStudentInfoBySid(string sid, string pwd, out string msg,out Student stu)
        {
             stu = dal.getStudentInfoBySid(sid);
            if (stu != null)
            {
                if (stu.PassWord == MD5Encode.GetMd5(pwd))
                {
                    msg = "登錄成功";
                    return true;
                }
                else
                {
                    msg = "密碼錯誤";
                    return false;

                }
            }
            else
            {
                msg = "該用戶不存在";
                return false;
            }
        }

教師的
學生和教師的登錄方面的代碼幾乎一樣
數據訪問層

   /// <summary>
        /// 根據輸入的用戶名查詢 用戶
        /// </summary>
        /// <param name="ID">用戶名</param>
        /// <returns>用戶對象</returns>
        public Teacher GetTeacherInfo(string ID)
        {
            string sql = "select * from Teacher where TID=@Id";
            SqlParameter pms = new SqlParameter("@Id", SqlDbType.VarChar, 11) { Value = ID };
            DataTable dt = SqlHelper.ExecuteDataTable(sql, CommandType.Text, pms);
            Teacher teacher = null;
            if (dt.Rows.Count>0)
            {
                teacher = RowToTeacherInfo(dt.Rows[0]);
            }
            return teacher;
        }

        //將查到的一行數據 轉換爲一個對象
        private Teacher RowToTeacherInfo(DataRow dr)
        {
            Teacher tea = new Teacher();
            tea.TID = dr["TID"].ToString();
            tea.PassWord = dr["PassWord"].ToString();
            tea.TName = dr["TName"].ToString();
            tea.TGender = (Convert.ToBoolean(dr["TGender"])) ? "男" : "女";
            tea.Birthday = Convert.ToDateTime(dr["Birthday"]);
            tea.AdmissionTime = Convert.ToDateTime(dr["AdmissionTime"]);
            tea.Departments = dr["Departments"].ToString();
            tea.TSalary = Convert.ToDecimal(dr["TSalary"]);
            tea.Address = dr["Address"].ToString();

            if (!dr.IsNull("Image"))
            {
                byte[] imageByte = (byte[])dr["Image"];
                MemoryStream stream = new MemoryStream(imageByte);
                tea.Image = new Bitmap(stream);
            }


            return tea;
        }

業務邏輯層

   /// <summary>
        /// 根據用戶的賬號密碼,判斷是否登錄成功
        /// </summary>
        /// <param name="id">賬號</param>
        /// <param name="pwd">密碼</param>
        /// <param name="msg">提示信息</param>
        /// <returns>成功與否</returns>
        public bool GetTeacherInfo(string id,string pwd,out string msg)
        {
            Teacher teacher = dal.GetTeacherInfo(id);
            if (teacher!=null)
            {
                if (teacher.PassWord==MD5Encode.GetMd5(pwd))
                {
                    msg = "登錄成功";
                    return true;
                }
                else
                {
                    msg = "密碼錯誤";
                    return false;

                }
            }
            else
            {
                msg = "該用戶不存在";
                return false;
            }
        }

用戶界面層

   /// <summary>
        /// 登錄按鈕,根據用戶輸入的用戶名和密碼,與數據庫中的數據進行比對 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text) ||string.IsNullOrEmpty(textBox2.Text))
            {
                return;
            }
            string msg;
            string id = textBox1.Text.Trim();
            string pwd = textBox2.Text.Trim();

            if (ucSwitch1.Checked)
            {
               
                TeacherBLL bll = new TeacherBLL();
                Boolean b = bll.GetTeacherInfo(id, pwd, out msg);
                if (b)
                {
                    //FrmTips.ShowTipsSuccess(this, msg);
                    //fea.Obj = bll.GetTeacher(id);
                    //FrmTeacherMain frmTeacher = new FrmTeacherMain();
                    //this.evtFt += new EventHandler(frmTeacher.SetTxt);
                    //if (this.evtFt!=null)
                    //{
                    //    this.evtFt(this, fea);

                    //    frmTeacher.ShowDialog();

                    //}
                    FrmTips.ShowTipsSuccess(this, msg);
                    this.Tag = bll.GetTeacher(id);
                    this.DialogResult = DialogResult.OK;
                }
                else
                {
                    FrmTips.ShowTipsError(this, msg);
                }
            }
            else
            {
                StudentBLL bll = new StudentBLL();
                Student stu = new Student();
                bool b = bll.getStudentInfoBySid(id, pwd, out msg,out stu);
                if (b)
                {
                    this.Tag = stu;
                    this.DialogResult = DialogResult.Yes;
                }
                else
                {
                    FrmTips.ShowTipsError(this, msg);
                }
            }
        }

全部的功能基本都是按着這三步走的,從數據訪問層獲取數據,再經過業務邏輯層,最後呈現到用戶界面層

這個教師和學生登錄功能, 完全可以合併,根據用戶的選項是教師還是學生,加一個判斷標識,從而調用方法。尤其是登錄業務邏輯層的代碼,一摸一樣,完全可以寫爲一個方法。

登錄成功後,個人信息的展示

在這裏插入圖片描述
在這裏插入圖片描述

主函數裏的代碼

using EAM.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Educational_Administration_Management
{
    public static class Program
    {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 frm = new Form1();

            if (frm.ShowDialog() == DialogResult.OK)
            {
                Teacher t = frm.Tag as Teacher;

                Application.Run(new FrmTeacherMain(ref t));
            }
            else if (frm.DialogResult == DialogResult.Yes)
            {
                Student s = frm.Tag as Student;
                Application.Run(new FrmStudentMain(s));
            }

            // Application.Run(new Form1());
        }
    }
}

在上面的代碼裏,看到了傳參時,一個加了ref關鍵字,另一個沒加。在這裏其實不用加:如果你只想在方法中改變引用參數的內容,沒有必要使用Ref來修飾引用參數。如果你希望在方法中改變引用對象參數的引用(調用方法外的),如重新初始化對象,則需要使用Ref關鍵字來修飾參數。在將教師方面的功能做完後,發現不用加ref,但在生成教師主窗體時傳遞的參數也仍保留了ref。
就這樣,在數據庫中可以查詢到相應數據,可以登錄時,在生成對應的主窗體時,將包含個人信息的對象作爲參數傳遞過去,之後再一一賦值。

 private void UCT_Home_Load(object sender, EventArgs e)
        {
            lblAddress.Text = teacher.Address;
            lblBir.Text = teacher.Birthday.ToString("yyy/MM/dd");
            lblAdm.Text = teacher.AdmissionTime.ToString("yyy/MM/dd");
          
            lblGender.Text = teacher.TGender;
            lblID.Text = teacher.TID;
            lblMoney.Text = teacher.TSalary.ToString();
            lblName.Text = teacher.TName;

            lblDep.Text = teacher.Departments.ToString();
            CollegeBLL bll = new CollegeBLL();
            List<College> list = bll.GetColleges();
            foreach (var item in list)
            {
                if (item.COID==lblDep.Text)
                {
                    lblDep.Text = item.COName;
                    break;
                }
            }

            if (teacher.Image!=null)
            {
                UserImage.Image = teacher.Image;
            }
        }
 private void UCS_Home_Load(object sender, EventArgs e)
        {
            lblID.Text = student.SID;
            lblName.Text = student.SName;
            lblGender.Text = student.SGender;
            lblBir.Text = student.Birthday.ToString("yyy/MM/dd");
            lblAdm.Text = student.AdmissionTime.ToString("yyy/MM/dd");
            lblDep.Text = student.Departments;
            lblClass.Text = student.Class;
            lblAge.Text = (DateTime.Now.Year - student.Birthday.Year).ToString();

            List<College> colList = new CollegeBLL().GetColleges();
            foreach (var item in colList)
            {
                if (item.COID == lblDep.Text)
                {
                    lblDep.Text = item.COName;
                    break;
                }
            }

            List<Class> claList = new ClassBLL().GetClasses();
            foreach (var item in claList)
            {
                if (item.CLID == lblClass.Text)
                {
                    lblClass.Text = item.CLName;
                    break;
                }
            }

            if (student.Image != null)
            {
                UserImage.Image = student.Image;
            }
        }

教師的學生管理

在這裏插入圖片描述

加載該頁面時的數據訪問層

   /// <summary>
        /// 獲得所有學生信息
        /// </summary>
        /// <returns></returns>
        public List<Student> GetAllStudents()
        {
            //string sql = "select StudentID,StudentName,StudentGender,Birthday,AdmissionTime,Departments,Class from Student";
            string sql = "select StudentID,StudentName,StudentGender,Birthday,AdmissionTime,college.COName,class.CLName from Student as student inner join Class as  class on student.Class=class.CLID inner join College as college on student.Departments=college.COID";
            DataTable dt = SqlHelper.ExecuteDataTable(sql, CommandType.Text);
            List<Student> list = null ;
            if (dt.Rows.Count>0)
            {
                list = new List<Student>();
                foreach (DataRow item in dt.Rows)
                {
                    list.Add(RowToStudentInfo(item));
                }
            }
            return list;
        }

加載該頁面時的業務邏輯層

 /// <summary>
        /// 獲得所有學生信息
        /// </summary>
        /// <returns></returns>
        public List<Student> GetAllStudents()
        {
            return dal.GetAllStudents();
        }

加載該頁面時的用戶界面層

  private void UCT_StudentManagement_Load(object sender, EventArgs e)
        {
            LoadStudentInfo();
        }
        StudentBLL bll = new StudentBLL();
        private void LoadStudentInfo()
        {

            dataGridView1.DataSource = bll.GetAllStudents();
            dataGridView1.AutoGenerateColumns = false;
             if (dataGridView1.Rows.Count>0)
            {
               
                dataGridView1.Rows[0].Selected = false;
            }
            for (int i = 8; i < dataGridView1.Columns.Count; i++)
            {
               
                dataGridView1.Columns[i].Visible = false;
            }
            dataGridView1.Columns[1].Visible = false;
        }

增加學生的數據訪問層

   /// <summary>
        /// 添加學生
        /// </summary>
        /// <param name="student">學生對象</param>
        /// <returns>所影響的行數</returns>
        public int AddStudentInfo(Student student)
        {
            string sql = "insert into Student (StudentID,PassWord,StudentName,StudentGender,Birthday,AdmissionTime,Departments,Class,Image) values (@SID,@PWD,@SName,@SGender,@Birthday,@AdmissionTime,@Departments,@Class,@Image)";

            SqlParameter[] pms = new SqlParameter[]
            {
                new SqlParameter("@SID", SqlDbType.VarChar,11){ Value=student.SID},
                new SqlParameter("@PWD", SqlDbType.VarChar,50){ Value=student.PassWord},
                new SqlParameter("@SName", SqlDbType.NVarChar,10){ Value=student.SName},
                new SqlParameter("@SGender", SqlDbType.Bit){Value=student.SGender=="男"?true:false},
                new SqlParameter("@Birthday", SqlDbType.DateTime){Value=student.Birthday},
                new SqlParameter("@AdmissionTime", SqlDbType.DateTime){Value=student.AdmissionTime},
                new SqlParameter("@Departments", SqlDbType.VarChar,11){Value=student.Departments},
                new SqlParameter("@Class", SqlDbType.VarChar,11){ Value=student.Class},
                new SqlParameter("@Image", SqlDbType.Image){Value=DBNull.Value}
            };


            try
            {
                return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
            }
            catch (Exception)
            {

                return 0;
            }
        }

增加學生時的業務邏輯層

 /// <summary>
        /// 添加學生
        /// </summary>
        /// <param name="student">學生對象</param>
        /// <returns>成功與否</returns>
        public bool AddStudentInfo(Student student)
        {
            return dal.AddStudentInfo(student)>0;
        }

增加學生的用戶界面層

 //添加學生
        private void btnAdd_Click(object sender, EventArgs e)
        {
            FrmAddStudent frmAdd = new FrmAddStudent();
            frmAdd.FormClosed += new FormClosedEventHandler(frmAdd_FormClosed);
            frmAdd.ShowDialog();
        }

        private void frmAdd_FormClosed(object sender, FormClosedEventArgs e)
        {
            LoadStudentInfo();
        }

刪除學生的數據訪問層

   /// <summary>
        /// 根據學號,刪除相應的學生
        /// </summary>
        /// <param name="sid">學號</param>
        /// <returns>所影響的行數</returns>
        public int DeleteStudentInfo(string sid)
        {
            string sql = "delete from Student Where StudentID=" + sid;
            return SqlHelper.ExecuteNonquery(sql, CommandType.Text);
        }

刪除學生的業務邏輯層

  /// <summary>
        /// 根據學號,刪除相應的學生
        /// </summary>
        /// <param name="sid">學號</param>
        /// <returns>所影響的行數</returns>
        public bool DeleteStudentInfo(string sid)
        {
            return dal.DeleteStudentInfo(sid) > 0;
        }

刪除學生的用戶界面層

 //刪除學生
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count>0)
            {
                string sid = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();

                StudentBLL bll = new StudentBLL();
                string msg = bll.DeleteStudentInfo(sid)?"刪除成功":"刪除失敗";
                MessageBox.Show(msg);
                LoadStudentInfo();
            }
            else
            {
                MessageBox.Show("請選擇要刪除的行");
            }

        }

修改學生的數據訪問層

   /// <summary>
        /// 修改學生信息
        /// </summary>
        /// <param name="student">學生對象</param>
        /// <returns>所影響的行數</returns>
        public int UpdateStudentInfo(Student student)
        {
            string sql = "Update Student set StudentName=@SName,StudentGender=@SGender,Birthday=@Bir,AdmissionTime=@Admi,Departments=@Depart,Class=@Cla,Image=@Image Where StudentID=@SID";

            SqlParameter[] pms = new SqlParameter[]
            {
                new SqlParameter("@SID", SqlDbType.VarChar,11){ Value=student.SID},
                //new SqlParameter("@PWD", SqlDbType.VarChar,50){ Value=student.PassWord},
                new SqlParameter("@SName", SqlDbType.NVarChar,10){ Value=student.SName},
                new SqlParameter("@SGender", SqlDbType.Bit){Value=student.SGender=="男"?true:false},
                new SqlParameter("@Bir", SqlDbType.DateTime){Value=student.Birthday},
                new SqlParameter("@Admi", SqlDbType.DateTime){Value=student.AdmissionTime},
                new SqlParameter("@Depart", SqlDbType.VarChar,11){Value=student.Departments},
                new SqlParameter("@Cla", SqlDbType.VarChar,11){ Value=student.Class},
                new SqlParameter("@Image", SqlDbType.Image){Value=DBNull.Value}
            };
            //List<SqlParameter> list = new List<SqlParameter>();
            //list.AddRange(pms);

         
            if (student.Image!=null)
            {
                pms[7].Value = student.Image;
            }

            try
            {
                return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
            }
            catch (Exception)
            {

                return 0;
            }
        }

修改學生的業務邏輯層

  /// <summary>
        /// 修改學生信息
        /// </summary>
        /// <param name="student">學生對象</param>
        /// <returns>成功與否</returns>
        public bool UpdateStudentInfo(Student student)
        {
            return dal.UpdateStudentInfo(student) > 0;
        }

修改學生的用戶界面層

  //修改學生
        public event EventHandler evtFes;
        FrmEventArgs fea = new FrmEventArgs();
        private void btnEdit_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count>0)
            {
                string sid = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();

                StudentBLL bll = new StudentBLL();
                fea.Obj = bll.GetStudentBySid(sid);

                FrmEditStudent frmEdit = new FrmEditStudent();
                this.evtFes += new EventHandler(frmEdit.SetTxt);
                if (this.evtFes!=null)
                {
                    this.evtFes(this, fea);
                    frmEdit.FormClosed += new FormClosedEventHandler(frmAdd_FormClosed);
                    frmEdit.ShowDialog();
                }
            }
            else
            {
                MessageBox.Show("請選中要修改的學生");
            }
        }

查詢學生的數據訪問層

   /// <summary>
        /// 根據查詢條件,查找相應的學生
        /// </summary>
        /// <param name="info">條件</param>
        /// <returns>查到的學生</returns>
        public List<Student> GetStudentsByInfo(string info)
        {
            List<Student> list = new List<Student>();
            string sql = " select StudentID, StudentName, StudentGender, Birthday, AdmissionTime, college.COName,class.CLName from Student as student inner join Class as  class on student.Class=class.CLID inner join College as college on student.Departments=college.COID Where student.StudentID like @SID or student.StudentName like @SName";

            SqlParameter[] pms = new SqlParameter[]
            {
                new SqlParameter("@SID","%"+info+"%"),
                new SqlParameter("@SName","%"+info+"%")
            };

            DataTable dt = SqlHelper.ExecuteDataTable(sql, CommandType.Text, pms);
            if (dt.Rows.Count>0)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    list.Add(RowToStudentInfo(dr));
                }
            }
            return list;
        }

查詢學生的業務邏輯層

   /// <summary>
        /// 根據查詢條件,查找相應的學生
        /// </summary>
        /// <param name="info">條件</param>
        /// <returns>查到的學生</returns>
        public List<Student> GetStudentsByInfo(string info)
        {
            return dal.GetStudentsByInfo(info);
        }

查詢學生的用戶界面層

 //查詢學生
        private void btnSearch_Click(object sender, EventArgs e)
        {
            string info = textBox1.Text;
            StudentBLL bll = new StudentBLL();

            List<Student> list = bll.GetStudentsByInfo(info);
            if (list.Count>0)
            {
                dataGridView1.DataSource = list;
            }
            else
            {
                MessageBox.Show("沒有查詢到相應的學生");
            }
        }

教師的課程管理

在這裏插入圖片描述

加載自己開設課程的數據訪問層

  /// <summary>
        /// 根據教師ID,查詢教師開的課程
        /// </summary>
        /// <param name="TID">教師ID</param>
        /// <returns></returns>
        public List<Course> GetCourses(string TID)
        {
            string sql = "select * from Course where Teacher=" + TID;
            List<Course> list = new List<Course>();
            DataTable dt = SqlHelper.ExecuteDataTable(sql, CommandType.Text);
            if (dt.Rows.Count>0)
            {
                foreach (DataRow dr in dt.Rows)
                {

                    list.Add(RowToCourse(dr));
                }
            }
            return list;

        }

加載自己開設課程的業務邏輯層

 /// <summary>
        /// 根據教師ID,查詢教師開的課程
        /// </summary>
        /// <param name="TID">教師ID</param>
        /// <returns></returns>
        public List<Course> GetCourses(string TID)
        {
            return dal.GetCourses(TID);
        }

加載自己開設課程的用戶界面層

 //加載課程信息
        private void LoadCourseInfo()
        {
            CourseBLL bll = new CourseBLL();
            dataGridView1.DataSource = bll.GetCourses(teacher.TID);
        }

增加課程的數據訪問層

  /// <summary>
        /// 添加課程
        /// </summary>
        /// <param name="course">課程對象</param>
        /// <returns></returns>
        public int AddCourse(Course course)
        {
            string sql = "insert into Course values(@CID,@CName,@Dep,@Teac)";
            SqlParameter[] pms = new SqlParameter[]
            {
                new SqlParameter("@CID", course.CID),
                new SqlParameter("@CName",course.CName),
                new SqlParameter("@Dep",course.Departments),
                new SqlParameter("@Teac",course.CTeacher)
        };

            try
            {
                return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
            }
            catch (Exception)
            {

                return 0;

            }
        }

增加課程的業務邏輯層

 /// <summary>
        /// 添加課程
        /// </summary>
        /// <param name="course">課程對象</param>
        /// <returns></returns>
        public bool AddCourse(Course course)
        {
            return dal.AddCourse(course) > 0;
        }

增加課程的用戶界面層

  //添加課程
        private void ucBtnAdd_BtnClick(object sender, EventArgs e)
        {
            if (!Check.isCourse(textBox1.Text))
            {
                MessageBox.Show("課程號錯誤");
                return;
            }

            string cid = textBox1.Text;
            string cname = textBox2.Text;

            Course course = new Course()
            {
                CID=cid,
                CName=cname,
                Departments=teacher.Departments,
                CTeacher=teacher.TID
            };
            CourseBLL bll = new CourseBLL();
           if (bll.AddCourse(course))
            {
                MessageBox.Show("添加成功");
                LoadCourseInfo();
                textBox1.Text = "";
                textBox2.Text = "";
            }
           else
            {
                MessageBox.Show("添加失敗");
            }

        }

刪除課程的數據訪問層

  /// <summary>
        /// 根據課程號,刪除課程
        /// </summary>
        /// <param name="CID">課程號</param>
        /// <returns></returns>
        public int DeleteCourse(string CID)
        {
            string sql = "delete from Course Where CID=" + CID;
            return SqlHelper.ExecuteNonquery(sql, CommandType.Text);
        }

刪除課程的業務邏輯層

  /// <summary>
        /// 根據課程號,刪除課程
        /// </summary>
        /// <param name="CID">課程號</param>
        /// <returns></returns>
        public bool DeleteCourse(string CID)
        {
            return dal.DeleteCourse(CID) > 0;
        }

刪除課程的用戶界面層

 //刪除課程
        private void ucBtnDelete_BtnClick(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count>0)
            {
                string sid = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
                CourseBLL bll = new CourseBLL();
                string msg = bll.DeleteCourse(sid) ? "刪除成功" : "刪除失敗";
                MessageBox.Show(msg);
                LoadCourseInfo();
            }
            else
            {
                MessageBox.Show("請選中要刪除的行");
            }
        }

加載選修自己課程的學生信息的數據訪問層

 /// <summary>
        /// 獲得教師所教授的學生成績表的信息
        /// </summary>
        /// <param name="tid">教師ID</param>
        /// <param name="pageCount"></param>
        /// <param name="recordCount"></param>
        /// <returns></returns>
        public DataTable GetScores(string tid,out string pageCount,out string recordCount,int pageIndex,int pageSize)
        {
            SqlParameter[] pms = new SqlParameter[]
           {
                new SqlParameter("@TID", SqlDbType.VarChar,11){Value=tid},
                new SqlParameter("@pageIndex", SqlDbType.Int){Value=pageIndex},
                new SqlParameter("@pageSize", SqlDbType.Int){Value=pageSize},
                new SqlParameter("@pageCount", SqlDbType.Int){Direction= ParameterDirection.Output},
                new SqlParameter("@recordCount", SqlDbType.Int){Direction= ParameterDirection.Output}
           };
            DataTable dt = SqlHelper.ExecuteDataTable("usp_getStudentScoreByPage", CommandType.StoredProcedure,pms);

            
            pageCount = pms[3].Value.ToString();
            recordCount = pms[4].Value.ToString();

            return dt;
        }

加載選修自己課程的學生信息的業務邏輯層

  /// <summary>
        /// 獲得教師所教授的學生的成績
        /// </summary>
        /// <param name="tid"></param>
        /// <param name="pageCount"></param>
        /// <param name="recordCount"></param>
        /// <returns></returns>
        public DataTable GetScores(string tid, out string pageCount, out string recordCount,int pageIndex,int pageSize)
        {
            return dal.GetScores(tid, out pageCount, out recordCount,pageIndex,pageSize);
        }

加載選修自己課程的學生信息的用戶界面層

  int pageIndex = 1, pageSize = 16;
        string pageCount;
        string recordCount;
        //加載學生成績信息
        private void LoadScoreInfo()
        {
            ScoreBLL bll = new ScoreBLL();
           
           
            dataGridView2.DataSource = bll.GetScores(teacher.TID,out pageCount,out recordCount,pageIndex,pageSize);

            label1.Text = "共有" + pageCount + "頁,共有" + recordCount + "條記錄";

        }

查看成績的上一頁、下一頁

    //上一頁
        private void ucBtnExt1_BtnClick(object sender, EventArgs e)
        {
            pageIndex--;
            if (pageIndex<1)
            {
                pageIndex = 1;
            }
            label2.Text = "當前爲第" + pageIndex + "頁";
            LoadScoreInfo();
        }

        //下一頁
        private void ucBtnExt2_BtnClick(object sender, EventArgs e)
        {
            pageIndex++;
            if (pageIndex>Convert.ToInt32(pageCount))
            {
                pageIndex = Convert.ToInt32(pageCount);
            }
            label2.Text = "當前爲第" + pageIndex + "頁";
            LoadScoreInfo();
        }

修改成績的數據訪問層

  /// <summary>
        /// 更新學生成績
        /// </summary>
        /// <param name="score">成績</param>
        /// <param name="sid">學生id</param>
        /// <returns></returns>
        public int UpdateScore(int score,string sid,string cid)
        {
            string sql = "update Student_Grade set Score=@score where SID=" + sid+" and CID ="+cid;

            SqlParameter pms = new SqlParameter("@score", score);
            return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
        }

修改成績的業務邏輯層

   /// <summary>
        /// 更新學生成績
        /// </summary>
        /// <param name="score">成績</param>
        /// <param name="sid">學生id</param>
        /// <returns></returns>
        public bool UpdateScore(int score, string sid,string cid)
        {
            return dal.UpdateScore(score, sid,cid) > 0;
        }

修改成績的用戶界面層

 private void dataGridView2_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("格式不正確,請輸入整數");
            dataGridView2.CancelEdit();
        }

        private void dataGridView2_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {

            string sid="";
            string cid="";
            int score=0;
            try
            {
                 sid = dataGridView2.Rows[e.RowIndex].Cells[0].Value.ToString();
                 cid = dataGridView2.Rows[e.RowIndex].Cells[4].Value.ToString();
                 score = Convert.ToInt32(dataGridView2.Rows[e.RowIndex].Cells[3].Value);
            }
            catch (Exception)
            {
                MessageBox.Show("錄入失敗");
                return;
            }

            //這個判斷看起來,有些智障,不過 就先這樣吧
            if (score < 0 || score > 100)
            {
                MessageBox.Show("輸入錯誤");
                return;
            }

            ScoreBLL bll = new ScoreBLL();
            if (!bll.UpdateScore(score,sid,cid))
            {

                MessageBox.Show("錄入失敗");
            }
        }

修改個人信息

在這裏插入圖片描述

修改個人信息的數據訪問層

/// <summary>
        /// 修改教師信息
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public int EditTeacher(Teacher t)
        {
            string sql = "update Teacher set TName=@name,TGender=@gender,Birthday=@bir,AdmissionTime=@adm,Departments=@depart,TSalary=@salary,Image=@image,Address=@add where TID=@ID";
            byte[] buffer;
            using(MemoryStream ms=new MemoryStream())
            {
                t.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
                buffer = ms.GetBuffer();
            }
            SqlParameter[] pms = new SqlParameter[]
            {
                new SqlParameter("@ID",t.TID),
                new SqlParameter("@name",t.TName),
                new SqlParameter("@gender", SqlDbType.Bit){Value=t.TGender=="男"?true:false},
                new SqlParameter("@bir", SqlDbType.DateTime){Value=t.Birthday},
                new SqlParameter("@adm", SqlDbType.Date){Value=t.AdmissionTime},
                new SqlParameter("@depart", t.Departments),
                new SqlParameter("@salary",t.TSalary),
                new SqlParameter("@add",t.Address),
                new SqlParameter("@image", SqlDbType.Image){Value=buffer}
            };

            try
            {
                return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
            }
            catch (Exception)
            {

                return 0;
            }
        }

修改信息的業務邏輯層

  /// <summary>
        /// 修改教師信息
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool EditTeacher(Teacher t)
        {
            return dal.EditTeacher(t)>0;
        }

修改信息的用戶界面層

    //確定修改
        private void ucBtnSave_BtnClick(object sender, EventArgs e)
        {
            if (!Check.isTeacherID(txtTID.Text))
            {
                MessageBox.Show("工號不正確");
                return;
            }

            try
            {
                teacher.TID = txtTID.Text;
                teacher.TName = txtName.Text;
                teacher.Address = txtAddress.Text;
                teacher.TSalary = Convert.ToDecimal(txtTSalary.Text);
                teacher.TGender = cmbGender.Text;
                teacher.Departments = cmbDepart.SelectedValue.ToString();
                teacher.Birthday = Convert.ToDateTime(dtpBir.Value.ToString("yyy/MM/dd"));
                teacher.AdmissionTime = Convert.ToDateTime(dtpAdmission.Value.ToString("yyy/MM/dd"));

                teacher.Image = (Bitmap)pictureBox1.Image;
                TeacherBLL bll = new TeacherBLL();
                string msg = bll.EditTeacher(teacher) ? "修改成功" : "修改失敗";
                MessageBox.Show(msg);

                LoadTeacherInfo();
            }
            catch (Exception)
            {
                MessageBox.Show("修改失敗");
            }
        }

修改密碼的數據訪問層

 /// <summary>
        /// 修改密碼
        /// </summary>
        /// <param name="pwd">新密碼</param>
        /// <param name="id">教師ID</param>
        /// <returns></returns>
        public int EditPwd(string pwd,string id)
        {
            string sql = "update Teacher set PassWord=@pwd where TID=" + id;
            SqlParameter pms = new SqlParameter("@pwd", pwd);
            return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
        }

修改密碼的業務邏輯層

  /// <summary>
        /// 修改密碼
        /// </summary>
        /// <param name="pwd">新密碼</param>
        /// <param name="id">教師ID</param>
        /// <returns></returns>
        public bool EditPwd(string pwd, string id)
        {
            return dal.EditPwd(pwd, id)>0;
        }

修改密碼的用戶界面層

   private void ucBtnChangePwd_BtnClick(object sender, EventArgs e)
        {
            FrmInputs frm = new FrmInputs("修改密碼",
                  new string[] { "舊密碼", "新密碼", "確定密碼" },
                  new Dictionary<string, HZH_Controls.TextInputType>() { },
                 new Dictionary<string, string>() { },
                 new Dictionary<string, KeyBoardType>() { { "舊密碼", KeyBoardType.UCKeyBorderAll_EN }, { "新密碼", KeyBoardType.UCKeyBorderAll_EN } },
                 new List<string>() { "舊密碼", "新密碼", "確定密碼" });
            frm.ShowDialog(this);
            if (frm.DialogResult== DialogResult.OK)
            {
                string oldPwd = frm.Values[0];
                string newPwd = frm.Values[1];
                string comPwd = frm.Values[2];
                if (newPwd!=comPwd)
                {
                    MessageBox.Show("兩次密碼不一致");
                    return;
                }

               if (!Check.isPwd(newPwd))
                {
                    MessageBox.Show("密碼最少6位,包括至少1個大寫字母,1個小寫字母,1個數字,1個特殊字符");
                    return;
                }

                if (MD5Encode.GetMd5(oldPwd)==teacher.PassWord)
                {
                    TeacherBLL bll = new TeacherBLL();
                    string msg = bll.EditPwd(MD5Encode.GetMd5(newPwd), teacher.TID)?"修改成功":"修改失敗";
                    MessageBox.Show(msg);
                }
                else
                {
                    MessageBox.Show("原密碼錯誤");
                }
            }
        }

學生的課程管理

在這裏插入圖片描述

加載學院開設課程,學生已選課程,學生選課、退課的數據訪問層

 /// <summary>
        /// 學生選課時,獲得所有課程
        /// </summary>
        /// <returns></returns>
        public List<Course> getCourse()
        {
            string sql = "select * from Course";
            List<Course> list = new List<Course>();

            DataTable dt = SqlHelper.ExecuteDataTable(sql, CommandType.Text);
            if (dt.Rows.Count>0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    list.Add(RowToCourse(item));
                }
            }
            return list;
        }


        /// <summary>
        /// 根據學生學號,查詢學生的課程
        /// </summary>
        /// <param name="sid"></param>
        /// <returns></returns>
        public List<Course> getMyCourse(string sid)
        {
            string sql = "select  c.CID,c.CName from Student_Grade as s inner join Course as c on s.CID = c.CID where s.SID = " + sid;
            List<Course> list = new List<Course>();
            using(SqlDataReader reader=SqlHelper.ExecuteReader(sql, CommandType.Text))
            {
                if(reader.HasRows)
                {
                    while(reader.Read())
                    {
                        Course course = new Course();
                        course.CID = reader.GetString(0);
                        course.CName = reader.GetString(1);
                        list.Add(course);
                    }
                }
            }
            return list;
        }

        /// <summary>
        /// 學生選課
        /// </summary>
        /// <param name="sid"></param>
        /// <param name="cid"></param>
        /// <returns></returns>
        public int AddStuCourse(string sid,string cid)
        {
            string sql = "insert into Student_Grade (SID,CID) values (@sid,@cid)";
            SqlParameter[] pms = new SqlParameter[]
            {
                new SqlParameter("@sid",sid),
                new SqlParameter("@cid",cid)
            };
            return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
        }

        /// <summary>
        /// 學生刪除課程
        /// </summary>
        /// <param name="sid"></param>
        /// <param name="cid"></param>
        /// <returns></returns>
        public int DeleteStuCourse(string sid,string cid)
        {
            string sql = "delete from Student_Grade where SID=@sid and CID=@cid";
            SqlParameter[] pms = new SqlParameter[]
           {
                new SqlParameter("@sid",sid),
                new SqlParameter("@cid",cid)
           };
            return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
        }

加載學院開設課程,學生已選課程,學生選課、退課的業務邏輯層

 /// <summary>
        /// 學生選課時,獲得所有課程
        /// </summary>
        /// <returns></returns>
        public List<Course> getCourse()
        {
            return dal.getCourse();
        }

        /// <summary>
        /// 根據學生學號,查詢學生的課程
        /// </summary>
        /// <param name="sid"></param>
        /// <returns></returns>
        public List<Course> getMyCourse(string sid)
        {
            return dal.getMyCourse(sid);
        }

        /// <summary>
        /// 學生選課
        /// </summary>
        /// <param name="sid"></param>
        /// <param name="cid"></param>
        /// <returns></returns>
        public bool AddStuCourse(string sid, string cid)
        {
            return dal.AddStuCourse(sid, cid) > 0;
        }

        /// <summary>
        /// 學生刪除課程
        /// </summary>
        /// <param name="sid"></param>
        /// <param name="cid"></param>
        /// <returns></returns>
        public bool DeleteStuCourse(string sid, string cid)
        {
            return dal.DeleteStuCourse(sid, cid) > 0;
        }

加載學院開設課程,學生已選課程,學生選課、退課的用戶界面層

  private void LoadMyCourse()
        {
            CourseBLL bll = new CourseBLL();
            List<Course> list = bll.getMyCourse(sid);
            dataGridView2.DataSource = list;
        }



        private void LoadCourse()
        {
            CourseBLL bll = new CourseBLL();
            List<Course> list = bll.getCourse();
            dataGridView1.DataSource = list;
        }

        private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if(true)
            {
                string cid = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
                CourseBLL bll = new CourseBLL();
                bool b = bll.AddStuCourse(sid, cid);
                if (b)
                {
                    MessageBox.Show("選課成功");
                    LoadMyCourse();
                }
                else
                {
                    MessageBox.Show("選課失敗");
                }
            }
        }

        private void dataGridView2_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (true)
            {
                string cid = dataGridView2.Rows[e.RowIndex].Cells[0].Value.ToString();
                CourseBLL bll = new CourseBLL();
                bool b = bll.DeleteStuCourse(sid, cid);
                if (b)
                {
                    MessageBox.Show("退課成功");
                    LoadMyCourse();
                }
                else
                {
                    MessageBox.Show("退課失敗");
                }
            }
        }

學生成績查詢

在這裏插入圖片描述

查詢成績的數據訪問層

 /// <summary>
        /// 學生查看自己的成績
        /// </summary>
        /// <param name="sid">學生學號</param>
        /// <returns></returns>
        public List<Score> getScores(string sid)
        {
            string sql = "select CName,Score,TName from Student_Grade inner join Course on Course.CID = Student_Grade.CID inner join Teacher on Course.Teacher = Teacher.TID where SID = "+sid;
            List<Score> list = new List<Score>();

            using(SqlDataReader reader=SqlHelper.ExecuteReader(sql, CommandType.Text))
            {
                if (reader.HasRows)
                {
                    while(reader.Read())
                    {
                        Score score = new Score();
                        score.CID = reader.GetString(0);                        
                       score.Grade = reader.IsDBNull(1) ? null :(double?) reader.GetDouble(1);
                        score.SID = reader.GetString(2);
                        list.Add(score);
                    }
                }
            }
            return list;
        }

查詢成績的業務邏輯層

   /// <summary>
        /// 學生查看自己的成績
        /// </summary>
        /// <param name="sid">學生學號</param>
        /// <returns></returns>
        public List<Score> getScores(string sid)
        {
            return dal.getScores(sid);
        }

查詢成績的用戶界面層

 private void LoadChart()
        {
            ScoreBLL bll = new ScoreBLL();
            List<Score> list = bll.getScores(sid);

            List<string> courseList = new List<string>();
            List<double> scoreList = new List<double>();

            foreach (var item in list)
            {
               
                if (item.Grade!=null)
                {
                    scoreList.Add(Convert.ToDouble(item.Grade));
                    courseList.Add(item.CID);
                }               
            }
            chart1.ChartAreas[0].AxisX.Title = "課程";
            chart1.ChartAreas[0].AxisY.Title = "成績";

            chart1.ChartAreas[0].AxisX.LabelStyle.Font = new Font("微軟雅黑", 10, FontStyle.Bold);
            chart1.ChartAreas[0].AxisY.LabelStyle.Font = new Font("微軟雅黑", 10, FontStyle.Bold);
            chart1.Series[0].Points.DataBindXY(courseList, scoreList);
           
        }

        private void LoadScore()
        {
            List<DataGridViewColumnEntity> lstCulumns = new List<DataGridViewColumnEntity>();
            lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "CID", HeadText = "課程名", Width = 70, WidthType = SizeType.Percent });
            lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "Grade", HeadText = "分數", Width = 70, WidthType = SizeType.Percent, Format = (a) => { return ((double?)a) == null ? "暫無成績" : a.ToString(); } });
            lstCulumns.Add(new DataGridViewColumnEntity() { DataField = "SID", HeadText = "教師", Width = 50, WidthType = SizeType.Percent });
            this.ucDataGridView1.Columns = lstCulumns;
            this.ucDataGridView1.IsShowCheckBox = true;
            this.ucDataGridView1.DataSource = new ScoreBLL().getScores(sid);
            this.ucDataGridView1.First();
        }

學生修改個人信息

在這裏插入圖片描述

修改個人信息與密碼的數據訪問層

  /// <summary>
        /// 學生修改個人信息
        /// </summary>
        /// <param name="student"></param>
        /// <returns></returns>
        public int EditStudent(Student student)
        {
            string sql = "update Student set StudentName=@name,StudentGender=@gender,Birthday=@bir,AdmissionTime=@adm,Departments=@depart,Class=@class,Image=@image where StudentID=@ID";

            byte[] buffer;
            using (MemoryStream ms = new MemoryStream())
            {
                student.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
                buffer = ms.GetBuffer();
            }

            SqlParameter[] pms = new SqlParameter[]
            {
                new SqlParameter("@ID",student.SID),
                new SqlParameter("@name",student.SName),
                new SqlParameter("@gender", SqlDbType.Bit){ Value=student.SGender=="男"?true:false},
                new SqlParameter("@bir",student.Birthday),
                new SqlParameter("@adm", student.AdmissionTime),
                new SqlParameter("@depart",student.Departments),
                new SqlParameter("@class",student.Class),
                new SqlParameter("@image", SqlDbType.Image){Value=buffer}
            };
            try
            {
                return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
            }
            catch (Exception)
            {

                return 0;
            }
        }

        /// <summary>
        /// 學生修改密碼
        /// </summary>
        /// <param name="pwd"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public int EditPwd(string pwd,string id)
        {
            string sql = "update Student set PassWord=@pwd where StudentID=" + id;
            SqlParameter pms = new SqlParameter("@pwd", pwd);
            return SqlHelper.ExecuteNonquery(sql, CommandType.Text, pms);
        }

學生修改個人信息的業務邏輯層

 /// <summary>
        /// 學生修改個人信息
        /// </summary>
        /// <param name="student"></param>
        /// <returns></returns>
        public bool EditStudent(Student student)
        {
            return dal.EditStudent(student) > 0;
        }


        /// <summary>
        /// 學生修改密碼
        /// </summary>
        /// <param name="pwd"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool EditPwd(string pwd, string id)
        {
            return dal.EditPwd(pwd, id) > 0;
        }

修改個人信息的用戶界面層

  private void ucBtnSave_BtnClick(object sender, EventArgs e)
        {
            if (!Check.isStudentID(txtTID.Text))
            {
                MessageBox.Show("學號不正確");
                return;
            }

            try
            {
                student.SID = txtTID.Text;
                student.SName = txtName.Text;


                student.SGender = cmbGender.Text;
                student.Departments = cmbDepart.SelectedValue.ToString();
                student.Class = cmbClass.SelectedValue.ToString();
                student.Birthday = Convert.ToDateTime(dtpBir.Value.ToString("yyy/MM/dd"));
                student.AdmissionTime = Convert.ToDateTime(dtpAdmission.Value.ToString("yyy/MM/dd"));

                student.Image = (Bitmap)pictureBox1.Image;
                StudentBLL bll = new StudentBLL();
                string msg = bll.EditStudent(student) ? "修改成功" : "修改失敗";
                MessageBox.Show(msg);

                LoadStudentInfo();
            }
            catch (Exception)
            {
                MessageBox.Show("修改失敗");
            }
        }

        private void ucBtnChangePwd_BtnClick(object sender, EventArgs e)
        {
            FrmInputs frm = new FrmInputs("修改密碼",
                 new string[] { "舊密碼", "新密碼", "確定密碼" },
                 new Dictionary<string, HZH_Controls.TextInputType>() { },
                new Dictionary<string, string>() { },
                new Dictionary<string, KeyBoardType>() { { "舊密碼", KeyBoardType.UCKeyBorderAll_EN }, { "新密碼", KeyBoardType.UCKeyBorderAll_EN } },
                new List<string>() { "舊密碼", "新密碼", "確定密碼" });
            frm.ShowDialog(this);
            if (frm.DialogResult == DialogResult.OK)
            {
                string oldPwd = frm.Values[0];
                string newPwd = frm.Values[1];
                string comPwd = frm.Values[2];
                if (newPwd != comPwd)
                {
                    MessageBox.Show("兩次密碼不一致");
                    return;
                }
                 if (!Check.isPwd(newPwd))
                {
                    MessageBox.Show("密碼最少6位,包括至少1個大寫字母,1個小寫字母,1個數字,1個特殊字符");
                    return;
                }
                if (MD5Encode.GetMd5(oldPwd) == student.PassWord)
                {
                    StudentBLL bll = new StudentBLL();
                    string msg = bll.EditPwd(MD5Encode.GetMd5(newPwd), student.SID) ? "修改成功" : "修改失敗";
                    MessageBox.Show(msg);
                }
                else
                {
                    MessageBox.Show("原密碼錯誤");
                }
            }
        }

截止到現在,B站上的作業演示視頻播放量超過了5000,收藏人數過百,點贊即將過百。這個之前根本就沒有想到過。現在的網友太熱情了,爲了回饋熱情的網友,在期末考試安全通過後,把未做完的那個B/S結構的給安排上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章