首页 > 代码库 > 模拟在内存中的数据库DataSet相关的类

模拟在内存中的数据库DataSet相关的类

这篇连着上一篇DataReader相关类。

下面两段话是在msdn官网摘下来:

      .NET Framework 数据提供程序是专门为数据操作以及快速、只进、只读访问数据而设计的组件。Connection象提供到数据源的连接。 使用 Command 对象可以访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。 DataReader 可从数据源提供高性能的数据流。 最后,DataAdapterDataSet 对象和数据源之间起到桥梁作用。 DataAdapter 使用 Command 对象在数据源中执行 SQL 命令以向 DataSet 中加载数据,并将对 DataSet 中数据的更改写回数据源中。

      ADO.NET DataSet 是专门为独立于任何数据源的数据访问而设计的。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。 DataSet 包含一个或多个DataTable 对象的集合,这些对象由数据行和数据列以及有关 DataTable 对象中数据的主键、外键、约束和关系信息组成。

技术分享

最近在学习ADO.NET Framwork类库:涉及到了DataSet相关的类,就想好好整理下一系列类的关系,其中涉及到的类从小到大有:

  1. DateColumn
  2. DataRow
  3. Constraint
  4. DataTable
  5. DataRelation
  6. DataSet
  7. SqlCommandBuilder
  8. DataAdapter

这些类都是用于在内存中模拟一个数据库,方便程序的直接操作,免去了多次连接数据库的时间耗费。

看到他们的名称就大概知道是做什么的,下面列一个表说明下他们的功能:

类名

功能

备注
DateColumn 创建列,并设置相关属性(数据类型,列名,约束等) 这里的列是一个虚拟在内存中的列,并不是真正的列
DataRow 根据列名创建行数据(和数据库中的insert类似,但不一样) 这里的行是一个虚拟在内存中的行,并不是真正的行
Constraint 设置或获取约束  
DataTable 创建一个数据表,可以将DateColumnDataRow的实例添加到数据表中 虚拟在内存中的数据表,
并不是真正的数据表
DataRelation 将两个表建立父子关系  
DataSet 创建一个数据库,可以添加DataTable的实例 虚拟在内存中的数据库,
并不是真正的数据库
SqlCommandBuilder 用于存储对数据表的insertdeleteupdate,select操作语句 还没想到备注
DataAdapter 用于将数据源中的数据填充到DataSet实例中,
并将操作最后的DataSet实例update到数据库中
还没想到备注

下面我就来讲一下后面三个:DataSet,SqlCommandBuilder,DataAdapter。

1、DataSet

DataSet的继承层次结构是:

技术分享

 

 

 

 

2、SqlCommandBuilder

下面是DbCommandBuilder的继承层次图,不是SqlCommandBuilder的,

技术分享

上图中的Odbc,OleDb,Oracle请看第三点DataAdapter介绍【连接数据库的发展历史】。

这个SqlCommandBuilder见名知意,他是一个Sql命令的建造者,用于生成Sql命令,它是根据DataTable中每行的RowState和数据表的主键来生成sql语句的,然后绑定SqlDataAdapter对象,当SqlDataAdapter对象调用Update()方法更新数据库时,他就会自动生成sql语句。

SqlCommandBuilder scb = new SqlCommandBuilder(adapter);
//或者向下面这样
SqlCommandBuilder scb2 = new SqlCommandBuilder();
scb2.DataAdapter = adapter;

数据表的主键大家都知道,那这个每行的RowState是什么东西?

其实我们在对DataTable中的行进行增删改操作时,这些行都没有并没有被改动,而是其RowState这个属性被修改了,这属性是一个只读的枚举类型。

【详细的RowState请看本人博客中另一篇DataTable中的RowState属性】

3、DataAdapter

继承层次图:

技术分享

图里面写到了ODBC,Ole,那我就理一下关于连接数据库的发展历史:

  1. odbc之前:使用的不同的数据库都有各自对应数据库访问API,领导说换数据库,那就需要修改源码,这会整死程序猿的;
  2. odbc时:定义了一个公共数据访问层,可以用来访问几乎所有的关系型数据库,各个数据库厂商提供相应的驱动即可;
  3. ole db时:基于odbc,不仅可以访问关系型数据库,还可以访问非关系型数据
  4. 那什么是ADO呢?ADO是面向对象的结果,能够做到和ole db一样,但比ole db更简单,也就是说,ADO将ole db中的方法封装成多个类,只要主要是九个类的使用;
  5. ADO.NET呢?这个主要是增加了一个SqlClient,专门用于访问SQL Server,也是它访问SQL Server最快。

我也是主要使用SqlDataAdapter这个类,如果论通用性,当然是使用OleDbAdapter会好一点。

下面就讲一下SqlDataAdapter这个类:

它有四个构造函数:

技术分享

在这里也可以讲一下SqlDataAdapter和SqlDataReader的区别:

      SqlDataAdapter的实例是一次将需要的结果集拿到内存中,并自动关闭数据库连接(以后数据库连接都称为conn);而SqlDataReader的实例是调用Reader()方法,它维持了一个指针的作用,一次读取一个元组并自动向下挪动一位,并且只能从结果集中的第一行开始,不能回头(上一篇博客有讲过SqlDataReader对象),而且在这个挪动指针读取元组的过程中,conn一直保持连接,需要手动去关闭,或者使用using代码块。如果只是要查询数据,使用SqlDataReader会更好一点,因为他速度比SqlDataAdapter要快。

模拟在内存中的数据库DataSet相关的类