三层架构即是把数据库访问,业务逻辑,界面分离。
三层结构为:
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;
}