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(存放座席信息)