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