ADO.NET 2.0 - 如何使用 DataView 巡覽關聯性

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