这篇连着上一篇DataReader相关类。
下面两段话是在msdn官网摘下来:
.NET Framework 数据提供程序是专门为数据操作以及快速、只进、只读访问数据而设计的组件。Connection 对象提供到数据源的连接。 使用 Command 对象可以访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。 DataReader 可从数据源提供高性能的数据流。 最后,DataAdapter 在 DataSet 对象和数据源之间起到桥梁作用。 DataAdapter 使用 Command 对象在数据源中执行 SQL 命令以向 DataSet 中加载数据,并将对 DataSet 中数据的更改写回数据源中。
ADO.NET DataSet 是专门为独立于任何数据源的数据访问而设计的。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。 DataSet 包含一个或多个DataTable 对象的集合,这些对象由数据行和数据列以及有关 DataTable 对象中数据的主键、外键、约束和关系信息组成。
最近在学习ADO.NET Framwork类库:涉及到了DataSet相关的类,就想好好整理下一系列类的关系,其中涉及到的类从小到大有:
- DateColumn
- DataRow
- Constraint
- DataTable
- DataRelation
- DataSet
- SqlCommandBuilder
- DataAdapter
这些类都是用于在内存中模拟一个数据库,方便程序的直接操作,免去了多次连接数据库的时间耗费。
看到他们的名称就大概知道是做什么的,下面列一个表说明下他们的功能:
类名 |
功能 |
备注 |
DateColumn | 创建列,并设置相关属性(数据类型,列名,约束等) | 这里的列是一个虚拟在内存中的列,并不是真正的列 |
DataRow | 根据列名创建行数据(和数据库中的insert类似,但不一样) | 这里的行是一个虚拟在内存中的行,并不是真正的行 |
Constraint | 设置或获取约束 | |
DataTable | 创建一个数据表,可以将DateColumn和DataRow的实例添加到数据表中 | 虚拟在内存中的数据表, 并不是真正的数据表 |
DataRelation | 将两个表建立父子关系 | |
DataSet | 创建一个数据库,可以添加DataTable的实例 | 虚拟在内存中的数据库, 并不是真正的数据库 |
SqlCommandBuilder | 用于存储对数据表的insert,delete,update,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,那我就理一下关于连接数据库的发展历史:
- odbc之前:使用的不同的数据库都有各自对应数据库访问API,领导说换数据库,那就需要修改源码,这会整死程序猿的;
- odbc时:定义了一个公共数据访问层,可以用来访问几乎所有的关系型数据库,各个数据库厂商提供相应的驱动即可;
- ole db时:基于odbc,不仅可以访问关系型数据库,还可以访问非关系型数据
- 那什么是ADO呢?ADO是面向对象的结果,能够做到和ole db一样,但比ole db更简单,也就是说,ADO将ole db中的方法封装成多个类,只要主要是九个类的使用;
- ADO.NET呢?这个主要是增加了一个SqlClient,专门用于访问SQL Server,也是它访问SQL Server最快。
我也是主要使用SqlDataAdapter这个类,如果论通用性,当然是使用OleDbAdapter会好一点。
下面就讲一下SqlDataAdapter这个类:
它有四个构造函数:
在这里也可以讲一下SqlDataAdapter和SqlDataReader的区别:
SqlDataAdapter的实例是一次将需要的结果集拿到内存中,并自动关闭数据库连接(以后数据库连接都称为conn);而SqlDataReader的实例是调用Reader()方法,它维持了一个指针的作用,一次读取一个元组并自动向下挪动一位,并且只能从结果集中的第一行开始,不能回头(上一篇博客有讲过SqlDataReader对象),而且在这个挪动指针读取元组的过程中,conn一直保持连接,需要手动去关闭,或者使用using代码块。如果只是要查询数据,使用SqlDataReader会更好一点,因为他速度比SqlDataAdapter要快。