模拟在内存中的数据库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 创建一个数据表,可以将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,那我就理一下关于连接数据库的发展历史:

  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要快。

时间: 2024-10-16 21:53:43

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

ADO.NET之9-非连接模式,内存中的数据库DataSet,DataTable---ShinePans

DataSet被称作数据集,可以比作内存中的数据库,DataSet为ADO.NET核心,支持ADO.NET断开式,分布式数据方案的核心对象也是实现基于非连接的数据查询核心组件 DataTable常用属性: 属性 说明 Columns 获取属于该表的列的集合 Rows 获取属于该表的行的集合 TableName 获取或设置DataTable的名称 DataTable方法: 方法 说明 AcceptChanges 提交自上次调用AcceptChanges以来对该表进行的所有更改 Clear 清除Da

Tp中与数据库的相关语句

TP框架中给予了使用者一些更简单的与数据库互动的方法.这里我就用Mysqli为例子做个演示. namespace Home\Controller; use Think\Controller; class MainController extends Controller { public function index() { //$n = new \Home\Model\InfoModel(); //$n = D("info");//创建模型对象 //$n = M("info

eclipse中从数据库生成hibernate实体类

为什么写这篇BLOG,是因为经常有同事或网友问起我hiberante实体类的生成问题.所以下次再有人问我可以省一堆的话了,其实这个真的是很简单.        现在hibernate在项目中的应用是越来过广泛了.我是从hibernate开始支持注释语法后才开始研究它的.说实在的,原来的hibernate生成的一堆堆的XML文件看着就头晕,还不如自己写的SQL语句来的舒服,所以一直听朋友和同事介绍,可自己一直不屑用之.        可是现在有福了hibernate是JPA最常用的实现之一,而且h

c#中DataTable和DataSet区别

你可以把DataTable和DataSet看做是数据容器,比如你查询数据库后得到一些结果,可以放到这种容器里,那你可能要问:我不用这种容器,自己读到变量或数组里也一样可以存起来啊,为什么用容器? 原因是,这种容器的功能比较强大,除了可以存数据,还可以有更大用途.举例:在一个c/s结构的桌面数据库系统里,你可以把前面存放查询结果的容器里的数据显示到你客户端界面上,用户在界面上对数据进行添加.删除.修改,你可以把用户的操作更新到容器,等用户操作完毕了,要求更新,然后你才把容器整个的数据变化更新到中心

SQL Server 内存中OLTP内部机制概述(四)

----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory OLTP Internals Overview>:http://technet.microsoft.com/en-us/library/dn720242.aspx 译者水平有限,如有翻译不当之处,欢迎指正. ----------------------------我是分割线---------------

android中的数据库操作(转)

android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用c语言构建的.相关简介可以从链接查看. 2.数据库基本知识观花   对于一些和我一样还没有真正系统学习数据库技术的同学来说,把SQL92标准中的一些基本概念.基本语句快速的了解一下,是很有必要的,这样待会用Android的da

内存中OLTP(Hekaton)里的事务日志记录

在今天的文章里,我想详细讨论下内存中OLTP里的事务日志如何写入事务日志.我们都知道,对于你的内存优化表(Memory Optimized Tables),内存中OLTP提供你2个持久性(durability)选项: SCHEMA_ONLY SCHEMA_AND_DATA 今天我不想更多讨论SCHEMA_ONLY,因为使用这个选项,在事务日志里没有发生任何日志(SQL Server 重启后你的数据会丢失).今天我们会专门讲解下SCHEMA_AND_DATA选项的持久性. SCHEMA_AND_D

android中的数据库操作【转】

http://blog.csdn.net/nieweilin/article/details/5919013 android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用c语言构建的.相关简介可以从链接查看. 2.数据库基本知识观花   对于一些和我一样还没有真正系统学习数据库技术的同

Android内存中的图片

图片在内存中的大小 Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, Bitmap.Config config)方法里会用到,打开个这个类一看 枚举变量public static final Bitmap.Config ALPHA_8public static final Bitmap.Config ARGB_4444public static final Bitma