zoukankan      html  css  js  c++  java
  • 用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的认证,以增加其专业知识。

  • 相关阅读:
    Tensorflow基础教程11:常用模块 tf.data :数据集的构建与预处理
    Tensorflow基础教程10:常用模块 TensorBoard:训练过程可视化
    Tensorflow基础教程9:常用模块 tf.train.Checkpoint 之变量的保存与恢复
    Tensorflow基础教程8:自定义层、损失函数和评估指标
    OC原理之多线程中的锁(一)
    OC原理之多线程(二)
    OC原理之多线程(一)
    OC原理之RunLoop的运行逻辑
    OC原理RunLoop(一)
    前端模块化:CommonJS,AMD,CMD,ES6
  • 原文地址:https://www.cnblogs.com/silva/p/179581.html
Copyright © 2011-2022 走看看