用DataView类操控数据
在操作.NET应用程序里的数据时,DataSet类被经常用到,但是开发人员常常会小看DataView类,它生来就提供了排序和过滤的功能。在使用DataSet的时候,这些操作必须要用SQL调用才能够进行。现在让我们来更进一步看看你为什么要利用DataView类。
从哪里得到它
.NET框架的类库是无法抗拒的,有时候要找到一个特定的项目需要花点功夫。DataView类位于System.Data命名空间里,所以一个DataView实例可以用下面这几行来声明:
Dim dv As System.Data.DataView ' VB.NET
System.Data.DataViewdv = null; // C#
你还可以把命名空间加到工程里,以避免输入完整的命名空间路径,就像下面这样:
Imports System.Data
Dim dv As DataView
DataSet类位于同一个命名空间里。在讨论DataView之前,现在先让我们来看看DataSet类。
对DataSet的快速之旅
在操作外部数据源的时候,DataSet类常常被用到,而数据必须被用在应用程序里。DataSet会接收数据,并供程序员使用。它提供了用来访问单个表格(以及表格里数据行)的方法和属性。
下面的VB.NET代码会用所有来自SQL服务器Northwind数据库里产品表格的数据来填充DataSet。它会在一个HTML表格里显示一部分结果。该表格会在页面被请求的时候显示出来。
Sub Page_Load()
Dim dv As System.Data.DataView
Dim ds As System.Data.DataSet
Dim da As System.Data.SqlClient.SqlDataAdapter
Dim row As System.Data.DataRow
Dim strSQL As String, connString As String
connString = "data source=dev;uid=Test;pwd=Test"
strSQL = "SELECT * FROM Northwind.dbo.products"
da = New System.Data.SqlClient.SqlDataAdapter(strSQL, connString)
ds = New System.Data.DataSet()
da.Fill(ds)
Response.Write("<table>")
For Each row In ds.Tables(0).Rows
Response.Write("<tr><td>")
Response.Write(row(0))
Response.Write("</td><td>")
Response.Write(row(1))
Response.Write("</td></tr>")
Next row
Response.Write("</table>")
End Sub
这种类型的解决方法可以用在很多情况下,但是当数据需要以某种方式被排序或者过滤的时候,问题就会出现。排序或者过滤能够通过更改SQL陈述式来轻易改变,但是这要求同数据库服务器进行更多的交互操作。而DataView类则提供了一种简单直观的方式来操作数据。
DataView来救火
更改SQL陈述式可能会变得十分乏味,甚至在一定的应用程序设计下无法实现。而DataView类利用其RowFilter方法提供了一种明了得多的方式。这个方法允许底层数据根据数据列的名称和值被过滤。下面就是其句法:
DataView.RowFilter = "[Column_Name]='value'"
值的格式由数据列的格式来确定,所以撇号(’)之间不需要数字。这要比更改SQL陈述式,让其包括一个WHERE子句并将SQL提交给数据库服务器简单得多。在提供示例代码之前,我们需要很快地回顾一下Sort方法。
DataView类的Sort方法允许底层数据在具体的数据列里轻松地被排序。数据列的名称被作为字符串值来传递,就像下面这样:
DataView.sort = "ColumnName"
这和SQL的ORDER BY子句很类似,但是它不需要数据库调用。Sort方法会迅速地给底层数据排序,使其按要求供使用。下面的示例同时使用了这两个方法操控来自Northwind数据库的数据。数据库的全部内容都被用来填充一个DataSet对象(通过Tables属性)。从这一点上讲,这个DataView对象被用RowFilter和Sort这两个方法操控了。Count方法被用来显示在应用过滤器之前和之后的记录的数量。一旦记录被过滤和排序,它们就会显示在一个HTML表格里。DataRowView对象被用来访问单独的DataView数据行(最后还会访问列)。
<script language="vb" runat="Server">
Sub Page_Load()
Dim dv As System.Data.DataView
Dim ds As System.Data.DataSet
Dim da As System.Data.SqlClient.SqlDataAdapter
Dim row As System.Data.DataRow
Dim strSQL As String, connString As String
connString = "data source=dev;uid=Test;pwd=Test"
strSQL = "SELECT ProductID, ProductName FROM Northwind.dbo.products"
da = New System.Data.SqlClient.SqlDataAdapter(strSQL, connString)
ds = New System.Data.DataSet()
da.Fill(ds)
Response.Write("<table>")
dv = New System.Data.DataView(ds.Tables(0))
Response.Write("Before Count: " & CStr(dv.Count()) & "<BR>")
dv.RowFilter = "[ProductID]=4"
dv.Sort = "ProductName"
Response.Write("After Count: " & CStr(dv.Count()) & "<BR>")
Dim x As Integer, y As Integer
Dim drv As System.Data.DataRowView
Response.Write("<table>")
For x = 0 To (dv.Count - 1)
drv = dv.Item(x)
Response.Write("<tr>")
For y = 0 To (drv.Row.ItemArray.GetLength(0) - 1)
Response.Write("<td>" + Cstr(drv.Row.Item(y)) + "</td>")
Next y
Response.Write("</tr>")
Next x
Response.Write("</table>")
End Sub
</script>
这个示例很简单,但是充分显示了DataView类所提供的灵活性。
让它为你服务
数据的过滤和排序是大多数应用程序的标准组成部分,所以使用DataView是很有利的。本期的专栏(虽然只)讲解了DataView的概念,但是你可以将它和DataGrid Web控件结合起来使用,从而让DataView类获得更加强大的应用。DataView类可以被用作DataGrid的底层数据源,因此简化了排序和过滤操作。
本文作者:Tony Patton的职业生涯开始于应用程序开发员,并已经获得了Java、VB、Lotus和XML的认证,以增加其专业知识。