ADO.NET 2.0 - 如何将 DataView 转换成一个 DataTable
一般来说,在我们从 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