---他山之石,可以攻玉。
http://editblog.csdn.net/msdncolumn/archive/2005/02/25/1657.aspx
使用 DataReader 来提高速度并减少内存使用
作者:Rick Dobson
相关技术:ADO.NET、C#、数据库开发
难度:★★★☆☆
读者类型:.NET开发人员、数据库开发人员
[导读]谈及数据库连接时,.NET的拥护者会力推数据适配器和数据集所提供的离线访问的优势。每每在这个时候,DataReader就会被这二者的光芒所掩盖。但是,正如Rick Dobson在此处演示的那样,DataReader绝非常物—它们提供对数据源的只进、只读连线访问,而且它们不支持数据操作。那么,为什么还要使用如此束缚人的东西呢?答案是“性能”,对于入门者来说,使用DataReader要快很多;另一个好处是占用的内存较少—DataReader可让您在获得数据的同时就对它进行处理,每次一行。所以,DataReader特别适用于处理过于庞大以致于无法加载到内存中的数据。
为了从DataReader获得最大的利益,您需要了解它的功能和限制。由于DataReader具有定义完善的限定,您还可以了解一下如何利用其他.NET实体(例如“数组”)来补充DataReader的功能,并从中获益。本文通过在三个范畴中各自的一些示例应用程序来回顾DataReader的功能。首先,我将展示生成、填充并配置DataReader以便用于Windows窗体控件的有效代码模式;第二,对示例突出说明了如何使用类型化数据来计算表达式,这将反映DataReader中列的数据类型的特性;最后,我将比较通过DataReader来检索分层数据的两种技术,来为本文划上句号。
从DataReader到列表框
您可以用指向数据源的DataReader来轻松地填充列表框。本部分的示例通常也应用于组合框控件。您应首先为Command对象创建DataReader并调用ExecuteReader方法,该方法通常是内建的。ExecuteReader方法可以接受CommandBehavior枚举来自定义Command的行为以及它所关联的DataReader。本部分中的两个示例突出了DataReader及其Command对象之间的相互作用,并提供了有关窗体和控件管理的其他有趣的应用程序的详细信息。请参阅HCVSDataReaders项目(源代码中的HVSO4-07Dobon.exe),以访问每个示例的所有代码。
显示原始的DataReader数据
HCVSDataReaders项目中的第一个DataReader示例是在Form1上Button1的Click事件中,ADONETObjects类中的两个方法和Form1后面的DataReaderForTable函数过程也在该事件中。为方便起见,ADONETObjects类驻留在HCVSDataReaders项目中。图1显示单击Populate from DataReader按钮后的窗体。按钮的Click事件过程用从SQL Server Northwind数据库中的Employees表选定的列值来填充列表框。
图1
SqlDataReader类有很多特殊方法,用于从各种专用的.NET和SQL Server数据格式中获取数据。不过,对于简单的应用程序来说,您无须考虑它们。所有DataReader都需要做的事情是,接受从任何非字符串数据类型到字符串的默认转换,然后将一个经过计算的字符串表达式添加到列表框。这就是下面的代码所要做的事情,它来自Button1_Click过程。一个While循环逐行读取,每次创建一个包含四个对drd1 DataReader的引用的str2表达式。这些引用中有两个是数字实例。值甚至可以为空(如2号雇员的ReportsTo列值)。不过,对每一行来说,该表达式都是成功的。您可以按名称或基于零的索引来指定列。
Do While drd1.Read
Dim str2 As String = _
"Employee " & drd1("EmployeeID") & _
", " & drd1("FirstName") & _
" " & drd1("LastName") & _
" reports to: " & drd1("ReportsTo")
ListBox1.Items.Add(str2)
Loop
第一个示例中最有趣的部分可能是如何先创建drd1 DataReader。Button1的Click事件过程将drd1创建为一个SqlDataReader类,并将我创建的名为ataReaderForTable的函数的返回值指定给它。它传递Employees表的名称—DataReaderForTable为其开发了一个DataReader。
Dim drd1 As SqlClient.SqlDataReader = _
DataReaderForTable("Employees")
DataReaderForTable过程创建DataReader的步骤有三个。
Dim drd1 As SqlClient.SqlDataReader
Dim ADOObjs As New ADONETObjects
'Specify connection object
Dim cnn1 As SqlClient.SqlConnection = _
ADOObjs.MakeNorthwindConnection
'Specify a command object
Dim str1 As String = _
"SELECT * FROM