摘要: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