c#

位置:IT落伍者 >> c# >> 浏览文章

深入分析ADO.NET中的DataSet对象


发布日期:2018年09月15日
 
深入分析ADO.NET中的DataSet对象
ADONET是Net FrameWork SDK中用以操作数据库的类库的总称而DataSet类则是ADONET中最核心的成员之一也是各种开发基于Net平台程序语言开发数据库应用程序最常接触的类之所以DataSet类在ADONET中具有特殊的地位是因为DataSet在ADONET实现从数据库抽取数据中起到关键作用在从数据库完成数据抽取后DataSet就是数据的存放地它是各种数据源中的数据在计算机内存中映射成的缓存所以有时说DataSet可以看成是一个数据容器同时它在客户端实现读取更新数据库等过程中起到中间部件的作用(DataReader只能检索数据库中的数据)

各种Net平台开发语言开发数据库应用程序一般并不直接对数据库操作(直接在程序中调用存储过程等除外)而是先完成数据连接和通过数据适配器填充DataSet对象然后客户端再通过读取DataSet来获得需要的数据同样更新数据库中数据也是首先更新DataSet然后再通过DataSet来更新数据库中对应的数据的可见了解掌握ADONET首先必须了解掌握DataSetDataSet主要有三个特性

独立性DataSet独立于各种数据源微软公司在推出DataSet时就考虑到各种数据源的多样性复杂性Net中无论什么类型数据源它都会提供一致的关系编程模型而这就是DataSet

离线(断开)和连接DataSet既可以以离线方式也可以以实时连接来操作数据库中的数据这一点有点像ADO中的RecordSet

DataSet对象是一个可以用XML形式表示的数据视图是一种数据关系视图

DataSet对象的结构模型及和RecordSet的比较

虽说ADONET是 ADO在Net平台下得后继版本但二者的区别是很大的突出表现在ADO中的RecordSet对象和ADONET中的DataSet对象RecordSet其实也是非常灵活的一个对象微软公司推出它也是煞费苦心RecordSet可以离线操作数据库性能优良效率较高等等这些都让当时的程序员为之一振RecordSet虽然已经很复杂但DataSet却比RecordSet复杂的多我们知道每一DataSet往往是一个或多个DataTable 对象的集合这些对象由数据行和数据列以及主键外键约束和有关DataTable对象中数据的关系信息组成而RecordSet只能存放单张数据表虽然这张数据表可以由几张数据表JOIN生成所以有些时候说RecordSet更类似于DataSet中的DataTableDataSet对象的结构模型如图所示

DataSet对象的结构模型图

通过图可见在DataSet对象结构还是非常复杂的在DataSet对象的下一层中是DataTableCollection对象DataRelationCollection对象和ExtendedProperties对象上文已经说过每一个DataSet对象是由若干个DataTable对象组成DataTableCollection就是管理DataSet中的所有DataTable对象表示DataSet中两个DataTable对象之间的父/子关系是DataRelation对象它使一个DataTable 中的行与另一个DataTable中的行相关联这种关联类似于关系数据库中数据表之间的主键列和外键列之间的关联DataRelationCollection对象就是管理DataSet中所有DataTable之间的DataRelation关系的在DataSet中DataSetDataTable和DataColumn都具有ExtendedProperties属性ExtendedProperties其实是一个属性集(PropertyCollection)用以存放各种自定义数据如生成数据集的SELECT语句等

二.使用DataSet

DataSet其实就是数据集上文已经说过DataSet是把数据库中的数据映射到内存缓存中的所构成的数据容器对于任何数据源它都提供一致的关系编程模型在DataSet中既定义了数据表的约束关系以及数据表之间的关系还可以对数据表中的数据进行排序等DataSet使用方法一般有三种

把数据库中的数据通过DataAdapter对象填充DataSet

通过DataAdapter对象操作DataSet实现更新数据库

把XML数据流或文本加载到DataSet

下面就来详细探讨以上DataSet使用方法的具体实现使用语言是C#

把数据库中的数据通过DataAdapter对象填充DataSet

掌握DataSet使用方法必须掌握ADONET另外一个核心常用成员数据提供者(Data Provider)数据提供者(也称为托管提供者Managed Provider)是一个类集合Net FrameWork SDK 中数据提供者分为二种The SQL Server NET Data Provider和The OLE DB NET Data Provider而到了Net FrameWork SDK ADONET中又增加了The ODBC NET Data Provider和 The Oracle NET Data Provider二个数据提供者The SQL Server NET Data Provider的操作数据库对象只限于Sql Server 及以上版本Oracle NET Data Provider的操作数据库对象只限于Oracle 及以上版本而The OLE DB NET Data Provider和The ODBC NET Data Provider可操作的数据库类型就相对多了许多只要它们在本地分别提供Ole Db提供程序和ODBC提供程序

在这些数据提供者中都有一个DataAdapter类OLE DB NET Framework 数据提供者中是 OleDbDataAdapter类The SQL Server NET Framework 数据提供者中是SqlDataAdapter类The ODBC NET Framework 数据提供者中是OdbcDataAdapter类通过这些DataAdapter就能够实现从数据库中检索数据并填充 DataSet 中的表

DataAdapter填充DataSet的过程分为二步首先通过DataAdapter的SelectCommand属性从数据库中检索出需要的数据SelectCommand其实是一个Command对象然后再通过DataAdapter的Fill方法把检索来的数据填充 DataSet代码清单就是以Microsoft SQL Server 中的Northwind数据库为对象C#使用The SQL Server NET Data Provider中的SqlDataAdapter填充DataSet的具体实现方法

代码清单

SqlConnection sqlConnection = new SqlConnection ( Data Source=localhost ;Integrated Security=SSPI ;Initial Catalog=Northwind ) ;

//创建数据连接

SqlCommand selectCMD = new SqlCommand ( SELECT CustomerID CompanyName FROM Customers sqlConnection ) ;

//创建并初始化SqlCommand对象

SqlDataAdapter sqlDataAdapter = new SqlDataAdapter ( ) ;

custDASelectCommand = selectCMD ;

sqlConnectionOpen ( ) ;

//创建SqlDataAdapter对象并根据SelectCommand属性检索数据

DataSet dsDataSet = new DataSet ( ) ;

sqlDataAdapterFill ( dsDataSet Customers ) ;

//使用SqlDataAdapter的Fill方法填充DataSet

sqlConnectionClose ( ) ;

//关闭数据连接

对于其他数据提供者的DataAdapter具体的实现检索数据库中的数据并填充DataSet的实现方法类似于以上方法

通过DataAdapter对象操作DataSet实现更新数据库

DataAdapter是通过其Update方法实现以DataSet中数据来更新数据库的当DataSet实例中包含数据发生更改后此时调用Update方法DataAdapter 将分析已作出的更改并执行相应的命令(INSERTUPDATE 或 DELETE)并以此命令来更新数据库中的数据如果DataSet中的DataTable是映射到单个数据库表或从单个数据库表生成则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommandInsertCommand 和 UpdateCommand使用DataAdapter对象操作DataSet实现更新数据库具体的实现方法只需把下面的代码清单添加到代码清单之后二者合并即可实现删除Customers数据表中第一行数据

代码清单

SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter) ;

//以sqlDataAdapter为参数来初始化SqlCommandBuilder实例

dsDataSetTables[Customers]Rows[]Delete ( ) ;

//删除DataSet中删除数据表Customers中第一行数据

sqlDataAdapterUpdate ( dsDataSet Customers ) ;

//调用Update方法以DataSet中的数据更新从数据库

dsDataSetTables[Customers]AcceptChanges ( ) ;

由于不了解DataSet结构和与数据库关系很多初学者往往只是更新了DataSet中的数据就认为数据库中的数据也随之更新所以当打开数据库浏览时发现并没有更新数据都会比较疑惑通过上面的介绍疑惑应当能够消除了

XML和DataSet

DataSet中的数据可以从XML数据流或文档创建并且Net Framework可以控制加载XML数据流或文档中那些数据以及如何创建DataSet的关系结构加载XML数据流和文档到DataSet中是可使用DataSet对象的ReadXml方法(注意ReadXml来加载非常大的文件则性能会有所下降)ReadXml 方法将从文件流或 XmlReader 中进行读取并将 XML 的源以及可选的 XmlReadMode 参数用作参数该ReadXml方法读取 XML 流或文档的内容并将数据加载到 DataSet 中根据所指定的XmlReadMode和关系架构是否已存在它还将创建DataSet的关系架构

三.DataSet和数据绑定(DataBinding)

数据绑定是数据绑定是绑定技术中使用最频繁也是最为重要的技术也可以说是各种Net开发语言开发数据库应用程序最需要掌握的基本的知识之一数据绑定之所以很重要是因为在Net FrameWork SDK中并没有提供数据库开发的相关组件即如DbTextBoxDbLabel等用于数据库开发的常用组件在Net FrameWork SDK中都没有而数据绑定技术则能够把TextBox组件改造成DbTextBox组件把Label组件改造成DbLabel组件等等所有这些都与DataSet有直接关系

数据绑定分成二类简单型数据绑定和复杂型数据绑定适用于简单型数据绑定组件一般有LableTextBox等适用于复杂性数据绑定的组件一般有DataGridListBoxComboBox等其实简单型数据绑定和复杂性数据绑定并没有明确的区分只是在组件进行数据绑定时一些结构复杂一点的组件在数据绑定时操作步骤相近而另外一些结构简单一点的组件在数据绑定时也比较类似于是也就产生了二个类别以下就结合TextBox组件和DataGrid组件分别探讨DataSet在实现简单型数据绑定和复杂性数据绑定作用和具体实现方法

简单型数据绑定

简单型数据绑定一般使用这些组件中的DataBindings属性的Add方法把DataSet中某一个DataTable中的某一行和组件的某个属性绑定起来从而达到显示数据的效果TextBox组件的数据绑定具体实现方法是在代码清单再添加代码清单中的代码代码清单中的代码是把DataSet中的Customers 数据表中的CustomerID的数据和TextBox的Text属性绑定起来这样DbTextBox就产生了其他适用于简单型数据绑定组件数据绑定的方法类似与此操作

代码清单

textBoxDataBindingsAdd ( Text dsDataSet Customers CustomerID ) ;

复杂性数据绑定

复杂性数据绑定一般是设定组件的DataSource属性和DisplayMember属性来完成数据绑定的DataSource属性值一般设定为要绑定的DataSetDisplayMember属性值一般设定为要绑定的数据表或数据表中的某一列DataGrid组件的数据绑定的一般实现方法是在代码清单再添加代码清单中的代码代码清单的功能是把DataSet中的Customers 数据表和DataGrid绑定起来其他适用于复杂性数据绑定的组件实现数据绑定的方法类似此操作

代码清单

dataGridDataSource = dsDataSet ;

dataGridDataMember = Customers ;

四.总结

DataSet类是ADONET中一个非常重要的核心成员它是数据库中的数据在本地计算机中映射成的缓存对DataSet的任何操作都是在计算机缓存中完成的理解这一点是掌握DataSet的第一步DataSet虽然结构复杂但只要区分DataSet对象中各个组成部件及其相互关系掌握也不算太困难本文覆盖了DataSet的特性结构以及具体的使用方法等等相信这些对您掌握这个ADONET中核心成员是有所帮助

               

上一篇:c#对PL/SQL查询结果列复制的结果生成指定格式

下一篇:.NET单点登陆的实现方法及思路