三层架构即是把数据库访问,业务逻辑,界面分离。

三层结构为:

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;
            }