一般来说,在我们从 SQL Server 等后端数据来源提取出所需的数据记录之后,会将这些数据储存于前端数据集当中的 DataTable 对象中,亦或是储存于不隶属于任何数据集之个别独立存在的 DataTable 对象中。
正如先前的文章所言,借助于 DataView,我们便能够替储存于 DataTable 中的数据建立不同的检视。比方说,通过DataView,您可以使用不同的排序顺序来检视 DataTable 中的数据,亦或是根据数据列状态或筛选表达式来筛选 DataTable 中的资料。DataView 提供的是一种动态的数据检视,也就是说,其内容、排序顺序、与成员会反应出来源 DataTable 中的任何变更。
显然在一般的正常处理流程中,是有了 DataTable 之后,才会有 DataView,问题是,我们能否将一个 DataView 转换成另外一个 DataTable 呢?答案当然是肯定的。ADO.NET 2.0 替 DataView 提供了一个全新的 ToTable 方法,使您能轻易根据 DataView 建立出一个 DataTable 对象。
ToTable 方法所建立出的 DataTable 可以内含 DataView 所有的字段或部分的字段,至于数据记录方面可以内含所有的数据记录或是非重复的数据记录,而这些作业都必须借助于不同多载版本的 ToTable 方法来完成。
以下的程序代码示范如何使用 DataView 的 ToTable 方法来建立一个 DataTable 对象,程序代码已加上完整的批注,于此不再解说,执行结果如图表 1 所示:
Option Strict On
Imports System.Data.SqlClient
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
' 利用SqlConnectionStringBuilder对象来构建连接字符串。
Dim connectStringBuilder As New SqlConnectionStringBuilder()
connectStringBuilder.DataSource = "(local)SQLEXPRESS"
connectStringBuilder.InitialCatalog = "北风贸易"
connectStringBuilder.IntegratedSecurity = True
Dim myTable As New DataTable
Using cn As New SqlConnection(connectStringBuilder.ConnectionString)
Dim cmdLimingStudio As New SqlCommand( _
"SELECT 部门, 员工编号,姓名,地址,出生日期,起薪,目前薪资,玉照FROM dbo.章立民研究室", cn)
cn.Open()
Using dr As SqlDataReader = cmdLimingStudio.ExecuteReader
' 将从「北风贸易」数据库之「章立民研究室」数据表提取所得的数据记录
' 加载至个别独立存在的MyTable 此一DataTable 对象中。
myTable.Load(dr, LoadOption.OverwriteChanges)
End Using
End Using
' 将myTable 的数据内容显示在第一个DataGridView 控件中。
Me.DataGridView1.DataSource = myTable
' 根据myTable 此一DataTable 对象建立一个DataView,并且排序与筛选数据。
Dim myDataView As DataView = myTable.DefaultView
myDataView.Sort = "部门, 姓名"
myDataView.RowFilter = "目前薪资> 40000 AND 地址LIKE '%台北市%'"
' 将myDataView 的数据内容显示在第二个DataGridView 控件中。
Me.DataGridView2.DataSource = myDataView
' 根据myDataView 建立出一个全新的DataTable 对象,
' 并且要求DataTable 对象只内含DataView 中的「姓名」、
' 「目前薪资」、「地址」与「玉照」等四个字段。此外,
' 重复的数据记录将不会内含于DataTable 对象中。
Dim myNewTable As DataTable = myDataView.ToTable("章立民研究室子集", _
True, New String() {"姓名", "目前薪资", "地址", "玉照"})
' 将myNewData 的数据内容显示在第三个DataGridView 控件中。
Me.DataGridView3.DataSource = myNewTable
End Sub
End Class
图表 1