zoukankan      html  css  js  c++  java
  • 三层架构(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;
                }
    
    
    


    
    
    


  • 相关阅读:
    [转]ThinkPHP中如何使用原生SQL
    php定时回调接口
    [转]mysql dual虚拟表
    [转]mysql变量使用总结
    [转]使用mysql profiles 来查看sql 语句执行计划
    [转]Mysql中的SQL优化与执行计划
    [转]MySQL单列索引和组合索引的区别介绍
    前端开发框架
    sugar crm
    [转]MCC(移动国家码)和 MNC(移动网络码)
  • 原文地址:https://www.cnblogs.com/qiushuixizhao/p/3114424.html
Copyright © 2011-2022 走看看