• 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 接口操作
  • 相关阅读:
    学校重理论,公司重操作,计算机专业毕业生该何去何从?
    最简单的ajax示例
    几个简单的例子让你读懂什么是JAVA的堆栈跟踪
    避免在JSP中写java代码
    ==和equals()的区别
    测试,我误解了你
    项目管理十大TION法
    Web测试与APP测试有哪些异同?
    spring cglib 与 jdk 动态代理
    java.util.concurrent.Semaphore 使用
  • 原文地址:https://www.cnblogs.com/Tanghongchang/p/6745195.html
Copyright © 2020-2023  润新知