`

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

阅读更多

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

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

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

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

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

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

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

  



   图01:DataSet对象的结构模型图

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

  二.使用DataSet:

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

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

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

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

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

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

  掌握DataSet使用方法必须掌握ADO.NET另外一个核心常用成员--数据提供者(Data Provider)。数据提供者(也称为托管提供者Managed Provider)是一个类集合,在.Net FrameWork SDK 1.0中数据提供者分为二种:The SQL Server .NET Data Provider和The OLE DB .NET Data Provider。而到了.Net FrameWork SDK 1.1时,ADO.NET中又增加了The ODBC .NET Data Provider和 The Oracle .NET Data Provider二个数据提供者。The SQL Server .NET Data Provider的操作数据库对象只限于Sql Server 7.0及以上版本,Oracle .NET Data Provider的操作数据库对象只限于Oracle 8.1.7及以上版本。而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。代码清单01就是以Microsoft SQL Server 中的Northwind数据库为对象,C#使用The SQL Server .NET Data Provider中的SqlDataAdapter填充DataSet的具体实现方法:

  代码清单01:

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

  //创建数据连接

  SqlCommand selectCMD = new SqlCommand ( "SELECT CustomerID , CompanyName FROM Customers" , sqlConnection1 ) ;

  //创建并初始化SqlCommand对象

  SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter ( ) ;

  custDA.SelectCommand = selectCMD ;

  sqlConnection.Open ( ) ;

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

  DataSet dsDataSet1 = new DataSet ( ) ;

  sqlDataAdapter1.Fill ( dsDataSet1 , "Customers" ) ;

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

  sqlConnection.Close ( ) ;

  //关闭数据连接

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

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

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

  代码清单02:

  SqlCommandBuilder sqlCommandBuilder1 = new SqlCommandBuilder ( sqlDataAdapter1 ) ;

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

  dsDataSet1.Tables["Customers"].Rows[0].Delete ( ) ;

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

  sqlDataAdapter1.Update ( dsDataSet1 ,"Customers" ) ;

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

  dsDataSet1.Tables["Customers"].AcceptChanges ( ) ;

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

  3. 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中并没有提供数据库开发的相关组件,即如:DbTextBox、DbLabel等用于数据库开发的常用组件在.Net FrameWork SDK中都没有。而数据绑定技术则能够把TextBox组件"改造"
分享到:
评论

相关推荐

    ADO.NET Entity Framework 教程

    本文档主要介绍.NET开发中两项新技术,.NET平台语言中的语言集成查询技术 ­ LINQ,与ADO.NET  中新增的数据访问层设计技术ADO.NET Entity Framework。ADO.NET的LINQ to Entity部分以LINQ  为基础,为了完整...

    LINQ 实战 1/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    asp.net知识库

    ADO.NET 2.0 大批量数据操作和多个动态的结果集 ADO.NET 2.0 异步处理 在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+...

    亮剑.NET深入体验与实战精要3

    此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习...

    亮剑.NET深入体验与实战精要2

    此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习...

    dot NET技术企业高级培训PPT

    (8) ADO.NET 中对象模型 (9) 数据库相关控件的使用DataGridView控件 (10) DataGridView-显示数据基本方法 (11) DataGridView使用动态编程显示数据 (12) DataGridView保存修改后的数据关键知识 (13) ...

    CSDN 微软技术高级讲师.NET技术企业高级培训PPT

    (8) ADO.NET 中对象模型 (9) 数据库相关控件的使用DataGridView控件 (10) DataGridView-显示数据基本方法 (11) DataGridView使用动态编程显示数据 (12) DataGridView保存修改后的数据关键知识 (13) ...

    C#实训教程

    18.4 ADO.NET 的基本组件 325 18.5 DataReader 328 18.6 获取单个值 328 18.7 修改数据库中的数据 329 18.8 从SQL Server获取XML数据 329 18.9 DataAdapter 330 18.10 数据集:DataSet 330 18.11 DataTable ...

    Entity Framework 教程

    手写代码通过ADO.NET2.0连接类与数据库交互 5 ORM – LINQ to SQL 6 深入了解Entity Framework 7 Entity Framework的核心 – EDM(Entity Data Model) 7 EDM概述 7 EDM之CSDL 7 EDM之SSDL 11 EDM之MSL 12 EDM...

    LINQ 实战 3/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 4/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 2/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 7/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 11/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 5/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 8/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 6/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 10/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    LINQ 实战 9/11

    13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能...

    Apress.Pro.WPF.in.C.Sharp.2008.2nd.Edition.Feb.2008

    9.3.1 深入分析WPF中的URI 214 9.3.2 导航历史 215 9.3.3 维护自定义的属性 216 9.4 导航服务 217 9.4.1 通过编程进行导航 217 9.4.2 导航事件 218 9.4.3 管理日志 219 9.4.4 向日志添加自定义项 221 9.4.5 页函数 ...

Global site tag (gtag.js) - Google Analytics