三层架构(DAL层Data Access Layer数据库访问层)(16)
三層架構即是把數據庫訪問,業務邏輯,界面分離。
三層結構為:
1.表示層(USL - User Show Layer):主要表示WEB方式,也可以表示成WINFORM方式。如果邏輯層相當強大和完善,無論表現層如何定義和更改,邏輯層都能完善地提供服務。
2.業務邏輯層(BLL):主要是針對具體的問題的操作,也可以理解成對數據層的操作,對數據業務邏輯處理。如果說數據層是積木,那邏輯層就是對這些積木的搭建。3.數據訪問層(DAL - Data Access Layer):主要是對原始數據(數據庫或者文本文件等存放數據的形式)的操作層,而不是指原始數據,也就是說,是對數據的操作,而不是數據庫,具體為業務邏輯層或表示層提供數據服務。
ASP.NET MVC Framework是微軟在ASP.NET中所添加的一組類別庫,這組類庫可以使用Model-View-Controller的設計模式來開發ASP.NET的應用程序。
Model:包括數據、驗證規則、數據訪問和業務邏輯等應用程序信息。
View:封裝了應用程序的表示層,是呈現給使用者看的信息。
Controller:包括控制流邏輯,控制信息流和應用程序的執行。接受來自用戶的指令與數據,并將Model與View做整合的控制器,當服務器接到
對ASP.NET MVC應用程序的要求時,服務器(IIS)會先使用UrlRoutingModule(ASP.NET
Routing的HTTP模塊),由它來解析是否有包含ASP.NET
MVC應用程序的URL,若有,則會產生一個MvcRouteHandler對象,這個對象會裝載執行的必要信息,并且會呼叫包含在URL中的
Controller的Execute方法來執行工作。
DAL常用封裝:ToModel,ListAll(對于大數據量的數據不要提供,而是提供條件搜索),GetById,DeleteById,Update,Addnew.
再次使用上一實例的T_Student數據庫。數據庫設計如下:
第一步:新建一個類,命名為StudentDAL.cs將想要得到數據庫數據總條數的方法(GetCount())創建到類中,代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ExecuteReader執行查詢
{
class StudentADL
{
public static int GetCount()
{
return (int)SqlHelper.ExecuteScalar("select count(*) from T_Student");
}
}
}
第二步:新建一個窗體:MVC.AXML,并拖動一個按鈕btnADL,并為其添加Click事件,代碼如下:
private void btnADL_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(StudentADL.GetCount().ToString());
}
第三步:在StudentADL.cs中新建一個方法DeleteById()。代碼如下:
public static void DeleteById(long id)
{
SqlHelper.ExecuteNonQuery("delete from T_Student where Id=@id",new SqlParameter("@id",id));
}
第四步:在MVC.AXML,并拖動一個按鈕btnDel,并為其添加Click事件,代碼如下:
private void btnDel_Click(object sender, RoutedEventArgs e)
{
StudentADL.DeleteById(200);
MessageBox.Show("成功刪除");
}
第五步:在MVC.AXML,并拖動一個按鈕btnInsert,并為其添加Click事件,代碼如下:
private void btnInsert_Click(object sender, RoutedEventArgs e)
{
Student student = new Student();
student.Name = "劉三";
student.Age = 19;
student.AiHao = "游泳";
student.Height = 178;
student.BirthDay = DateTime.Parse("1998-2-3");
student.InDate = DateTime.Now;
StudentADL.Insert(student);
}
第六步:在StudentADL.cs中新建一個方法Insert(Student student),其中也包括一些其他方法。 代碼如下:
//public static void Insert(string name,int age,int height,string Aihao DateTime )
//{如果列比較多則參數就會比較多,要把參數封裝到Model中。所以需要新建一個Student.cs的類
//
//}
/// <summary>
/// 如果value==null則返回DBNull.Value,否則返回value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static object ToDBValue(object value)
{
if(value==null)
{ return DBNull.Value;}
else return value;
}
public static void Insert(Student student)
{
//object objBirthday;
//if(student.BirthDay==null)
//{
// objBirthday=DBNull.Value;
//}
//else
//{
// objBirthday=student.BirthDay;
//}
//Height,InDate同理也可以這樣寫,但是仍比較麻煩,現在有比較簡單的方式---就是實現并聲明一個方法ToDBValue
SqlHelper.ExecuteNonQuery(@"insert into T_Student(Name,Age,Height,AiHao ,BirthDay,InDate)values
(@Name,@Age,@Height,@AiHao ,@BirthDay,@InDate)", new SqlParameter("@Name",student.Name),
new SqlParameter("@Age", student.Age), new SqlParameter("@Height", ToDBValue(student.Height)),
new SqlParameter("@Aihao", student.AiHao),
//new SqlParameter("@BirthDay", student.BirthDay),
//new SqlParameter("@BirthDay", objBirthday),沒有使用ToDBValue()方法
new SqlParameter("@BirthDay", ToDBValue(student.BirthDay)),//使用ToDBValue()方法s
new SqlParameter("@InDate", ToDBValue(student.InDate)));
}
第七步:在MVC.AXML,并拖動一個按鈕btnGetById,并為其添加Click事件,代碼如下:
private void btnGetById_Click(object sender, RoutedEventArgs e)
{
Student student = StudentADL.GetById(1);
MessageBox.Show("通過ID="+student.Id+"查詢結果為::"+student.Name+","+student.Age.ToString()+","+student.AiHao+","+student.BirthDay.ToString(),student.InDate.ToString());
}
第八步:在StudentADL.cs中新建一個方法GetById(long id),其中也包括一些其他方法。 代碼如下:
/// <summary>
/// 如果value==DBNull.Value則返回null,否則返回value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static object FromDBValue(object value)
{
if (value == DBNull.Value)
return null;
else
return value;
}
//ADL不要返回DataTable、DataRow等ADO.NET類
public static Student GetById(long id)
{
DataTable table = SqlHelper.ExecuteDataTable("select * from T_Student where Id=@id", new SqlParameter("@id", id));
if (table.Rows.Count<= 0)
{
return null;//沒有找到
}
else if (table.Rows.Count > 1)
{
throw new Exception("ID重復");
}
else
{
DataRow row = table.Rows[0];
Student student = new Student();
student.Id = (long)row["Id"];
student.Name = (string)row["Name"];
student.Age = (int)row["Age"];
student.AiHao = (string)row["AiHao"];
//if (row["BirthDay"] == DBNull.Value)
//{ //因為BirthDay可能為空,則無法將DBNull轉換為DateTime類型,所以需要判斷。
// student.BirthDay = null;//若數據庫中有N多個這樣可以為空的字符串則需要寫很多比較麻煩,
//} //所以可以創建一個方法,方法名為From DBValue(object value)
//else
//{
// student.BirthDay = (DateTime)row["BirthDay"];
//}
student.BirthDay = (DateTime?)FromDBValue(row["BirthDay"]);
student.InDate = (DateTime?)FromDBValue(row["InDate"]);
student.Height = (Decimal?)FromDBValue(row["Height"]);
return student;
}
總結
以上是生活随笔為你收集整理的三层架构(DAL层Data Access Layer数据库访问层)(16)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css3选择器详解
- 下一篇: TFS(Team Foundation