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

Posted tea_year

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#三十六 三层架构的实现相关的知识,希望对你有一定的参考价值。

C#程序设计及宿舍管理系统实战 

https://edu.csdn.net/course/detail/27107

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进行数据传递;

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

以上是关于C#三十六 三层架构的实现的主要内容,如果未能解决你的问题,请参考以下文章

C#之三十七 实体类

C#—三层架构

C# 分层 三层架构 Very Very Good!

C#三层架构

C# Winform 三层架构

C# asp.net WebForm 的三层架构配合ListView实现增删改查源码