当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  掌握ADO.NET的十个热门技巧 4

 掌握ADO.NET的十个热门技巧 4

点击次数:28 次 发布日期:2008-11-26 10:38:27 作者:源代码网
源代码网推荐      8. 用一个派生的类和自定义的串行化来节省空间
源代码网推荐  
源代码网推荐    只有两个ADO.NET对象是被标记为可串行化的——DataTable和DataSet。.net Framework中的串行化是通过formatter对象来完成的,它们可以将一个对象实例保存到一个二进制或一个SOAP流(stream)中。.NET formatter用Reflection来提取任何必要的信息。然而,如果这个类实现了ISerializable接口,那么.NET formatter就会给接口的方法让步,让它们负责拷贝需要串行化到一个内存缓冲器中的所有的信息。DataTable和DataSet类都通过 ISerializable接口支持串行化。
源代码网推荐  
源代码网推荐    如果你将一个DataTable或一个DataSet串行到一个二进制(binary stream)中,你应该可以得到非常紧凑的输出结果。虽然你得到的结果文件是最小的,但遗憾的是,它实际上并不小。荒谬的是,你保存到一个二进制的DataSet比你用WriteXML方法保存到XML的同样的DataSet要大很多。
源代码网推荐  
源代码网推荐    要解释这种情况,我们需要来看看ADO.NET对象是用什么方式被串行起来的。在串行一个DataSet对象时,它将基于XML的 DiffGram表示法保存在formatter的缓冲器中。在串行一个DataTable时,它首先创建了一个临时的DataSet对象,将它定义为它的parent,然后作为一个DiffGram串行起来。
源代码网推荐  
源代码网推荐    一个DiffGram是一个XML流,它提供了一个DataSet中表和行的有状态的表示法。一个DiffGram文件是很详细的,有些冗长。DiffGram包含当前的数据,以及被修改的行和未解决的错误的初始值。当我们保存一个DataSet或一个DataTable时,所有这些信息就会被传递给serializer。被串行化的对象总是包含XML数据,因此即使当输出流是二进制的时,最后的输出结果仍然会很大。
源代码网推荐  
源代码网推荐    你可以创建一个继承DataTable 或DataSet的新的可串行化的类来解决这个问题,并且更有效地保存ADO.NET对象。你必须用<Serizlizable()>属性来标记新类,即使父类是可以串行化的。实际上,串行性(serizlizability)并不是一个可以自动继承的类属性。你从DataTable或DataSet构建的新类也可以实现ISerializable接口。当然,你可以为新类选择一个不同的串行化方案。一个简单而有效的方法就是将DataTable类的所有成员映射到数组和值成员中(见列表1)。
源代码网推荐  
源代码网推荐    运用一个派生的类和一个自定义的串行化方案可以为一个DataSet对象节省多达80%的磁盘空间。节省的空间的比率取决于DataSet中的数据类型。你的数据越基于文本,节省的空间越多。然而,运用二进制的BLOB字段只可以节省大约25%的空间(下载一个完整的例子)。
源代码网推荐  
源代码网推荐    9. 选择一个适合你的数据的分页机制
源代码网推荐  
源代码网推荐    DataGrid服务器控件使我们可以更容易地在Web应用程序中以长度可变的页面来显示数据了。该控件有绑定和格式化功能,它可以接受一个ADO.NET数据对象并为浏览器生成HTML代码。出于性能的原因,在页面的视图状态,DataGrid并没有缓存数据源的内容。因此,当返回页面时,你就必须填充grid。要实现这一点可以用两种方法:在Web服务器上将数据源作为整体或一部分缓存起来,然后读回;或者对每个请求从物理数据库加载所需的记录。如果你选择第一种方法,那么数据就从存储中只被读取一次,保存在一个缓存中,并为以后的postback事件读回。我们通常用内存中的全局对象(如Session或Cache)来保存这个数据。我们用DataSet来搜集所有需要的数据并将它保存在内存中。将一个DataSet对象保存在Session中同ADO中的线程含义并不一样,但是通过减少Web服务器可用的内存仍可以影响可扩展性。
源代码网推荐  
源代码网推荐    如果要显示的数据是特定于session的,那么在每次返回页面时加载记录页面就比用一个DataSet和ASP.NET全局对象来缓存数据要好。编写得很好的SQL代码可以将结果集分成许多页,再加上DataGrid控件内置的自定义分页机制,我们就可以得到最佳的解决方案来保持ASP.NET应用程序的可扩展性和良好的性能了。
源代码网推荐  
源代码网推荐    对于Windows应用程序,我的建议正好相反。台式应用程序很适合应用断开的编程模式(DataSet和其它ADO.NET对象使这种模式变得更简单了)。当然,这并不意味着,你可以在客户端无忧无虑地下载成千上万的记录。尽管你可以将ADO.NET对象用于任何种类的.NET应用程序,但如何使用它们是随具体情况的不同而不同的。
源代码网推荐  
源代码网推荐    10. 访问多个结果集
源代码网推荐  
源代码网推荐    根据查询的语法,你可以返回多个结果集。缺省情况下,data reader是位于第一个结果集上的。你可以用Read方法在当前结果集中滚动查看记录。在找到最后一个记录时,Read方法返回false,不再继续读取。你应该用NextResult方法转移到下一个结果集。如果没有更多的需要读的结果集了,那么该方法返回false。下面的代码说明了如何在所有返回的结果集中访问所有的记录:
源代码网推荐  Dim reader As SqlDataReader
源代码网推荐  cmd.Connection.Open()
源代码网推荐  reader = cmd.ExecuteReader()
源代码网推荐  Do
源代码网推荐  " Move through the first resultset
源代码网推荐  While reader.Read()
源代码网推荐  " Access the row
源代码网推荐  End While
源代码网推荐  Loop While reader.NextResult()
源代码网推荐  reader.Close()
源代码网推荐  cmd.Connection.Close()
源代码网推荐  
源代码网推荐    当你读一个行的内容时,可以通过索引或名称来识别列。运用索引可以更快,因为提供者可以直接进入到缓冲器中。如果你指定列名,提供者就用GetOrdinal方法将名称转换成相应的索引,然后执行基于索引的访问。注意,对于SQL Server data reader来说,所有的GetXXX方法实际上都调用了相应的GetSqlXXX方法。对于Oracle data reader来说,情况是类似的,本地数据总是被写进.NET Framework类型中。OracleDataReader类为它自己的内部类型提供了一组私有的GetXXX方法。这些方法包括 GetOracleBFile、GetOracleBinary和GetOracleDateTime等。相反,OLE DB和ODBC readers只有单独的一组get方法。  做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华