C#三十六 三层架构的实现

2.1 使用DataSet构建三层结构

开发三层结构应用系统时,在表示层、业务逻辑层、数据访问层各层中如何使用DataSet呢?DataSet在三层结构中的层次如下图所示:

从图中可以看出,在三层结构中,DataSet的构建和解析工作主要在表示层、数据访问层完成,业务逻辑层主要对DataSet中的数据进行加工、处理和传递。简单地说,DataSet是整个三层结构中数据传递的介质。

2.2 三层结构中DataSet的使用

2.2.1 在表示层中使用DataSet

在表示层中使用DataSet需要做两件事。

(1)将DataSet中的数据展示给用户。

在Winform窗体控件中,DataGridView(数据表格)控件、ComboBox(下拉列表)控件等,他们都有一个数据源属性(DataSource),一般我们可以将Dataset或DataTable绑定到DataSource属性上即可实现数据展示。

(2)将用户的请求数据填充到DataSet中。

要将用户的请求数据填充到DataSet中,我们首先需要构建一个结构与用户请求数据结构相同的DataTable,然后将用户的请求数据填充到构建好的DataTable中,最后将DataTable添加到DataSet中。

表示层的DataSet如图2.3所示。

完成将DataSet中的数据展示给用户和将用户的请求数据填充到DataSet中的具体实现过程将在下面的综合示例中具体演示。

2.2.2 在业务逻辑中使用DataSet

在业务逻辑层使用DataSet需要做下面几件事:

(1)将接收的DataSet传递到下一层。

当业务逻辑层收到数据访问层返回的DataSet后接着将DataSet传递给表示层,或者是将表示层请求的DataSet传递给数据访问层。

(2)根据用户请求对DataSet中的数据进行处理。

当业务逻辑层收到请求或响应的DataSet后,根据用户的请求(例如:条件筛选数据)或业务规则会对DataSet中的数据进行处理。

业务逻辑层的DataSet如下图所示:

2.2.3 在数据访问层中使用DataSet

在数据访问层中使用DataSet

在数据访问层中使用DataSet需要做如下事情:

(1)将数据库中的数据填充到DataSet中。

当用户的请求时查询请求时,数据访问层需要实现对数据库的查询访问,并将响应结果填充到DataSet中。

(2)将DataSet中的数据保存到数据库中。

当用户的请求时数据保存请求时,数据访问层首先对收到的DataSet进行解析,然后将解析出的数据保存到数据库中。

数据访问层的DataSet如下图所示:

从上面的讨论中,我们发现DataSet在三层结构的每一层中都扮演着重要的数据载体角色,而每一层中基本上都包含了创建DataSet、填充数据、传递DataSet,从DataSet中提取数据等几个步骤。

2.3    如何创建DataSet

DataSet的构建有两种方法。

(1)通过DataAdapter(数据适配器)的Fill方法将数据直接填充到DataSet中。

(2)通过手动编码自定义DataTable(数据表)、DataColumn(数据列)、DataRow(数据行),然后将数据表添加到DataSet中。

首先,我们对DataSet做一个回顾,一个DataSet是由多个DataTable组成,而一个DataTable又是由多个DataColumn和多个DataRow组成。

接下来,我们来分别对DataTable、DataColumn、DataRow进行深入讨论。

1.   DataTable

DataTable是内存中的一个关系数据表,可以独立创建使用,也可以作为DataSet的一个成员使用。如何将DataTable作为DataSet的一个成员使用呢?首先,我们需要创建一个DataTable对象,其次通过使用Add方法将其添加到DataSet对象的Tables集合中,如下所示:

DataSet dsClass=newDataSet();

DataTable dtClass=newDataTable("Class");

dsClass.Tables.Add(dtClass);

如果我们没有指定DataTable名称时把DataTable添加到DataSet中,该表会得到一个从“0”开始递增的默认表名(例:Table0、Table1、Table2).

2.   DataColumn

DataColumn是创建DataTable的基础,我们通过向DataTable中添加一个或多个DataColumn对象来定义DataTable的结构。DataColumn有一些常用属性用于对输入数据的限制,例如:数据类型、数据长度、默认值等,见下表:


属  性


说   明


AllowDBNull


是否允许空值


ColumnName


DataColumn的名称


DataType


存储的数据类型


MaxLength


获取或设置文本列的最大长度


DefaultValue


默认值


Table


所属的DataTable的名称


Unique


DataColumn的值是否唯一

定义DataColumn有两种方法,分别为示例一、示例二:

示例一:

DataColumnclassName=new DataColumn();

className.ColumnName= "ClassName";

className.DataType=System.Type.GetType("System.String");

className.MaxLength=50;

示例二:

DataColumn className=newDataColumn("ClassName",typeof(string));

className.MaxLength=50;

3.   DataRow

DataRow表示DataTable中包含的实际数据,我们可以通过DataRow将数据添加到用DataColumn定义好的DataTable中,如示例三所示:

DataColumn className=newDataColumn("ClassName",typeof(string));

className.MaxLength=50;

//创建一个新的数据行

DataRowdrClass=dtClass.NewRow();

drClass["className"]=this.txtClassName.Text.Trim();

2.4    如何自定义DataSet

自定义DataSet主要步骤如下:

①、         创建DataSet对象。

②、         创建DataTable对象。

③、         创建DataColumn对象构建表结构。

④、         将创建好的表结构添加到表中。

⑤、         创建DataRow对象新增数据。

⑥、         将数据插入到表中。

⑦、         将表添加到DataSet中。

示例如下:

DataSet dsClass=newDataSet();

//创建班级表

DataTable dtClass=newDataTable("Class");

//创建年级ID列

DataColumndcClassName=new DataColumn("ClassName",typeof(string));

className.MaxLength=50;

//创建年级ID列

DataColumndcGradeId=new DataColumn("GradeId",typeof(int));

//将定义好列添加到班级表中

dtClass.Columns.Add(dcClassName);

dtClass.Columns.Add(dcGradeID);

//创建一个新的数据行

DataRowdrClass=dtClass.NewRow();

drClass["className"]=this.txtClassName.Text.Trim();

drClass["gradeID"]=objGrade.GetGradeIDByGradeName(this.cboGrade.Text.Trim());

//将新的数据行插入到班级表中

dtClass.Rows.Add(drClass);

//将班级表添加到DataSet中

dsClass.Tables.Add(dtClass);

如上所述,我们学习了如何构建DataSet以及如何将数据填充到DataSet中。

2.5    如何获取DataSet中的数据

从DataSet中获取数据有两种方式:

(1)通过指定DataSet中的具体DataTable的某行某列来获取数据。

步骤如下:

①、         通过表名,从DataSet中获取指定的DataTable。

②、         通过索引,从DataTable中获取指定的DataRow。

③、         通过列名,从DataRow中获取指定列的数据。

以获取班级信息为例:

示例如下:

//得到班级名称

dsClass.Tables["Class"].Rows[0][ "ClassName"];

//得到年级ID

dsClass.Tables["Class"].Rows[0][ "GradeID"];

(2)将DataSet的数据直接绑定到数据控件上。

2.6          实现数据访问层

 

在第一章的项目基础上,实现对业务逻辑层的完善与修改。

#region Public Methods

///<summary>

///获取所有学员信息

///</summary>

///<returns>所有学员信息数据集</returns>

public DataSet GetAllStudents()

{

DataSet ds=new DataSet();

SqlConnection conn=new SqlConnection(connstring);

SqlDataAdapter objAdapter=new SqlDataAdapter("usp_SelStudentInfo",conn);

//usp_SelStudentInfo 为查找学生存储过程信息

objAdapter.SelectCommand.CommandType=CommandType.StoredProcedure;

objAdapter.Fill(ds,"stuTable");

conn.Close();

conn.Dispose();

return ds;

}

#endregion

//根据年级编号获得班级信息,参考代码如下:

public DataSetGetClassByGradeID(int gradeID)

{

DataSet ds = new DataSet();

SqlConnection conn = new SqlConnection(connString);

SqlDataAdapter objAdapter = newSqlDataAdapter(   "usp_SelectClassesByGradeID",conn);

objAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;

objAdapter.SelectCommand.Parameters.Add("@GradeID",   SqlDbType.Int).Value = gradeID;

objAdapter.Fill(ds, "classTable");

conn.Close();

conn.Dispose();

return ds;

}

/// 根据性别筛选学员信息,并按姓名排序

public DataViewGetStudentBySex(string sex)

{     //实例化DataView对象

DataView dvStudent = new DataView();

//获取从数据层返回的学生信息表

dvStudent.Table =   studentController.SelectAllStudent().Tables["studentTable"];

//根据条件过滤信息

if (sex.Trim() == "男")

dvStudent.RowFilter ="Sex=‘男‘";

if (sex.Trim() == "女")

dvStudent.RowFilter ="Sex=‘女‘";

//按学生姓名降序排序

dvStudent.Sort = “StudentName DESC”;

//返回过滤后的数据视图

return dvStudent;

}

//其他代码见上课案例.

在用三层架构开发应用程序时,首先根据需求编辑界面数据展示方式,然后按底层到顶层的顺序实现数据访问层、业务逻辑层、表示层。

在实现数据访问层时,为了使我们开发的应用程序易于维护,我们常把不同表的数据访问代码封装在不同的类里,一般情况下一个类对应一张表。

 

小结

 

n       用Ado.Net实现三层结构应用程序时,DataSet的主要作用是三层之间数据传递的载体。

n       用Ado.Net实现三层结构应用系统时,数据访问层主要使用的类有:

ü       SqlConnection类,实现数据库连接。

ü       SqlCommand类,执行Sql命令。

ü       SqlDataReader类,读取数据。

ü       SqlDataAdapter类,执行Sql命令,返回DataSet。

ü       DataSet类,封装用户请求数据。

n           用Ado.Net执行带参数的Sql命令时,需要使用参数化类Parameters的Add方法为Sql命令添加参数,包括参数名称、参数类型。结合Ado.Net章节来重新使用参数化对象对数据访问层、业务逻辑层进行重新代码架构。

n           业务逻辑层实现数据传递、处理时,首先引用数据访问层,其次实例化数据访问对象,最后调用数据访问层功能,并实现数据处理。

作业:

完善第一章自己已经架构好的MIS系统,丰富完善数据访问层、业务逻辑层和表示层,要求:

1.   利用本章讲解的DataSet进行数据传递;

使用存储过程来操作数据。

时间: 2024-08-05 17:25:33

C#三十六 三层架构的实现的相关文章

C#三十五 三层架构企业应用

1.1          三层架构简介 假如你在经营一个大饭店,大体上你会请三方面的人,一方面是负责饭店服务的服务员,一方面是负责烹饪.做饭的厨师,一方面是负责饭店蔬菜.肉类.调料等的采购员. 如果你这样做了,那么饭店管理起来,就好比较好管理(简单来说).比如任何一方面的员工出现请假或离职的情况,可以找其他的服务员.厨师或采购员代替. 在企业中这种职责分离.业务独立的部门划分方法对于管理企业有很大的好处,同样在程序中也需采用"职责分离.业务独立的"的原则划分模块,更好的实现"

CCNA实验三十六 GRE(通用路由封装) &nbsp;

CCNA实验三十六 GRE(通用路由封装) 环境:Windows XP .Packet Tracert5.3 目的:了解GRE的使用,掌握如何配置GRE. 说明: GRE(Generic Routing Encapsulation,通用路由封装)协议是对某些网络层协议(如IP 和IPX)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输.GRE采用了Tunnel(隧道)技术,是VPN(Virtual Private Network)的第三层隧道协议. Tunnel

QT开发(三十六)——Model/View框架

QT开发(三十六)--Model/View框架 一.Model/View框架简介 1.Model/View框架核心思想 Model/View框架的核心思想是模型(数据)与视图(显示)相分离,模型对外提供标准接口存取数据,不关心数据如何显示,视图自定义数据的显示方式,不关心数据如何组织存储. Model/View框架中数据与显示的分离,可以允许使用不同界面显示同一数据,也能够在不改变数据的情况下添加新的显示界面.为了处理用户输入,引入了委托(delegate).引入委托的好处是可以自定义数据项的渲

2018-08-24 第三十六课

第三十六课 非关系统型数据库-mangodb 目录 二十四 mongodb介绍 二十五 mongodb安装 二十六 连接mongodb 二十七 mongodb用户管理 二十八 mongodb创建集合.数据管理 二十九 php的mongodb扩展 三十 php的mongo扩展 三十一 mongodb副本集介绍 三十二 mongodb副本集搭建 三十三 mongodb副本集测试 三十四 mongodb分片介绍 三十五 mongodb分片搭建 三十六 mongodb分片测试 三十七 mongodb备份

微信小程序把玩(三十六)Storage API

原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStorage(object) 相同key会覆盖,可写回调方法 获取方法: wx.getStorage(object) 清除方法: wx.clearStorage()里面可以写回调函数 成功,失败,完成 同步存储方法: 存数据 相同key会覆盖 wx.setStorageSync(key,data) 读数据

NeHe OpenGL教程 第三十六课:从渲染到纹理

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十六课:从渲染到纹理 放射模糊和渲染到纹理: 如何实现放射状的滤镜效果呢,看上去很难,其实很简单.把渲染得图像作为纹理提取出来,在利用OpenGL本身自带的纹理过滤,就能实现这种效果,不信,你试试. 嗨,我是Dario Corn

三十六、git clone简介

翻译整理自: http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-clone.html 在使用git来进行版本控制时,为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://, git://,或是只是以一个用户名(git 会认为这是一个ssh 地址)为前辍. 有些仓库可以通过不只

Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个

Python进阶(三十六)-Web框架Django项目搭建全过程

Python进阶(三十六)-Web框架Django项目搭建全过程 ??IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 ??Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后台功能 几行简单的代码就让你的网