#T#学习了这么多关于编程的知识,在这里为大家简单的分析一下关于ADO.NET对象吧。几个ADO.NET对象都拥有一个叫做ExtendedProperties的集合。该属性就像收集货物(cargo collection)一样,可以用来存储任何类型的用户信息。DataSet、DataTable和DataColumn就是可以提供该数据成员的类。ADO.NET通过运用 PropertyCollection类封装的一个哈希表来实现这个ExtendedProperties属性。你可以用Add方法将数据插入到集合中。 Add方法使用了两个参数来保存数据——key和value.该方法的原形将参数定义为通用的对象类型,你可以存储任何类型的信息。然而,在特殊情况下,你应该特别注意那些被保存为扩展属性的对象的类型,下面我们来深入的研究一下吧。
如果你想将包含扩展属性的ADO.NET对象串行化到XML,***只用字符串。如果不行,你必须对ADO.NET的内在的serializer的行为采取对策。当ADO.NET将一个DataSet对象保存到XML时,ExtendedProperties集合的内容就被串行化到内存中了,但大概是出于性能的原因,ADO.NET运用了ToString方法,而不是XML serializer来实现串行化。更重要的是,当ADO.NET对象被读回并复原时,ExtendedProperties集合包含的是对象的字符串表现形式,而不是对象本身。
运用具有BLOB字段的ExecuteXmlReader
用于SQL Server的。NET数据提供者(data provider)使用了数据库提供的XML扩展名,并提供了一个额外的方法(ExecuteXmlReader)来执行查询。命令对象上的所有的执行者(例如ExecuteReader和ExecuteScaler)都采用不同的方法来得到结果集。ExcecuteReader通过一个托管指针(managed cursor)(data reader)来返回数据,而ExecuteScaler返回结果集中的***个值,把它作为一个标量值。ExecuteXmlReader执行查询,并返回已经绑定到一个XmlTextReader对象的基于XML的输出流。通过这种方式,你就不需要做额外的工作来以XML的方式加工数据了。要实现这一点,查询字符串必须返回XML数据。对SQL Server来说,当查询字符串包含一个FOR XML子句时,就可以实现它。尽管这只是一种可能。
一个不太为人所知的情况是,要使ExecuteXmlReader工作,让结果集包含XML数据就足够了。下面的查询方法很好,只要列包含XML格式的文本就行:SELECT data FROM table WHERE key=1这个列是个典型的BLOB或ntext字段,其文本显示为XML.简要地看看ExecuteXmlReader方法的内部结构会有助于我们的理解。该方法用ExecuteReader来执行查询,并从数据提供者得到一个数据流对象。接下来,它将数据流绑定到XmlTextReader类的一个新创建的实例上,这个实例被返回给调用者。连接一直处于忙碌状态,直到XML reader停止工作。SQL Server提供者是唯一的提供者,它提供了方法让我们从一个XML reader直接读取数据,但这种做法更多的是与提供者有关,而与数据库性能的关系并不大。Oracle支持XML查询,但Oracle的数据提供者并不支持XML查询。相比之下,为OLE DB数据提供者编写一个ExecuteXmlReader方法并不难(点此下载实例)。
不要设法缓存一个DataView
DataSet和DataTable对象是唯一的包含数据的ADO.NET对象。DataView是一个不能串行化的、轻量级的类,它只代表构建在一个表上的视图(view)。你可以根据一个表达式或行的状态来过滤视图。许多应用程序都需要你管理数据视图并将它们绑定到数据控件上,如Windows和Web DataGrid控件。一个DataView对象不能缓存数据;它只是缓存了与当前过滤器相匹配的基本的表中的行的索引。缓存索引的顺序与当前的排序表达式一致。缓存DataView而不缓存基本的DataTable是不行的。
例如,提供分页(比如通过运用DataGrid控件)的ASP.NET应用程序通常以一个DataView对象结尾,因为它支持排序和过滤。在有些情况下(大多是基于性能的原因),你可能决定要缓存数据源。要缓存的对象不能是DataView(它是你实际绑定的对象)。一个DataView只是一种索引,如果没有基本的DataTable对象,它是没有用的。