(一)ADO.NET概述及其重要的类

1、  概念

ADO.NET 是一组向 .NET 程序员公开数据访问服务的类。ADO.NET 为创建分布式数据共享应用程序提供了一组丰富的组件。它提供了对关系数据、XML 和应用程序数据的访问,因此是 .NET Framework 中不可缺少的一部分。ADO.NET 支持多种开发需求,包括创建由应用程序、工具、语言或 Internet 浏览器使用的前端数据库客户端和中间层业务对象。

2、  ADO.NET包含7个重要的基类,其中4个是数据访问类:

(1)       DbConnection;

(2)       DbCommand;

(3)       DbDataReader;

(4)       DbDataAdapter.

其他3个是数据表示类:

(1)       DataTable;

(2)       DataRelation;

(3)       DataSet;

3、  7个基类的概述:

(1)       DbConnection: 提供与数据库的连接,与其子类都称为连接类。在SQL Server中使用SqlConnection类,它是DbConnection类的子类。创建DbConnection对象时,应提供与DBMS通信的所有信息,如数据库的位置、用于认证的用户名和密码及要访问的数据库。DbConnection类是所有其他ADO.NET数据访问类与数据库通信的中枢。其角色如图所示:

 

(2)      DbCommand提供与数据库交互的主要方法,与其派生类称为命令类。SQL Server中的版本为SqlCommand。通常不直接使用DbCommand,而是用封装了DbCommand对象的其它对象。其有重要属性CommandText,CommandType,ConnectionTransaction,Parameters。以下是执行命令的几种方式:

a)         DbCommand.ExecuteNonQuery():命令不返回结果,适用于Insert,UpdateDelete命令。事实上命令返回一个表示命令影响行数的int类型的返回值。

b)         DbCommand.ExecuteScalar():返回任意类型的结果,类型是object。不适合返回行数据的Select命令,如果查询实际上返回行数据,该方法将返回第一行的第一列。

c)         DbCommand.ExecuteReader():命令返回行,返回值是SqlDataReader对象。适用于大多数Select、表直接(tabledirect)命令和很多存储过程。

d)         SqlCommand.ExecuteXmlReader():返回XML数据。(注:SQL ServerDbCommand版本名为SqlCommand,它有自己的一些特殊的方法,如ExecuteXmlReader())

其角色如图所示:

 


(3)       DbDataReader: 使用DbDataReader可以从结果集中读取数据。SQL Server中的版本为SqlDataReader。很多时候用户不直接使用它,而是由ADO.NET命名空间下的其它类使用。

要使用数据库阅读器对象,首先必须调用Read()方法来加载结果集中的第一行,获取一行时Read()返回true,否则返回falseDbDataReader.HasRows属性判断结果集中是否还有其它行。

很多属性和方法可以用于检查当前选中的行,DbDataReader.FieldCount查看当前行包含多少列,并用DbDataReader的重载索引器访问各列。

可以使用DbDataReader提供的多个方法来获得类型化数据,如GetString(),列通过索引器进行选择,注意使用前必须首先使用DbDataReader.IsDBNull检查空值,所有的数据库类型都可以为空。

下图说明了如何在数据库应用程序中使用数据阅读器:

 


(4)       DbDataAdapter: 该类比较复杂,称为数据适配器类,设计它的唯一目的是:减少存储在数据集对象中的数据与数据库进行数据交换时的干扰。SQL Server中的版本为SqlDataAdapter

数据适配器既可以将数据库中的数据传输给包含在数据集中的表,也可以将数据集中的数据传输到数据库中。这个功能由命令对象和数据阅读器对象来执行,因此大部分用户不必考虑它。然而,DbDataAdapter最重要的也是最有用的特性之一是用于传输数据的命令对象被暴露出来,因此可以根据需要对它们进行定制。

数据适配器的4个命令对象存储在4个属性中:SelectCommand,InsertCommand,UpdateCommandDeleteCommand。数据适配器最常用的两个方法是Fill()Update()。前者用于从数据库中获取数据,后者则是用于更新数据库中的数据。这两个方法都可以用于数据集或单个数据表。而FillSchema()可获取架构数据。

下图说明了DbDataAdapter的工作原理:(注:DbDataReader没有画出)




(5)       DataTable:

数据表示类。与数据访问类不同,数据表示类没有专门用于特定数据库管理系统(如 SQL Server)的子类,它们独立于平台。实际上,如果需要的话,数据表示类完全可以独立于数据库使用,它们只是存储数据的一种方便的方法。

DataTable类用于存储数据表。注意:以DataTable对象存储的表不一定要映射到数据库中的表。DataTable可能包含表中数据的一个子集,该子集可以只是包含数据库表的部分行、列,可能是由数据库中多个表组合而成的数据,还可能是所有这些的组合,这取决于获得数据的查询语句。当然,通常DataTable与数据库中的表匹配。

要获得完全填充的DataTable,可以使用数据阅读器。可访问包含数据的DataTable的行Rows、列Columns、约束Contraints和其他信息。

DataTable的另一个重点是如果处理数据修改。DataTable对象记录了对原始数据的修改,而不只是数据的当前状态。可以通过GetChanges()获得关于对DataTable的修改列表,通过AcceptChanges()接受已做的修改,通过RejectChanges()撤销所有的修改。

DataTable对象也暴露了很多事件,在应用程序中可以定制这些事件,如RowDeletedColumnChanged

行的当前状态,即它是否被修改、删除或者发某种方式改变,可通过DataRowState属性访问。该属性的值为DataRowState类型,是包含所有可能行状态的枚举类型。

下图说明了DataTable与其他ADO.NET对象之间的关系:


(6)       DataRelation:

表示两个DataTable对象之间的父/子关系。关系可以用DataRelation类的多个属性来定义,包括ChildTableChildColumnsChildKeyContraintParentTableParentKeyContraint等。关系名被存储在DataRelation.RelatonName属性中。

(7)       DataSet:

它是ADO.NET中最重要的类。从某种程度上来讲,该类只是DataTable对象与DataRelation对象的集合,如图:

 

然而,DataSet的强大功能体现在与其它对象结合使用,包括用于Web应该程序和Windows应该程序的控件、Web服务和XML文档。

DataSet类包含很多属性与方法;其中很多与其组成部分的属性和方法相似,例如GetChanges()。还有一些重要属性,如Tables(以DataTableCollection类的形式包含DataSet中的表集合)、Relations

数据表之间的关系及应用于数据的约束使得对DataSet的操作很麻烦。例如,一对多关系时的完整性要求。也可以将DataSet.EnforceContraints属性设置为false,这位在执行编辑操作时将忽略关系。

a)         DataSetXML的关系:

使用DataSet.GetXml()方法,可以将数据集转换为XML文档;还可以使用DataSet.GetXmlSchema()方法只提取数据集中的架构作为XML文档。还可以使用序列化技术在DataSetXML文档之间进行转换,因为DataSet类实现了IxmlSerializable接口。这种转换提供了一种应该程序层之间和通过Internet交换数据的很好方法。特别地,有了数据集的DataSet表示形式后,就可以在Web之间进行交换DataSet对象。

b)         类型化数据集(typed data set):

DataSet的功能很强大,但它们并不是最容易使用或最合乎逻辑的。例如,要访问表中的特定行,使用它就显得很笨拙。必须使用DateSet.Table集合获得正确的表,用DataTable.Rows集合获得正确的行,然后以对象引用的形式或通过DataColumn的方法提列数据。

代码可能如下:int result=(int) myDataSet.Tables[“mytable”].Rows[5][“IntegerColumn”]; 还有一种方法——使用类型化数据集,它是DataSet的子类但它包含强类型属性和方法,使得数据操作更容易。上述代码此时可简化如下:int result =myTypedDataSet.MyTable[5].IntegerColumn;

c)         性能:

DataSet是重量级对象,带来的开销在高性能应用程序中可能很大。另外,以数据集的形式通过Web传输数据可能意味着要传输大量的XML数据。如果性能很重要,可以设计自已的类,并直接使用数据阅读器提供的数据进行填充。

然而,数据集特别是类型化数据集提供了很多特性,只需少量代码就可以使用这些特性,且用于操作它们的代码通常很简单。例如,如果没有数据集,要表示数据库的数据,同时在类中记录所有编辑,且这些编辑可能很容易地传输到数据库中,可能需要大量的代码,且实现起来相当困难。

数据集的另一个好处是,可将其用于数据绑定。

(摘自:《C# 2005 数据库编程经典教程》)

posted @ 2009-06-27 19:10  烈火★寒冰  阅读(1593)  评论(0编辑  收藏  举报