ADO.NET 的最佳实践技巧.doc

上传人:marr****208 文档编号:156922714 上传时间:2020-12-20 格式:DOC 页数:13 大小:151.50KB
返回 下载 相关 举报
ADO.NET 的最佳实践技巧.doc_第1页
第1页 / 共13页
ADO.NET 的最佳实践技巧.doc_第2页
第2页 / 共13页
ADO.NET 的最佳实践技巧.doc_第3页
第3页 / 共13页
ADO.NET 的最佳实践技巧.doc_第4页
第4页 / 共13页
ADO.NET 的最佳实践技巧.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《ADO.NET 的最佳实践技巧.doc》由会员分享,可在线阅读,更多相关《ADO.NET 的最佳实践技巧.doc(13页珍藏版)》请在金锄头文库上搜索。

1、这是我很早以前看过的微软的一篇文章,最近,一些网友问的问题很多理论都在里面,所以,整理一下放在这里,大家可以参考一下。简介本文为您提供了在 Microsoft ADO.NET 应用程序中实现和获得最佳性能、可伸缩性以及功能的最佳解决方案;同时也讲述了使用 ADO.NET 中可用对象的最佳实践;并提出一些有助于优化 ADO.NET 应用程序设计的建议。本文包含:有关 .NET 框架包含的 .NET 框架数据提供程序的信息。DataSet和DataReader之间的比较,以及这些对象中每个对象最佳用法的解释。解释如何使用DataSet、Commands和Connections。有关与 XML 集成

2、的信息。通用的技巧和问题。使用 DataReader、DataSet、DataAdapter 和 DataViewADO.NET 提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet和DataReader。DataSet提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。DataReader提供一个来自数据库的快速、只进、只读数据流。当使用DataSet时,经常会利用DataAdapter(也可能是CommandBuilder)与数据源进行交互。当使用DataSet时,也可以利用DataView对DataS

3、et中的数据应用排序和筛选。也可以从DataSet继承,创建强类型DataSet,用于将表、行和列作为强类型对象属性公开。下列主题包括的信息涉及:使用DataSet或DataReader的最佳时机、如何优化访问它们所包含数据、以及如何优化使用DataAdapter(包括CommandBuilder)和DataView的技巧。DataSet 与 DataReader当设计应用程序时,要考虑应用程序所需功能的等级,以确定使用DataSet或者是DataReader。要通过应用程序执行以下操作,就要使用DataSet:在结果的多个离散表之间进行导航。操作来自多个数据源(例如,来自多个数据库、一个 X

4、ML 文件和一个电子表格的混合数据)的数据。在各层之间交换数据或使用 XML Web 服务。与DataReader不同的是,DataSet能传递给远程客户端。重用同样的行组,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。每行执行大量处理。对使用DataReader返回的每一行进行扩展处理会延长服务于DataReader的连接的必要时间,这影响了性能。使用 XML 操作对数据进行操作,例如可扩展样式表语言转换(XSLT 转换)或 XPath 查询。对于下列情况,要在应用程序中使用DataReader:不需要缓存数据。要处理的结果集太大,内存中放不下。一旦需要以只进、只读方式快速访问数据。

5、注填充DataSet时,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表现为节省了DataSet占用内存和填充DataSet需要的循环。一般来说,此性能提升只是象征性的,因此,设计决策应以所需功能为基础。使用强类型 DataSet 的好处DataSet的另一个好处是可被继承以创建一个强类型DataSet。强类型DataSet的好处包括设计时类型检查,以及 Microsoft Visual Studio .NET 用于强类型DataSet语句结束所带来的好处。修改了DataSet的架构或关系结构后,就可以创建一个强类型DataSet,

6、把行和列作为对象的属性公开,而不是作为集合中的项公开。例如,不公开客户表中行的姓名列,而公开Customer对象的Name属性。类型化DataSet从DataSet类派生,因此不会牺牲DataSet的任何功能。也就是说,类型化DataSet仍能远程访问,并作为数据绑定控件(例如DataGrid)的数据源提供。如果架构事先不可知,仍能受益于通用DataSet的功能,但却不能受益于强类型DataSet的附加功能。处理强类型 DataSet 中的空引用使用强类型DataSet时,可以批注DataSet的 XML 架构定义语言 (XSD) 架构,以确保强类型DataSet正确处理空引用。nullVal

7、ue 批注使您可用一个指定的值 String.Empty 代替 DBNull、保留空引用或引发异常。选择哪个选项取决于应用程序的上下文。默认情况下,如果遇到空引用,就会引发异常。有关更多信息,请参阅Working with a Typed DataSet。刷新 DataSet 中的数据如果想用服务器上的更新值刷新DataSet中的值,就使用DataAdapter.Fill。如果有在DataTable上定义的主键,DataAdapter.Fill会根据主键进行新行匹配,并且当更改到现有行时应用服务器上的值。即使刷新之前修改了它们,刷新行的RowState仍被设置为Unchanged。注意,如果没

8、有为DataTable定义主键,DataAdapter.Fill就用可能重复的主键值添加新行。如果想用来自服务器的当前值刷新表,并同时保留对表中的行所做的任何更改,必须首先用DataAdapter.Fill填充表,并填充一个新的DataTable,然后用preserveChanges值true把DataTableMerge到DataSet中。在 DataSet 中搜索数据在DataSet中查询与特定条件相匹配的行时,可以利用基于索引的查找提高搜索性能。当把PrimaryKey值赋给DataTable时,会创建一个索引。当给DataTable创建DataView时,也会创建一个索引。下面是一些利

9、用基于索引进行查找的技巧。如果对组成DataTable的PrimaryKey的列进行查询,要使用DataTable.Rows.Find而不是DataTable.Select。对于涉及到非主键列的查询,可以使用DataView为数据的多个查询提高性能。当把排序顺序应用到DataView时,就会建立一个搜索时使用的索引。DataView公开Find和FindRows方法,以便查询基础DataTable中的数据。如果不需要表的排序视图,仍可以通过为DataTable创建DataView来利用基于索引的查找。注意,只有对数据执行多个查询操作时,这样才会带来好处。如果只执行单一查询,创建索引所需要的处理

10、就会降低使用索引所带来的性能提升。DataView 构造如果创建了DataView,并且修改了Sort、RowFilter或RowStateFilter属性,DataView就会为基础DataTable中的数据建立索引。创建DataView对象时,要使用DataView构造函数,它用Sort、RowFilter和RowStateFilter值作为构造函数参数(与基础DataTable一起)。结果是创建了一次索引。创建一个“空”DataView并随后设置Sort、RowFilter或RowStateFilter属性,会导致索引至少创建两次。分页ADO.NET 可以显式控制从数据源中返回什么样的数

11、据,以及在DataSet中本地缓存多少数据。对查询结果的分页没有唯一的答案,但下面有一些设计应用程序时应该考虑的技巧。避免使用带有startRecord和maxRecords值的DataAdapter.Fill重载。当以这种方式填充DataSet时,只有maxRecords参数(从startRecord参数标识的记录开始)指定的记录数量用于填充DataSet,但无论如何总是返回完整的查询。这就会引起不必要的处理,用于读取“不需要的”记录;而且为了返回附加记录,会耗尽不必要的服务器资源。用于每次只返回一页记录的技术是创建 SQL 语句,把 WHERE 子句以及 ORDER BY 子句和 TOP

12、谓词组合起来。此技术取决于存在一种可唯一标识每一行的办法。当浏览下一页记录时,修改 WHERE 子句使之包含所有唯一标识符大于当前页最后一个唯一标识符的记录。当浏览上一页记录时,修改 WHERE 子句使之返回所有唯一标识符小于当前页第一个唯一标识符的记录。两种查询都只返回记录的 TOP 页。当浏览上一页时,需要以降序为结果排序。这将有效地返回查询的最后一页(如果需要,显示之前也许要重新排序结果)。有关这个技术的一个示例,请参阅Paging Through a Query Result。另一项每次只返回一页记录的技术是创建 SQL 语句,把 TOP 谓词和嵌入式 SELECT 语句的使用结合在一

13、起。此技术并不依赖于存在一种可唯一标识每一行的办法。使用这项技术的第一步是把所需页的数量与页大小相乘。然后将结果传递给 SQL Query 的 TOP 谓词,该查询以升序排列。再把此查询嵌入到另一个查询中,后者从降序排列的嵌入式查询结果中选择 TOP 页大小。实质上,返回的是嵌入式查询的最后一页。例如,要返回查询结果的第三页(页大小是 10),应该书写如下所示的命令:SELECT TOP 10 * FROM (SELECT TOP 30 * FROM Customers ORDER BY Id ASC) AS Table1ORDER BY Id DESC注意,从查询中返回的结果页以降序显示。如

14、果需要,应该重新排序。如果数据不经常变动,可以在DataSet中本地维护一个记录缓存,以此提高性能。例如,可以在本地DataSet中存储 10 页有用的数据,并且只有当用户浏览超出缓存第一页和最后一页时,才从数据源中查询新数据。有关更多信息,请参阅.NET Data Access Architecture Guide。用架构填充 DataSet当用数据填充DataSet时,DataAdapter.Fill方法使用DataSet的现有架构,并使用从SelectCommand返回的数据填充它。如果在DataSet中没有表名与要被填充的表名相匹配,Fill方法就会创建一个表。默认情况下,Fill仅定

15、义列和列类型。通过设置DataAdapter的MissingSchemaAction属性,可以重写Fill的默认行为。例如,要让Fill创建一个表架构,并且还包括主键信息、唯一约束、列属性、是否允许为空、最大列长度、只读列和自动增量的列,就要把DataAdapter.MissingSchemaAction指定为MissingSchemaAction.AddWithKey。或者,在调用DataAdapter.Fill前,可以调用DataAdapter.FillSchema来确保当填充DataSet时架构已到位。对FillSchema的调用会产生一个到服务器的额外行程,用于检索附加架构信息。为了获得最佳性能,需要在调用Fill之前指定DataSet的架构,或者设置DataAdapter的MissingSchemaAction。使用 CommandBuilder 的最佳实践假设SelectCommand

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号