这里说的三层结构是逻辑上的三层,并不是说分开在不同的机器上执行。而是为了项目的结构更清楚,更完整,有利于后期的修改与维护。
三层结构包括:表示层(USL),业务逻辑层(BLL),数据访问层(DAL)
表示层:直接接受用户的命令,将命令转换为业务逻辑层能接受的形式,交给业务逻辑层去执行,并从业务逻辑层获得返回结果,展示在界面上给用户看。(可以使WEB方式,也可以是 WinForm方式)
业务逻辑层:将表示层传递过来的命令转换成数据访问层能够接受的形式,交给数据访问层去执行,并得到数据访问层的返回结果,将结果交给表示层。
数据访问层:将传递过来的业务逻辑层命令,转换成数据访问层能接受的形式,交给数据库去执行,并得到数据访问层的返回结果,将结果再交给业务逻辑层。
各司其职大概就是这个意思了。
底下是一个简单的三层结构:
SQL Server DAL(DAL)里包含了三个类(ClassInfoService和DepartService和DBHelper)这两个类里面的方法基本是一样的,只是针对两张不同的表来操作的。下面只给出一个类:
通用数据访问类(DBHelper)通过这个类就可以访问指定的数据库。
public class DBHelper { string connString = @"server=.;database=schoolDB2;uid=sa;pwd=514420;"; //数据操作语言。在连接数据库后,对数据进行增删改 public int ExcuteNoneQury(string sql, SqlParameter[] ps) { SqlConnection connection = new SqlConnection(connString); SqlCommand command = connection.CreateCommand(); command.CommandText = sql; command.Parameters.AddRange(ps); connection.Open(); int x = command.ExecuteNonQuery(); connection.Close(); return x; }//按要求查询数据 public DataTable GetTable(string sql, SqlParameter[] ps) { SqlConnection connection = new SqlConnection(connString); SqlCommand command = connection.CreateCommand(); command.CommandText = sql; command.Parameters.AddRange(ps); SqlDataAdapter sda = new SqlDataAdapter(command); DataTable dt = new DataTable(); sda.Fill(dt); return dt; } }
底下是一个特定数据访问类
/// <summary> /// 特定数据访问类。对表执行特定的增删改查询 /// </summary> public class DepartService { DBHelper db = new DBHelper(); public void AddDepart(Depart depart) { string sql = "Insert into Depart(departName)values(@departName)"; SqlParameter[] ps = new SqlParameter[] { new SqlParameter("@departName", depart.DepartName) }; db.ExcuteNoneQury(sql,ps); } public void UpdateDepart(Depart depart) { string sql = "Update Depart set departName=@departName where id=@id"; SqlParameter[] ps = new SqlParameter[] { new SqlParameter("@departName", depart.DepartName), new SqlParameter("@id", depart.Id) }; db.ExcuteNoneQury(sql, ps); } public void DeleteDepart(int id) { string sql = "Delete from Depart where id=@id"; SqlParameter[] ps = new SqlParameter[] { new SqlParameter("@id", id) }; db.ExcuteNoneQury(sql, ps); }//根据ID 查询 public Depart GetDepart(int id) { string sql = "Select * from Depart where id=@id"; SqlParameter[] ps = new SqlParameter[] { new SqlParameter("@id", id) }; DataTable dt = db.GetTable(sql,ps); if (dt.Rows.Count==0) { return null; } DataRow dr = dt.Rows[0]; Depart depart = new Depart(); depart.Id = (int)dr["Id"]; depart.DepartName = (string)dr["departName"]; return depart; }//无条件查询 public List<Depart> GetDeparts() { string sql = "Select * from Depart "; SqlParameter[] ps = new SqlParameter[] { }; DataTable dt = db.GetTable(sql, ps); List<Depart> list = new List<Depart>(); //查询出来的是很多行 foreach (DataRow rows in dt.Rows) { Depart depart = new Depart(); depart.Id = (int)rows["Id"]; depart.DepartName = (string)rows["DepartName"]; list.Add(depart); } return list; } }
业务逻辑层主要是对数据访问层的数据和表示层传来的命令进行处理。这里的BLL只包含了对DAL传来的数据做了简单的处理。(调用)
public class DepartManager { static DepartService ds = new DepartService(); public static void AddDepart(Depart depart) { ds.AddDepart(depart); } public static void UpdateDepart(Depart depart) { ds.UpdateDepart(depart); } public static void DeleteDepart(int id) { ds.DeleteDepart(id); } public static Depart GetDepart(int id) { return ds.GetDepart(id); } public static List<Depart> GetDeparts() { return ds.GetDeparts(); } }