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、实体类
-- 数据库映射出来的结构对象,最简单的封装。
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; } } } }
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(); } } }
对 Student表,重新排序 。如当 S002 删除后剩下的重新排序
S001 S001
S003 S002
S004 S003
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(); } } }
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; } } } }
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(); } } }
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(); } } }