摘要:ADO.NET 2.0 - 如何使用 DataView 巡覽關聯性
如果 DataSet 的資料表之間存在關聯性連結,則您可以使用 DataRowView 的 CreateChildView 方法,來替父資料表的資料列建立內含子資料表之資料列的 DataView。
CreateChildView 方法共提供下表所示的兩個多載版本。
CreateChildView方法的多載版本 |
CreateChildView(ByVal relation As DataRelation) As DataView |
CreateChildView(ByVal relationName As String) As DataView |
第一個版本的 CreateChildView 方法會使用指定的 DataRelation 物件來替父資料表的資料列建立內含子資料表之資料列的 DataView。第二個版本的 CreateChildView 方法會使用指定的 DataRelation 名稱來替父資料表的資料列建立內含子資料表之資料列的 DataView。
上圖所示的程式範例示範如何利用 DataRowView 的 CreateChildView 方法,來顯示出「學生」與「成績」兩關聯資料表中,每一位學生的成績資料。相關程式碼撰寫於「檢視每一位學生的成績資料」按鈕的 Click 事件處理常式中,列示如下:
Private Sub btnViewRelatedRows_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnViewRelatedRows.Click
' 利用 SqlConnectionStringBuilder 物件來構建連接字串。
Dim sqlStringBuilder As New SqlConnectionStringBuilder()
sqlStringBuilder.DataSource = "(local)SQLEXPRESS"
sqlStringBuilder.InitialCatalog = "北風貿易"
sqlStringBuilder.IntegratedSecurity = True
' 建立一個資料集。
Dim ds As New DataSet()
Try
Using northwindConnection As New _
SqlConnection(sqlStringBuilder.ConnectionString)
Dim cmdLiming As New SqlCommand( _
"SELECT * FROM 學生;SELECT * FROM 成績;", northwindConnection)
northwindConnection.Open()
Using drLiming As SqlDataReader = cmdLiming.ExecuteReader()
ds.Load( _
drLiming, _
LoadOption.OverwriteChanges, _
New String() {"學生", "成績"})
End Using
End Using
Catch exc As Exception
MessageBox.Show( _
"要能夠順利執行本範例程式,您的電腦必須已安裝SQL Server " & _
"Express,並且必須已附加了本書所附的「北風貿易」資料庫。" & _
"關於如何安裝SQL Server Express,請參閱附錄或相關文件說明。")
Exit Sub
End Try
Dim StudentTable As DataTable = ds.Tables("學生")
Dim ScoreTable As DataTable = ds.Tables("成績")
' 在「學生」與「成績」資料表之間建立一個關聯性連結
Dim SchoolRel As DataRelation = _
ds.Relations.Add("SchoolRel", _
StudentTable.Columns("身份證字號"), _
ScoreTable.Columns("身份證字號"))
' 替「學生」與「成績」資料表分別建立一個 DataView
Dim StudentView As DataView = New DataView( _
StudentTable, "", "學生姓名", DataViewRowState.CurrentRows)
Dim ScoreView As DataView
' 接下來要循序處理內含學生資料的 DataView
Dim StudentDRV, ScoreDRV As DataRowView
Dim sb As New StringBuilder
For Each StudentDRV In StudentView
sb.AppendLine(StudentDRV("學生姓名").ToString)
' 替子資料表(也就是「成績」資料表)建立一個 DataView
ScoreView = StudentDRV.CreateChildView(SchoolRel)
ScoreView.Sort = "期中期末"
sb.AppendLine(vbTab & "期中期末" & _
vbTab & "國文成績" & _
vbTab & "英文成績" & _
vbTab & "數學成績" & _
vbTab & "物理成績" & _
vbTab & "化學成績")
For Each ScoreDRV In ScoreView
sb.AppendLine(vbTab & _
IIf(CType(ScoreDRV("期中期末"), Integer) = 1, _
"期中考", "期末考").ToString & _
vbTab & ScoreDRV("國文成績").ToString & _
vbTab & ScoreDRV("英文成績").ToString & _
vbTab & ScoreDRV("數學成績").ToString & _
vbTab & ScoreDRV("物理成績").ToString & _
vbTab & ScoreDRV("化學成績").ToString)
Next
Next
txtInfo.Text = sb.ToString
End Sub