C# ADO.NET 三层架构

 

 三层架构(3-tier architecture)          

     界面层(User Interface layer) 主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问。

     业务逻辑层(Business Logic Layer)主要是针对具体的问题的操作,也可以理解成对数据层的操作

     数据访问层(Data access layer)主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层

       数据访问层包括   实体类 ,数据访问类

 优点

  1、开发人员可以只关注整个结构中的其中某一层;

  2、可以很容易的用新的实现来替换原有层次的实现;

  3、可以降低层与层之间的依赖;

  4、有利于标准化;

  5、利于各层逻辑的复用。

  6、结构更加的明确

  7、在后期维护的时候,极大地降低了维护成本和维护时间

缺点

  1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

  2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

  3、增加了开发成本。 

*** 约定  在项目下建文件夹 App_Code  要创建的实体类文件,操作类文件都放在改文件夹下。

                  实体类文件名=表明,操作类文件名=表名+Data

 

1、实体类

   -- 数据库映射出来的结构对象,最简单的封装。

  把数据库的表名变成类的类名,把数据库的每一个列,变为实体类中的成员变量和属性,列名与属性名一致
 
 对表 users 实体类封装
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2.App_Code
{
    public class Users
    {
        private int _Ids;

        public int Ids
        {
            get { return _Ids; }
            set { _Ids = value; }
        }
        private string _UserName;

        public string UserName
        {
            get { return _UserName; }
            set { _UserName = value; }
        }
        private string _PassWord;

        public string PassWord
        {
            get { return _PassWord; }
            set { _PassWord = value; }
        }
        private string _NickName;

        public string NickName
        {
            get { return _NickName; }
            set { _NickName = value; }
        }
        private bool _Sex;

        public bool Sex
        {
            get { return _Sex; }
            set { _Sex = value; }
        }
        private DateTime _Birthday;

        public DateTime Birthday
        {
            get { return _Birthday; }
            set { _Birthday = value; }
        }
        private string _Nation;

        public string Nation
        {
            get { return _Nation; }
            set { _Nation = value; }
        }

    }
}
View Code

 

2、数据访问类(操作类)
       -- 将某个表的数据库操作写成一个一个方法,放入到此类中供外部调用
 
 对表 users 建立查询,添加操作类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace ConsoleApplication2.App_Code
{
    public class UsersData
    {
        SqlConnection conn = null; //“公海” 提升 conn cmd 的作用域
        SqlCommand cmd = null;

        public UsersData()    //构造函数,放置每个方法都要使用,每次实例化都要运行
        {
            string sql = "server=.;database=Data0216;user=sa;pwd=123";

            conn = new SqlConnection(sql);
            cmd = conn.CreateCommand();
        }
        
        //查询所有方法

        public List<Users> SelectAll()    //有返回值 List<Users> 返回一个集合,
        {
            List<Users> list = new List<Users>();  //实例化一个 集合

            cmd.CommandText = "select *from Users";  //查询语句

            conn.Open();

            SqlDataReader dr = cmd.ExecuteReader();

            while (dr.Read())  //在这里没有进行有无 行 的判断,直接读取记录  
            {                                         
                                                   
                Users u = new Users();  //实例化一个 users 对象,前提是已经建立 users 实体类

                u.Ids = Convert.ToInt32(dr["ids"]);
                u.UserName = dr["UserName"].ToString();
                u.PassWord = dr["PassWord"].ToString();
                u.NickName = dr["NickName"].ToString();
                u.Sex = Convert.ToBoolean(dr["Sex"]);
                u.Birthday = Convert.ToDateTime(dr["Birthday"]);
                u.Nation = dr["Nation"].ToString();

                list.Add(u);        
            }
            conn.Close();

            return list;   //返回 list 
        }


        //添加记录方法
        public void Insert(Users u)  //需要输入,输入一个 users 类型的变量
        {
            cmd.CommandText = "insert into Users values(@username,@password,@nickname,@sex,@birthday,@nation)";
            
            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("@username", u.UserName);
            cmd.Parameters.AddWithValue("@password", u.PassWord);
            cmd.Parameters.AddWithValue("@nickname", u.NickName);
            cmd.Parameters.AddWithValue("@sex", u.Sex);
            cmd.Parameters.AddWithValue("@birthday", u.Birthday);
            cmd.Parameters.AddWithValue("@nation", u.Nation);

            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        }

    }
}
View Code

 

练习

对 Student表,重新排序 。如当 S002 删除后剩下的重新排序
S001     S001
S003     S002
S004     S003

 

 方法1、不使用实体类与操作类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int max = 0;

            string sql = "server=.;database=Data0216;user=sa;pwd=123";
            SqlConnection conn = new SqlConnection(sql);
            SqlCommand cmd = conn.CreateCommand();

            //查询总数
            cmd.CommandText = "select COUNT(*) from Students";

            conn.Open();

            SqlDataReader dr = cmd.ExecuteReader();

            dr.Read();
            // max 共有多少条记录
            max = Convert.ToInt32(dr[0]);

            conn.Close();

            conn.Open();

            //将编号从1到 max 变为s001~s00max
            for (int i = 0; i < max; i++)
            {
                string newcode = "S" + (i + 1).ToString("000");

                
                cmd.CommandText = "update Students set Scode='" + newcode + "' where ids = (select top 1 ids from Students where Ids not in(select top " + i + " ids from Students)) ";
                


                cmd.ExecuteNonQuery();
            }
            conn.Close();

            Console.WriteLine("成功了!");

            Console.ReadLine();
        }
    }
}
View Code

select  top 1  *  from  student ; 

                                      —— 查询全部取第一行

select  top  2  *  from  student ; 

                                     —— 查询全部取前两行

select  top 1 * from student  where  ids  not  in (  select  top 1  ids  from  student   )

                                      —— 查询第二行  括号内1变为 2 取第三行

 

方法2、使用实体类、操作类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2.App_Code
{
    public class Students
    {
        private int _Ids;

        public int Ids
        {
            get { return _Ids; }
            set { _Ids = value; }
        }
        private string _Scode;

        public string Scode
        {
            get { return _Scode; }
            set { _Scode = value; }
        }
        private string _Sname;

        public string Sname
        {
            get { return _Sname; }
            set { _Sname = value; }
        }


    }
}
student 实体类

 

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace ConsoleApplication2.App_Code
{
    public class StudentsData
    {
        SqlConnection conn = null;
        SqlCommand cmd = null;

        public StudentsData()
        {
            conn = new SqlConnection("server=.;database=Data0216;user=sa;pwd=123");
            cmd = conn.CreateCommand();
        }

        public void ResetNumber()//没有返回值的操作类
        {
            List<Students> slist = new List<Students>();//返回一个泛型集合
            
            cmd.CommandText = "select *from Students";
            
            conn.Open();
            
            SqlDataReader dr = cmd.ExecuteReader();
          
            while (dr.Read())
            {
                Students s = new Students();//实例化一个 Student 对象

                s.Ids = Convert.ToInt32(dr["Ids"]);
                s.Scode = dr["Scode"].ToString();
                s.Sname = dr["Sname"].ToString();

                slist.Add(s);//接受
            }
            conn.Close();

            int count = 1;
            
            //遍历,更改所有的编号
            foreach (Students sss in slist)
            {
                sss.Scode = "S" + count.ToString("000");
                count++;
            }

            conn.Open();

            //将改好的编号添加进去
            foreach (Students ss in slist)
            {
                cmd.CommandText = "Update Students set Scode=@a where Ids = @b";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@a", ss.Scode);
                cmd.Parameters.AddWithValue("@b", ss.Ids);
                cmd.ExecuteNonQuery();
            }
            conn.Close();

        }

    }
}
student 操作类

 

using System.Text;
using ConsoleApplication2.App_Code;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            StudentsData st = new StudentsData();
            st.ResetNumber();

           // 可简化写为  new StudentsData().ResetNumber();

            Console.ReadKey();
        }
    }
}
min 接口操作

 

 

 

posted @ 2017-04-21 19:42  唐宏昌  阅读(753)  评论(0编辑  收藏  举报