三层架构(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; }
} }
}
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();
} }
}

练习

对 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 = ; 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[]); conn.Close(); conn.Open(); //将编号从1到 max 变为s001~s00max
for (int i = ; i < max; i++)
{
string newcode = "S" + (i + ).ToString(""); 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; }
} }
}

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 = ; //遍历,更改所有的编号
foreach (Students sss in slist)
{
sss.Scode = "S" + count.ToString("");
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 接口操作

ADO.NET 【实体类】【数据访问类】的更多相关文章

  1. ado.net 实体类_数据访问类

    实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  2. ADO.net 实体类 、数据访问类

    程序分三层:界面层.业务逻辑层.数据访问层 比较规范的写程序方法,要把业务逻辑层和数据访问层分开,此时需要创建实体类和数据访问类 实体类: 例 using System; using System.C ...

  3. ADO,NET 实体类 和 数据访问类

    啥也不说,看代码. --SQl中 --建立ren的数据库,插入一条信息 create database ren go use ren go create table xinxi ( code ) pr ...

  4. ADO.NET(完整修改和查询、实体类,数据访问类)

    一.完整修改和查询 在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到. 中间变量运用. 1.先查 2.执行操作 完整修改语句: bool has = ...

  5. 【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

    开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类, ...

  6. 9_13学习完整修改和查询&&实体类,数据访问类

    完整修改和查询:中间变量运用. 1.先查 2.执行操作 ---------------------------------------------------- namespace ADO.NET_小 ...

  7. ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄) System.Data—— 所有的一般数据访问类 S(转载)

    ADO.NET(一) 空间   ADO.NET结构 命名空间(车延禄)System.Data—— 所有的一般数据访问类System.Data.Common—— 各个数据提供程序共享(或重写)的类Sys ...

  8. ADO.NET 数据访问类查询、属性扩展

    今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select( ...

  9. 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类

    字符串攻击 所谓sql字符串注入式攻击就是在用户输入界面输入通过精心编制的含有某种指令的字符串,来改变C#中连接数据库要执行的sql语句,从而对数据库进行攻击性操作 在用户输入界面输入  a');up ...

随机推荐

  1. Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作

    Decimal类型截取保留N位小数向上取Decimal类型截取保留N位小数并且不进行四舍五入操作 封装静态方法 public class DecimalHelper { /// <summary ...

  2. ASP.NET MVC 实现有论坛功能的网站(有iis发布网站)

    ASP.NET MVC. M 为Model模型层, V 为View视图层, C 为Controller控制层.要想使用MVC框架来写网站就需要了解M V C 的作用分别为哪些.给大家简单的介绍一下: ...

  3. 03_python_基本数据类型

    一.基本数据类型 整数 bool 字符串: 可以保存少量数据并进行相应的操作 列表 list: 存大量数据 [] 元组 tuple: 不可改变的() 字典 dict: 保存键值对,一样可以存储大量的数 ...

  4. JavaScript基础(1)-ECMAScript

    一.JavaScript简介 1.JavaScript历史背景 布兰登 • 艾奇(Brendan Eich,1961年-),1995年在网景公司,发明的JavaScript. 刚开始JavaScrip ...

  5. Iframe高度自适应(兼容IE/Firefox、同域/跨域)

    在实际的项目进行中,很多地方可能由于历史原因不得不去使用iframe,包括目前正火热的应用开发也是如此. 随之而来的就是在实际使用iframe中,会遇到iframe高度的问题,由于被嵌套的页面长度不固 ...

  6. 2. GitHub远程仓库

    1. GitHub ssh-keygen -t rsa -C "youremail@example.com"        之后再用户主目录里会有隐藏的.ssh目录,里面有id_r ...

  7. Python Web框架 bottle flask

    Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip instal ...

  8. centos6 Linux安装redis 2.6.14

    1.获取安装文件 wget http://download.redis.io/redis-stable.tar.gz 2.解压文件 tar xzvf redis-stable.tar.gz 3.进入目 ...

  9. 【nodejs】文件上传demo实现

    文件结构: index.js var server = require('./server.js'); var router = require('./router.js'); var request ...

  10. Java之装饰模式

    1.装饰模式的理解 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2.装饰模式由4种角色组成 (1)抽象构件(Componen ...