CSDN博客

img tingpig

ADO.NET使用小结(一)

发表于2004/10/14 17:21:00  784人阅读

分类: .net

本文是使用ADO.NET过程中的一点点心得,包括Microsoft ADO.NET框架提供的各种对象之间对比,如何选择较好的解决方案等。这些都有助于优化Microsoft ADO.NET应用程序。

由于作者开发使用的是System.Data.SqlClient 命名空间下的SQL Server .NET 数据提供程序,所以本文在上述框架下展开。

1.    ADO.NET简介

ADO.NET.NET应用程序的数据访问模型。它能用于访问关系型数据库系统,如SQL Server 2000,及很多其它已经配备了OLE DB供应器的数据源。在某种程度上,ADO.NET代表了最新版本的ADO技术。然而,ADO.NET引入了一些重大变化和革新,它们专门用于结构松散的、本质非链接的Web应用程序。

ADO.NET引入的一个重要变化是,用DataTable, DataSet, DataAdapter, DataReader对象的组合代替了ADO Recordset对象。DataTable表示来自一个表的行集合,在这方面它与Recordset类似。DataSet表示DataTable对象的集合,及与其它表绑定在一起的关系和限制。实际上,DataSet是具有内置的扩展标记语言(XML)支持的内存中的关联结构。

DataSet的一个主要特点是,它对底层的数据源一无所知,而这些数据源可能用于对其进行填充。这是一个分离的用于表示数据集合的独立实体,并且它可通过多层应用程序的不同层由一个组件传递到另一组件。它也可作为XML 数据流被序列化,因而非常适合于不同类型平台间的数据传输。ADO.NET使用DataAdapter对象为发送到和来自DataSet及底层数据源的数据建立通道。DataAdapter对象还支持增强的批更新特性,以前这是Recorder的相关功能。

2.    何时使用DataSetDataReader

ADO.NET 提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet DataReaderDataSet 提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。DataReader 提供一个来自数据库的快速、只进、只读数据流。

当设计应用程序时,要考虑应用程序所需功能的等级,以确定使用 DataSet 或者是 DataReader

要通过应用程序执行以下操作,就要使用 DataSet

u    在结果的多个离散表之间进行导航。

u    操作来自多个数据源(例如,来自多个数据库、一个 XML 文件和一个电子表格的混合数据)的数据。

u    在各层之间交换数据或使用 XML Web 服务。与 DataReader 不同的是,DataSet 能传递给远程客户端。

u    重用同样的行组,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。

u    每行执行大量处理。对使用 DataReader 返回的每一行进行扩展处理会延长服务于 DataReader 的连接的必要时间,这影响了性能。

u    使用 XML 操作对数据进行操作,例如可扩展样式表语言转换(XSLT 转换)或 XPath 查询。

对于下列情况,要在应用程序中使用 DataReader

u    不需要缓存数据。

u    要处理的结果集太大,内存中放不下。

u    一旦需要以只进、只读方式快速访问数据。

3.    刷新 DataSet 中的数据

如果想用服务器上的更新值刷新 DataSet 中的值,就使用 DataAdapter.Fill。如果有在 DataTable 上定义的主键,DataAdapter.Fill 会根据主键进行新行匹配,并且当更改到现有行时应用服务器上的值。即使刷新之前修改了它们,刷新行的 RowState 仍被设置为 Unchanged。注意,如果没有为 DataTable 定义主键,DataAdapter.Fill 就用可能重复的主键值添加新行。

如果想用来自服务器的当前值刷新表,并同时保留对表中的行所做的任何更改,必须首先用 DataAdapter.Fill 填充表,并填充一个新的 DataTable,然后用 preserveChanges true DataTableMerge DataSet 中。

4.    分页

ADO.NET 可以显式控制从数据源中返回什么样的数据,以及在 DataSet 中本地缓存多少数据。对查询结果的分页没有唯一的答案,但下面有一些设计应用程序时应该考虑的技巧。

避免使用带有 startRecord maxRecords 值的 DataAdapter.Fill 重载。当以这种方式填充 DataSet 时,只有 maxRecords 参数(从 startRecord 参数标识的记录开始)指定的记录数量用于填充 DataSet,但无论如何总是返回完整的查询。这就会引起不必要的处理,用于读取不需要的记录;而且为了返回附加记录,会耗尽不必要的服务器资源。

用于每次只返回一页记录的技术是创建 SQL 语句,把 WHERE 子句以及 ORDER BY 子句和 TOP 谓词组合起来。此技术取决于存在一种可唯一标识每一行的办法。当浏览下一页记录时,修改 WHERE 子句使之包含所有唯一标识符大于当前页最后一个唯一标识符的记录。当浏览上一页记录时,修改 WHERE 子句使之返回所有唯一标识符小于当前页第一个唯一标识符的记录。两种查询都只返回记录的 TOP 页。当浏览上一页时,需要以降序为结果排序。这将有效地返回查询的最后一页。

另一项每次只返回一页记录的技术是创建 SQL 语句,把 TOP 谓词和嵌入式 SELECT 语句的使用结合在一起。此技术并不依赖于存在一种可唯一标识每一行的办法。使用这项技术的第一步是把所需页的数量与页大小相乘。然后将结果传递给 SQL Query TOP 谓词,该查询以升序排列。再把此查询嵌入到另一个查询中,后者从降序排列的嵌入式查询结果中选择 TOP 页大小。实质上,返回的是嵌入式查询的最后一页。例如,要返回查询结果的第三页(页大小是 10),应该书写如下所示的命令:

SELECT TOP 10 * FROM

  (SELECT TOP 30 * FROM Customers ORDER BY Id ASC) AS Table1

ORDER BY Id DESC

注意,从查询中返回的结果页以降序显示。如果需要,应该重新排序。

如果数据不经常变动,可以在 DataSet 中本地维护一个记录缓存,以此提高性能。例如,可以在本地 DataSet 中存储 10 页有用的数据,并且只有当用户浏览超出缓存第一页和最后一页时,才从数据源中查询新数据。

阅读全文
0 0

相关文章推荐

img
取 消
img