`

在.NET框架下开发三层结构数据库应用系统

    博客分类:
  • .net
阅读更多
ch01
1,》三层是指表示层、业务逻辑层、数据访问层

>表示层:用于显示数据和接受用户输入的数据。(一般为window应用程序或web应用程序)

>业务逻辑层:时表示层和数据访问层之间的桥梁,主要负责数据的传递和处理。(类库)--xxBLL

>数据访问层:实现对数据的保存和读取操作。可以访问关系数据库、文本文件或XML文档等。(类库)--xxDAL

2,》依赖关系:1.表示层依赖于业务逻辑层,业务层依赖于数据访问层。
    2.表示层只允许以来业务逻辑层,不允许直接引用数据访问层。
    3.各层项目间不允许循环使用。


3,》业务逻辑层的主要职责:该层是表示层和数据访问层之间的一座桥梁,具体职责:
1.根据业务规则对数据进行处理或加工;
2.与相邻的表示层和数据访问曾经型数据交换

ch02 使用ADO.NET实现三层结构

4,》DataSetd的使用:DataSet支持在数据库断开状态下,实现对大批量数据的查询、修改,
在三层中,DateSet的构建与解析工作主要在表示层、数据访问层完成,
业务逻辑层主要对DataSet中的数据惊醒加工处、理和传递,DataSet是整个三层结构中数据传递的介质。

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

1.将数据展示给用户:

数据展示控件:DataGrideView(表格)、ComboBox(下拉列表)他们都有一个数据源属性(DateSource)。

一般可以直接将DataSet或DataTable绑定到DataSource属性上即可实现数据展示。

2.将用户的请求数据填充到DataSet中

首先构建一个结构与请求数据结构相同的DataTable,然后将用户请求的数据填充到DataTable中,最后将

DataTable添加到DataSet中

>在业务逻辑层使用DataSet:

1.将接收到的DataSet传到下一层

2.根据用户请却对DataSet中的数据进行处理

>在数据访问层中使用DataSet:

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

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

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

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

5,》创建DataSet:

>DataSet的构建有两种方法:
1.通过DataAdapter的Fill方法将数据直接填充到DataSet中。
2.通过手动编码自定义DataTable(数据表)、DataColumn(数据列)、DataRow(数据行),然后将数据表添加到

DataSet中。

>一个DataSet由多个DateTable组成,一个DataTable由多个DateColumn和多个DataRow组成。               

       

>DataTable是内存中的一个关系数据表,可独立创建使用,也可作为DataSet的一个成员。

在创建DataTable时,可以指定DataTable的名称,如果不指定,该表会得到一个从"0"开始递增的默认表名
>DataColumn是创建DataTable的基础,通过向DataTable中添加一个或多个DataColumn对象来定义DatatTable

6,》DataColumn常用属性: 属性 说明
AllowDBNull 是否允许空值
ColumnName      DataColumn的名称
DataType 存储的数据类型
MaxLength 获取或设置文本列的最大长度
DefaultValue 默认值
Table 所属的DataTable的名称
Unique DataColumn的值是否唯一

7,》定义DataColumn的两种方法:
1:DataColumn 列名=new DataColumn();
  列名.ColumnName="数据库中列名";
  列名.DataType=System.Type.GetType("System.数据类型");
  列名.MaxLength=50;
     例如:DataColumn className=new DataColumn();
   className.ColumnName="ClassName";
   className.DataType=System.Type.GetType("System.string");
   className.MaxLength=50;

2:DataColumn 列名=new DataColumn("数据库中列名",typeof(数据类型))
  列名.MaxLength=50;
     例如:DataColumn 列名=new DataColumn("ClassName",typeof(string))
   列名.MaxLength=50;
>DataRow表示DataTable中包含的实际数据,可以通过DataRow将数据添加用DataColumn定义好DataTable中

8,》自定义DataSet主要步骤:1.创建DataSet对象 2.创建DataT对象
3.创建DataColumn对象构建表结构 4.将创建好的表结构添加到表中
5.创建DataRow对象新增数据 6.将数据插入到表中
7.将表添加到DataSet中
例如:DataSet ds=new DataSet();//创建新的DataSet
    DataTable dt=new DataTable();//创建表
    DataColumn dc1=new DataColumn("数据库中列名",typeof(string));//创建列1
    dc1.MaxLength=50;
    DataColumn dc2=new DataColumn("数据库中列名",typeof(int));//创建列2
   //将定义好的列添加到表中
    dt.Columns.Add(dc1);
    dt.Columns.Add(dc2);
   //创建数据行
    DataRow dr=new DataRow();
    dr["列名"]=控件的Text属性,或定义的带参查询方法。--参数为控件的Text属性
    dt.Rows.Add(dr);  //将数据行插入表中
    ds.Tables.Add(dt);//将表添加到DataSet中

9,》获取DataSet中的数据:两种方法
>1.指定DataSet中的具体DataTable的某行某列来获取数据。
步骤:1通过表名,从DataSet中获取指定的DataTable。
      2.通过索引,从DataTable中获取指定的DataRow。
      3.通过列名,从DataRow中获取指定列的数据。
例如:ds.Tables["表名"].Rows[index]["列名"];
>2.将DataSet中的数据指接绑定到数据展示控件上。

10,》DataView提供DataTable的动态视图,并可以对动态生成的视图中的数据进行排序、筛选等操作。、

  >DataView属性:属性 说明
Table 用于获取或设置源DataTable
Sort 获取或设置DataView的一个或多个排序列以及排序顺序
RowFilter 获取或设置用于筛选在DataView中查看那些行的表达式
Count 在应用RowFilter后,获取DataView中的行数
  >示例:DataSet ds=new DataSet();
DataView dv=new DataView();
dv.Table=ds.Tables.["表名"];
dv.RowFilter="(where条件后的语句:sex='男')";
dv.Sort="列名 (desc或asc)";

11,》DataSet与DataTable、DataView之间的关系:DataSet包含DataTable,DataTable包含DataView
  一个DateSet中可以有多个DataTable,一个DataTable中可以动态生成

多个DataView。
12,》数据库配置文件的读取:使用ConfigurationManager类的ConnectionStrings属性读取配置文件中的连接数据库字

符串。
以酒店管理系统数据库HotelManager为例:
private readonly string constr =
ConfigurationManager.ConnectionStrings

["HotelManager.Properties.Settings.HotelManagerConnectionString"].ToString();

        当数据访问的SQL命令是带参数的存储过程时,需将SqlCommand的CommandType设置为StoredProcedure,
并用Parameters集合定义参数。(使用集合的Add方法为SQL命令添加参数)
        参数包括:参数名、参数类型(如果是字符型参数,还需指定长度,长度一般与数据表中对应字段长度相等)

ch03 用OOp实现三层结构
13,》使用DataSet开发三层结构的局限性:
1.DataSet不具备良好的面向对象(OO)特性,使用起来不够直观、方便。
2.对DataSet中的数据进行查找时容易出错。
3.DataSet的核心结构与数据库的核心结构完全相同,他把数据结构完全暴露在表示层和业务逻辑层

14,》使用实体类的优势:
1.实体类是完全受我们控制的对象,它具有棉线对象的基本特征。
2.实体类是业务对象的基础,他用面向对象的思想为我们消除了关系数据与对象之间的差异。

15,》实体类:从数据的存储来讲,业务实体就是存储应用系统信息的数据表,我们将每一个数据表中的字段定义成属性,
并将只写属性用一个类封装--这个类就成为"实体类"。

16,》实体类的使用:业务实体可以认为属于业务逻辑层。可以将业务实体单独作为一层成为业务实体层。

>在表示层使用实体类需要做两件事:
1.将解析实体对象中封装的数据展示给用户。
(1)表示层对实体层的解析分两种情况:
一种是对单个实体对象进行解析(每一个实体对象中封装的数据对应数据表一条记录),这种解析一般常用的控件为


TextBox(文本框),Label(标签)等,通常用Text属性展示数据。
另一种是对实体对象集合进行解析,将多个实体对象封装到List<T>中称为实体对象集合,
例如DataGrideView(表格)、ComboBox(下拉列表)独有一个数据源属性(DattaSource),可以将实体对象集合绑

定到数据源属性上

2.将用户请求的数据封装到实体对象中。
首先实例化实体对象。然后将用户的请求数据复制给实体对象中的对应属性。

>在业务逻辑层中使用实体类:主要负责传递实体对象,并对实体对象中封装的数据经行处理。
(1).将解收到的实体对象传到下一层
当业务逻辑层接收到装有信息的业务实体对象后,根据请求后相应经实体对象传到下一层。
(2).根据用户请求对实体对象中的数据进行处理。
使用业务实体类开发三层结构应用系统时,数据处理来自两个方面:
一方面来自业务实体类对数据的处理,实体类本身是有属性组成的,而达多读是可读写属性,
根据请求的不同可以给属性设置不同的值,例如:当用户请求为空时,给属性设置为默认值。
另一方面来自业务逻辑对数据的处理,例如:用户登录,用户的身份管理员和学员,此时业务逻辑根据用户身份进

行不同的处理。

>在数据访问层中使用实体类--需要做两件事:
(1).建数据库中的数据封装到实体对象中或将多个实体对象封装成集合。
当用户的请求时数据查询时,数据访问层需要实现对数据库的访问查询。
当请求为一条纪录时,将这条记录封装成一个实体对象。
当请求的结果为多条记录时,将每一条记录封装成一个实体对象,然后再将多个实体对象封装到List<T>中
(2).将实体对象中的数据保存到数据库中。
当用户的请求时数据保存时,数据访问层首先多实体对象中封装的数据进行解析,然后将解析的数据保存到数据

库中。

17,》using关键字的使用:1.作为指令--主要用于引入命名空间
     2.作为语句--允许用户定义一个范围,并在此范围末尾自动释放对象。
     例如:using(SqlConnection con=new Connection()){//...}

ch04 异常处理与单元测试
18,》什么是异常处理:
“异常”是程序在执行时发生的错误。导致这种错误的原因有三个:
1.代码错误,包括语法错误、逻辑错误,这是由开发人员造成的。
2.资源不可用,这是由于系统访问了未经授权的资源而引起的错误。
3.公共语言运行库,这是由CRL内部引起的错误。
异常处理就是,当应用程序在运行时发生错误后,不论这种错误是由哪种原因引起的,
通过开发人员对于之错误的处理或CRL内部的处理,是系统能够恢复运行的过程。

19,》Exception类:Exception类中封装的异常处理有两种:
1.一种是由用户程序执行时引发的异常,派生于ApplicationException类。
2.另一种是由公共语言运行库引发的异常,派生于SystemException类。
》Exception类是所有异常的基类。
20,》Exception类是所有异常类的基类。Exception类包的各种异常常见表:

Exception类 说明

SystemException 这个类提供系统异常和应用程序异常之间的区别

ArgumentException 当方法提供的任意一个参数无效时,引发此异常

ArithmeticException 此异常表示有算术运算导致的错误

DataExceptiono 如果在使用ADO.NET组件时生成错误,引发此异常

FormatException 但参数的格式不符合被调用方法的的参数规范时,引发此异常

IOException 当出现I/O错误时,引发此异常

IndexOutOfRangeException 当试图用数组边界外的索引来访问数组元素时,引发此异常

ArgumentNullException 再将空引用传递给无效参数时,引发此异常

DivideByZeroException 当试图用某个数除以零时,引发此异常

OverflowException 当算术运算的结果大于而无法有目标类型表示时,引发此异常

ApplicationException 在应用程序执行过程中检测到由应用程序定义的异常

TargetException 当试图调用无效目标时,引发此异常


21,》异常类常用属性:属性 说明

Message 提供引起异常的详细信息

Source 此属性表示导致异常发生的应用程序或对象的名称

StackTrace 此属性提供在堆栈上所调用方法的详细信息,并首先显示最近调用的方法

InnerException 对内部异常的引用,如果此异常基于前一个异常,则内部异常指最初发生

的异常

22,》单元测试:软件开发中的单元测试是对整个项目中的某一个模块以及模块中的某一个类、或某类中的某一个方法的测


   

23,》是么是VSTS单元测试:VSTS单元测试是VSTS平台中集成度单元测试框架(Team Test),它支持:
>生成测试代码框架。
>在IDE中运行测试。
>合并从数据库中加载数据的测试。
>测试运行完成后,进行代码分析覆盖。
Team Test包含了一套测试功能,可以同时支持开发人员和测试人员。

24,》如何使用VSTS些单元测试:1创建测试;2.编写测试;3.运行测试。

测试项目创建成功以后,同时生成4个与测试相关的文件:
属性   说明 
    
           AuthoringTest.txt 提供关于创建测试的说明,包括向项目增加其他测试的说明。

                xx.cs  包含方法的测试,以及测试初始化和测试清楚的方法。

               xx.vsmdi 测试管理文。

       localtestrun.testrunconfig 本的测试运行文件。

       在生成的文件xx.cs文件中Assert.Incnclusive表明这是一个未经验证的单元测试。
   target通常表示测试目标对象。
   expected表示期望得到的值。
   actrual表示实际得到的值。

》单元测试的好处:1.有助于发现软件在研发前期的缺点;2.确保如见质量的具体操作方法

25,》常用的断言方法: 方法 说明

Assert.AreEqual() 测试指定的值是否相等,如果相等,测试通过。

Assert.Inconclusive() 表示一个问验证的测试。

Assert.IsTrue() 测试指定的条件是否为true,如果为true,测试通过。

Assert.IsNull() 测试指定的对象是否为空引用,如果为空,测试通过。

Assert.IsNotNull() 测试指定的对象是否为空,如果不为空,测试通过。

Assert.IsFalse() 测试指定的条件是否为false,如果为false,测试通过。

>测试项目的运行方式有两种:1.运行并启动调试    2.运行但并不启动调试

26,》代码覆盖:单元测试的一个关键指标是在在测试运行时覆盖了多少代码,该指标称为代码覆盖

ch05 抽象工厂设计模式应用
27,》设计模式分三大类:创建型模式、结构型模式、行为模式,抽象工厂设计模式属于创建型模式。

28,》抽象工厂设计模式中参与的对象主要有以下几类:

>抽象工厂,它的主要功能、职责是  生产抽象产品。

>抽象产品,它的主要功能、职责是  提供实体产品访问接口。

>实体工厂,它的主要功能、职责是  生产实体产品。

>实体产品,它的主要功能、职责是  实现自己的功能。

29,》抽象工厂(Abstract Factory)设计模式的使用思路概括:

>提供一系列相互依赖对象的创建。
>封装对象的常规创建方法(new)
>提供统一调用数据访问方法的方式
>避免调用数据访问方法和具体对象创建工作的紧耦合

在可复用面对对象软件设计模式中,抽象工厂(Abstract Factory)设计模式的概念是:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类

一般在以下情况先可以使用抽象工厂(Abstract Factory)设计模式:
>一个系统要独立于它产品的创建、组合和表示
>一个系统有多个产品系列中的一个来配置时;
>>>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics