数据库大作业代码展示

在评论区里说代码垃圾之前,我先说了:这代码写的挺垃圾的。在即将完成一半的时候意识到了,代码冗余太多,基本没有遵循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结构的给安排上。

上一篇:WPF_多个表新增


下一篇:标准的输入、输出流