DataRow类用于存储表中一行包含的数据。通过属性可以访问DataRowCollection对象,后者存储了组成表数据的多个DataRow对象。一行数据中的各列可通过索引器来访问,索引器让你能够通过列名、索引和版本(例如,如果行被修改)来访问列。
行的当前状态,即它是否被修改、删除或以某种方式改变,可通过DataRowState属性访问。该属性的值为DataRowState类型,这是一种包含所有可能行状态的枚举类型。各个DataRow对象也有与DataTable对应的方法,用于接受、拒绝和获得更改。例如,可以推断出,调用()将级联地对表的每行调用DataRowAcceptChanges()。 6.DataRelation
在处理多个DataTable对象时,通常需要表示(并实施)表数据之间的关系。这由DataRelation类来完成。可将多个DataRelation对象组合起来,构成一个DataRelationCollection对象。
关系可以用DataRelation类的多个属性来定义,包括ChildTable、ChildColumns、ChildKeyConstraint、ParentTable和ParentKeyConstraint等。这些属性都是对相应的对象的引用,如DataTable和DataColumn对象。关系名也被存储在属性中。
现在还不用太担心DataRelation对象,因为它们封装了比较高级的方面,这在本书后面将介绍。 7.DataSet
现在到了中最重要的类—DataSet。从某种程度上说,该类只是DataTable对象和DataRelation对象的集合(如图所示)。然而,DataSet的强大功能体现在与其他对象结合使用,包括用于Web应用程序和Windows应用程序的控件、Web服务和XML文档。
DataSet类包含很多属性和方法;其中很多与其组成部分的属性和方法类似,例如,GetChanges()和RejectChanges()。还有一些重要的属性,如Tables(以DataTableCollection类的形式包含DataSet中的表集合)、Relations(包含一
个DataRelationCollection类,其中的Relation对象定义了表之间的关系)。 数据表之间的关系及应用于数据的约束使得对DataSet的操作很麻烦。例如,如果两个表之间存在一对多关系,则添加一行到其中一个表中,可能要求另一个表中存在一行。而这行可能不存在(例如,如果两行同时添加时),这时,为避免错误,添加这些行的顺序将很重要;必须先添加位于关系“一”端的行。也可以将属性设置为false,这样在执行编辑操作时将忽略关系。 (1)DataSet对象和XML之间的关系。
与的其他对象一样,设计DataSet对象时也考虑了XML数据。使用()方法,可将数据集转换为XML文档;还可以使用()方法只提取数据集中的架构(包括数据集包含的所有表和其他对象的架构)作为XML文档。还可使用序列化技术在DataSet和XML文档之间进行转换,因为DataSet类实现了IxmlSeria-lizable接口。 DataSet对象与XML之间的关系以及使用序列化在这两种表示格式之间进行转换,在.NET框架中运用相当广泛。它提供了一种在应用程序层之间和通过Internet交换数据的很好方法。特别地,有了数据集的XML表示形式后,就可以在Web服务之间进行交换DataSet对象。 (2)类型化数据集(typeddataset)。
DataSet对象的功能很强大,但它们并不是最容易使用或最合乎逻辑的。例如,要访问表中的特定行,使用它就显得很笨拙。必须使用集合获得正确的表,用集合获得正确的行,然后以对象引用的形式或通过DataColumn的方法提取列数据—这些都不容易。访问特定列的代码行可能如下所示: intresult=(int)[\
还有一种方法,那就是使用类型化数据集。类型化数据集是DataSet的子类,但它包含强类型属性和方法,使得数据操作更容易。如果使用类型化数据集,上面的代码就可以简化为如下所示: intresult=[5].IntegerColumn;
虽然这并不影响代码的功能,但输入更容易(尤其是启用了智能感知功能时),以后阅读代码时也更容易理解。
唯一的限制是,需要在设计时就知道数据集中将包含的数据的结构。然而,因为数据库的结构不大可能有很大的改变,因此这通常不成问题。
可以使用工具或通过VisualC#速成版界面自动创建类型化数据集。工具要求提供一个架构(schema),这是以扩展名为.xsd的XML架构文件提供的。VisualC#速成版在创建类型化数据集时也要使用架构信息,但它直接从数据库获取这些信息,这使得对数据集的结构进行操作更容易。 (3)性能。
有些人认为应尽量避免使用数据集。这是因为它们是“重量级”对象,带来的开销在高性能应用程序中可能很大。另外,以数据集的形式通过Web传输数据可能意味着要传输大量的XML数据。
从某种程度上说,这些担忧是正确的。如果性能很重要,可以设计自己的类,并直接使用数据阅读器提供的数据进行填充。然而,数据集(特别是类型化数据集)自有它们的用处。它们提供了很多特性,只需少量代码就可以使用这些特性,且用于操作它们的代码通常很简单。例如,如果不没有数据集,要表示数据库的数据,同时在类中记录所有编辑,且这些编辑可以很容易地传输到数据库,可能需要大量的代码,且实现起来相当困难。 数据绑定
数据绑定是程序员只需做少量工作就可以用数据库中的数据填充Windows或Web控件的一种技术。.NET框架让程序员只需使用简单的代码就可以将数据源与控件关联起来,实际上,可以通过GUI实现很多功能,而不需要编写大量C#代码。 数据绑定有两点要求:数据源和要绑定数据的控件。数据源包括数据库连接,但不仅限于此,也可以使用对象或来自Web服务的数据作为数据源。使用对象作为数据源是一种功能强大的方法,可以利用自定义的集合和自己设计的类,但这有点偏题了。本书大部分时候使用的数据源类型都是数据库数据源,它有Web控件形式,也有Windows控件形式。
生成数据库数据源时,通常不仅需要配置连接。数据库数据源包括关于要访问数据库中哪些对象的信息。实际上,在幕后通常将生成类型化数据集。此外,幕后还将用到前面介绍的对象(连接、命令、数据阅读器和数据适配器协同工作来创建数据源)。然而,程序员不必太担心这一点,而只需创建一个数据源并将它绑定到控件,如图所示。
图?数据绑定
要绑定到控件,需要将控件的属性设置为数据源的元素(从而间接地设置为数据库的元素)。对于简单控件,如标签或文本框,只要将控件的Text属性设置为数据库中类型为文本的列。还可以将数据绑定到列表控件(包括下拉列表),这样列表中的每项都绑定到数据库表中的一行。更高级的控件(如GridView)可用于查看整个表的内容。另外,也可以提供自定义的控件和自定义的数据绑定架构,以便使用和编辑数据库中的数据。 语言
通用的SQL语言,最早于1974年提出,当时称为SEQUEL语言,后来被国际标准化组织ISO采纳为国际标准,现在大多数数据库管理系统都支持SQL语言。 SQL是一种处理数据的高级语言,是非过程化语言,在查询数据时,只需指出“要什么”,而不需指出如何实现的过程。SQL语言包括数据定义、查询、操纵和控制功能。SQL语言的语法格式简单,使用方便灵活。 表定义语句
广义上讲,表定义语句包括数据表的创建语句(Create语句)、数据表修改语句(Alter语句)和数据表删除语句(Drop语句)。 视图定义语句
视图是对数据表中数据的一种显示方式,用一个数据表可以有多个视图,以根据用户的不同需求,将数据表中用户所关心的数据提取出来,显示给用户,忽略数据表中其他数据。视图也可以理解为一种预先定义好的查询。实际上,查询的优点在于可在多个数据表之间按指定的条件对数据进行筛选显示。 索引定义语句
索引是加速数据查询的重要手段,索引一旦被建立起来,就成为了数据库的一部份,并占用数据库的存储空间。使用索引的突出优点就是加快数据的查询速度,但是,对于数据的插入、删除和修改操作来说,索引却降低了执行效率。