《《《什么是CS模式下的数据库三层模式结构结构

3948人阅读
三层架构(1)
1、三层结构开发模式&&&
&&&&三层结构式基于模块化程序设计的思想,为实现分解应用程序的需求,而逐渐形成的一种标准模式的模块划分方法。
2、为什么要用三层结构
&&&&个人理解:采用分层增强了类和类之间的独立性,在团队合作开发的过程中能大大提高了开发的速率;在后期的维护工作中更容易;在程序员写代码的过程中,不会因为某个小小的需求的改变而大整整个系统模块,只需要改有问题的那一层就好了,比如说当数据库要改变的时候,只需要调整数据库就好了,不需 要重新开发,只做一些简单的调整即可。但是三层也有缺点就是执行速度不够快,所以说并不是所有的系统都要用三层架构去实现。
3、三层架构分类
&&&&&三层架构划分为表现层(UI,user interface)、业务逻辑层(BLL,Business Logic Layer)、数据访问层(DAL,Data Access Layer),这样有利于系统的开发、维护、部署,实现了“高内聚,低耦合”。采用分层方法,把问题划分开一个一个解决,易于控制,易于延展,易于分配资源。
4、三层结构的概念以及之间的关系
表示层位于最上层,用于显示和接收用户提交的数据,为用户提供交互式的界面。表示层一般为Windows窗体应用程序或Web应用程序。
业务逻辑层是表示层和数据访问层之间沟通的桥梁,主要负责数据的传递和处理。
数据访问层主要实现对数据的读取、保存和更新等操作。
下图是各层的工作流程
&&& 在三层结构中,各层之间相互依赖,表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。
5、如何搭建三层结构?
&&&& 打开VS2012,新建一个解决方案,新建一个类库LoginSolution,命名为LoginDAL,如下图
添加一个类库,业务逻辑层
&&& 创建一个WinForm窗体,UI表示层
namespace MyBookShop.Models
public class User
public User() { }
//编号属性
public int Id
//属性id的get和set方法
set { id = }
//登录名属性
private string loginId;
//属性loginId的get和set方法
public string LoginId
get { return loginId; }
set { loginId = }
//密码属性
private string loginP
//loginPwd属性的get和set方法
public string LoginPwd
get { return loginP }
set { loginPwd = }
//姓名属性
//属性name的get和set方法
public string Name
set { name = }
业务逻辑层BLL
using System.Collections.G
using System.L
using System.T
using System.Threading.T
using MyBookShop.DAL;
using MyBookShop.BLL;
using MyBookShop.M
namespace MyBookShop.BLL
public class UserManager
//登录验证
public static bool Login(string loginId, string loginPwd, out User validUser)
User user = UserService.GetUserByLoginId(loginId);
//没有该用户信息
if (user == null)
validUser =
//密码正确
if (user.LoginPwd == loginPwd)
validUser =
//密码错误
validUser =
数据访问层DAL
using System.Collections.G
using System.L
using System.T
using System.Threading.T
using System.D
using System.Data.SqlC
namespace MyBookShop.DAL
public class UserService
//根据登录名查询用户信息
public static User GetUserByLoginId(string LoginId)
string sql = &select * from Users where LoginId=@LoginId&;
using (SqlDataReader reader = DBHelper.GetReader(sql, new SqlParameter(&@LoginId&, LoginId)))
if (reader.Read())
//找到该用户信息后,将其保存到User对象中,并返回该对象
User user = new User();
user.id = (int)reader[&Id&];
user.LoginId = (string)reader[&LoginId&];
user.LoginPwd = (string)reader[&LoginPwd&];
reader.Close();
reader.Close();
//未找到该用户,返回null
namespace LoginUI
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void btnLogin_Click(object sender, EventArgs e)
string userName = txtUserName.Text.Trim();
string password=txtPassword .T
Login.BLL.UserManager mgr = new Login.BLL.UserManager();
Login.Model .User user=mgr.UserLogin(userName, password);
MessageBox.Show(&登录用户:& + user.UserName);
&把数据表或其它持久化数据的格式映射成的类,就是实体类。
&& 对实体类的理解:
1)与数据库里面表做对应,一个实体类对应一张表,这样与数据库交互时就可以一一对应,对数据库进行操作
2)把常用的字段封装到一起,为我们在关系数据库和对象之间架起一座桥梁
3)避免U层,B层,D层互相引用,交叉引用
4)实体类用来传输数据的业务数据模型
5)实体类不用知道其他三层的存在
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:600568次
积分:16033
积分:16033
排名:第510名
原创:208篇
评论:5242条
阅读:14884
阅读:14862
阅读:66973
阅读:11733
文章:10篇
阅读:36023
文章:12篇
阅读:19711
(1)(1)(1)(1)(13)(10)(4)(5)(4)(4)(4)(4)(4)(3)(3)(3)(1)(4)(4)(4)(4)(4)(4)(4)(4)(3)(3)(1)(5)(8)(4)(5)(4)(3)(7)(9)(17)(6)(4)(7)(12)(9)(2)(1)(6)【图文】三层架构课件_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
三层架构课件
上传于|0|0|暂无简介
大小:2.19MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢CS三层架构_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
CS三层架构
上传于|0|0|暂无简介
大小:389.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢这几天看了不少三层架构的资料,整理整理
&&故写篇博文谈谈自己的看法。
三层架构概念:
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了&高内聚,低耦合&的思想,复杂项目不能把SQL语句直接写到程序里,不模块话,难以维护。应该采取三层架构。
1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。
简单的说,UI层调用BLL,BLL调用DAL,数据用Model进行传递,Model为各层之间架起了数据传输的桥梁。
参考模型:UI&--&Model&--&BLL&--&Model&--&DAL
传统的两层结构和三层架构之间的区别:
下面我以一个简单的例子来细数三层架构:
代码剖析:
新建一个项目(Windows 窗体应用程序),再在根目录下新建3个文件夹,分别是Model,DAL,BLL。
在Model下添加一个Person类
在DAL下添加一个SQLHelper类和一个PersonDAL类。
在BLL下添加PersonBLL类
Person.cs代码如下:
using Susing System.Collections.Gusing System.Lusing System.Tnamespace 三层架构Demo.Model{
class Person
public int Id { get;set;}
public int Age { get; set; }
public string Name { get; set; }
SQLHelper类,封装了数据库操作的方法:
SQLHelper.cs代码入下:
using Susing System.Collections.Gusing System.Lusing System.Tusing System.Data.SqlCusing System.Cusing System.Dnamespace 三层架构Demo.DAL{
class SQLHelper
//public static readonly string connStr = System.Configuration.ConfigurationSettings.AppSettings["dbconnstr"];
//获得连接字符串
public static readonly string connStr =
ConfigurationManager.ConnectionStrings["dbconnstr"].ConnectionS
/// &summary&
/// 执行方法ExecuteNonQuery
/// &/summary&
/// &param name="cmdText"&要执行的sql语句&/param&
/// &param name="parameters"&参数数组&/param&
/// &returns&受影响的行数&/returns&
public static int ExecuteNonQuery(string cmdText,
params SqlParameter[] parameters)
using (SqlConnection conn=new SqlConnection (connStr))
conn.Open();
using (SqlCommand cmd= conn.CreateCommand())
mandText = cmdT
cmd.Parameters.AddRange(parameters);
int i=cmd.ExecuteNonQuery();
/// &summary&
/// 执行ExecuteScalar() 返回第一行第一列数据
/// &/summary&
/// &param name="cmdText"&要执行的sql语句&/param&
/// &param name="parameters"&参数数组&/param&
/// &returns&返回第一行第一列数据&/returns&
public static
object ExecuteScalar(string cmdText,
params SqlParameter[] parameters)
using (SqlConnection conn=new SqlConnection(connStr))
conn.Open();
using (SqlCommand cmd=conn.CreateCommand())
mandText = cmdT
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteScalar();
/// &summary&
/// 执行ExecuteDataTable()方法
/// &/summary&
/// &param name="cmdText"&要执行的Sql语句&/param&
/// &param name="parameters"&参数数组&/param&
/// &returns&返回一个DataTable&/returns&
public static
DataTable ExecuteDataTable(string cmdText,
params SqlParameter[] parameters)
using (SqlConnection conn=new SqlConnection (connStr))
conn.Open();
using (SqlCommand cmd=conn.CreateCommand())
mandText = cmdT
cmd.Parameters.AddRange(parameters);
using ( SqlDataAdapter adapter=new SqlDataAdapter (cmd))
DataTable dt = new DataTable();
adapter.Fill(dt);
/// &summary&
/// 执行ExecuteSqlDataReader()方法
/// &/summary&
/// &param name="cmdText"&要执行的Sql语句&/param&
/// &param name="parameters"&参数数组&/param&
/// &returns&返回一个SqlDataReader&/returns&
public static SqlDataReader ExecuteSqlDataReader(string cmdText,
params SqlParameter[] parameters)
using (SqlConnection conn=new SqlConnection (connStr))
conn.Open();
using (SqlCommand cmd=conn.CreateCommand())
mandText = cmdT
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteReader();
PersonDAL.cs代码如下:
using Susing System.Collections.Gusing System.Lusing System.Tusing 三层架构Demo.Musing System.Data.SqlCusing System.Dnamespace 三层架构Demo.DAL{
class PersonDAL
/// &summary&
/// 返回一个新增对象的主键,设为自动增长
/// &/summary&
/// &param name="model"&&/param&
/// &returns&&/returns&
public int Addnew(Person model)
string sql = "insert into T_person(Age,Name) output inserted.id values(@Age,@Name)";
object obj=
SQLHelper.ExecuteScalar(sql,new SqlParameter("Age",model.Age),new SqlParameter("Name",model.Name));
//Convert : 与 value 等效的 32 位有符号整数,如果 value 为 null,则为零。
return Convert.ToInt32(obj);
/// &summary&
/// 删除数据
/// &/summary&
/// &param name="id"&&/param&
/// &returns&&/returns&
public int Delete(int id)
string sql = "delete form T_Person where Id=@Id";
return SQLHelper.ExecuteNonQuery(sql,new SqlParameter("Id",id));
/// &summary&
/// 修改数据
/// &/summary&
/// &param name="model"&&/param&
/// &returns&&/returns&
public int Update(Person model)
string sql = "update T_Person set Age=@Age,Name=@Name where Id=@Id";
return SQLHelper.ExecuteNonQuery(sql,new SqlParameter("Age",model.Age),new SqlParameter("Name",model.Name),
new SqlParameter("Id",model.Id));
/// &summary&
/// 查询数据
/// &/summary&
/// &param name="id"&&/param&
/// &returns&&/returns&
public Person Get(int id)
string sql="select * from T_Person where Id=@Id";
DataTable dt=SQLHelper.ExecuteDataTable(sql,new SqlParameter("Id",id));
if (dt.Rows.Count&=0)
return null;
else if (dt.Rows.Count==1)
Person model1 = new Person();
model1.Id = Convert.ToInt32(dt.Rows[0]["Id"]);
model1.Name = Convert.ToString(dt.Rows[0]["Name"]);
model1.Age = Convert.ToInt32(dt.Rows[0]["Age"]);
return model1;
else//以防意外情况
throw new Exception("数据库中有两条及以上重复数据");
/// &summary&
/// 获取全部数据
/// &/summary&
/// &returns&&/returns&
public IEnumerable&Person& GetAll()
string sql = "select * from T_Person";
DataTable dt = SQLHelper.ExecuteDataTable(sql);
List&Person& list = new List&Person&();
foreach (DataRow row in dt.Rows)
Person model = new Person();
model.Id = Convert.ToInt32(row["Id"]);
model.Name =Convert.ToString(row["Name"]);
model.Age = Convert.ToInt32(row["Age"]);
list.Add(model);
进行逻辑判断的BLL层代码看似是这样的:
PersonBLL.cs代码如下:
using Susing System.Collections.Gusing System.Lusing System.Tusing 三层架构Demo.Musing 三层架构Demo.DAL;using System.Data.SqlCusing System.Dnamespace 三层架构Demo.BLL{
class PersonBLL
public int Addnew(Person model)
return new PersonDAL().Addnew(model);
public int Delete(int id)
return new PersonDAL().Delete(id);
public int Update(Person model)
return new PersonDAL().Update(model);
public Person Get(int id)
return new PersonDAL().Get(id);
public IEnumerable&Person& GetAll()
return new PersonDAL().GetAll();
UI层进行测试:
Form1.cs代码如下:
using Susing System.Collections.Gusing ponentMusing System.Dusing System.Dusing System.Lusing System.Tusing System.Windows.Fusing 三层架构Demo.Musing 三层架构Demo.DAL;using 三层架构Demo.BLL;namespace 三层架构Demo{
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void button1_Click(object sender, EventArgs e)
//Person p1 = new Person();
//p1.Age = 22;
//p1.Name = "Eyes";
//int id=new PersonDAL().Addnew(p1);
//MessageBox.Show(id.ToString());
//PersonDAL p = new PersonDAL();
//Person a = p.Get(1);
//a.Name = "jack";
//MessageBox.Show(a.Name + "," + a.Age);
//p.Update(a);
//PersonBLL bll = new PersonBLL();
//Person p = bll.Get(1);
//p.Name = "Admin";
//MessageBox.Show(p.Name + "," + p.Age);
//bll.Update(p);
PersonBLL b = new PersonBLL();
List&Person& list = (List&Person&)b.GetAll();
foreach (Person item in list)
MessageBox.Show(item.Id+","+item.Name+","+item.Age);
private void Form1_Load(object sender, EventArgs e)
dataGridView1.DataSource = new PersonBLL().GetAll();
  1、开发人员可以只关注整个结构中的其中某一层;
  2、可以很容易的用新的实现来替换原有层次的实现;
  3、可以降低层与层之间的依赖;
  4、有利于标准化;
  5、利于各层逻辑的复用。
  1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
  2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
  3、增加了开发成本。
阅读(...) 评论()

我要回帖

更多关于 cs三层架构图 的文章

 

随机推荐