黑马程序员_学习日记54_626三层项目(三层案例)

来源:互联网 发布:淘宝权重查询 编辑:程序博客网 时间:2024/06/10 12:34

1、写三层的基本步骤:(以登录练习为例)

1.1根据功能分析Sql语句

由于要求要判断用户名是否存在,并且登录成功后要记录当前用户的真实姓名、主键Id,所以这时考虑sql语句不能是:select count(*)...,应该是下面这条:

select * from T_Seats where CC_LoginId=@uid

1.2根据sql语句编写数据访问层

1.3编写业务逻辑层BLL(业务逻辑层中的方法的参数与返回值由表现层(调用者)来决定)

1.4编写表现层,在表现层调用业务逻辑层

 

2、TSeatsBll、TSeatDal 为什么不写成静态的?

这些业务逻辑层类、数据访问层类没有写成静态的,是为了以后实现多态

 

3、三层实现增删改查

3.1结构

DAL:SqlHelper.cs+PersonDal.cs

+

BLL:PersonBll.cs

+

UI:Form1.cs+App.config

+

Model:Person.cs

3.2具体问题

3.2.1Load时读取整张表应该用List<Person>作为返回值,而不是DataTable;List<Person>用DataReader读取;Person变量应该声明在循环内。具体实现为

 public List<Person> LoadTable()

{

    string sql = "select uName,age,height,gender from TblPerson";

    List<Person> listPerson = new List<Person>();

    using (SqlDataReader reader = SqlHelper.ExecuteReader(constr,CommandType.Text,sql))

    {

       if (reader.HasRows)

       {

           while (reader.Read())

           {

              //应该在循环内部声明Person变量,才能实例化多个对象,不然加载到List上为多个相同的Person

              Person person = new Person();

              person.UName = reader.GetString(0);

              person.Age = reader.GetInt32(1);

              person.Height = reader.IsDBNull(2) ? null : (int?)reader.GetInt32(2);

              person.Gender = reader.IsDBNull(3) ? null : (object)reader.GetBoolean(3);

              listPerson.Add(person);

           }

       }

    } 

    return listPerson;

}

3.2.2Insert方法需要返回自动编号用output inserted.autoId。用ExecuteScalar返回

3.2.3Person类的Gender属性用object类型,方便实现在UI层由bool类型向string类型的转换

 

4、三层实现登录、修改密码

4.1结构

DAL:SqlHelper.cs+SeatsDal.cs

+

BLL:CommonHelper.cs(封装MD5算法)+SeatsBll.cs

+

UI:App.config+GlobalHelper.cs(保存需要在窗口间传递的静态字段)+LoginForm.cs+RegisterForm.cs

+

Model:SeatModel.cs(存放座席信息)