国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

在 ADO.NET 數(shù)據(jù)集中瀏覽多個相關(guān)表

2019-11-17 04:58:45
字體:
供稿:網(wǎng)友
摘要:ADO.NET 中的數(shù)據(jù)集是一種在內(nèi)存中表示數(shù)據(jù)的方法,它可以包含多個相關(guān)的數(shù)據(jù)表。本文介紹了在數(shù)據(jù)集中瀏覽這些相關(guān)數(shù)據(jù)表的方法。您將在 Visual Basic? .NET 或 Visual C#? .NET 中創(chuàng)建一個 Windows? 應(yīng)用程序,基于選定的記錄返回相關(guān)記錄,并使用表達(dá)式列為相關(guān)記錄生成合計信息。本文包含一些指向英文站點的鏈接。

簡介

由于數(shù)據(jù)集可以包含幾個相關(guān)的表,因此了解如何在父記錄和子記錄之間進(jìn)行瀏覽是一項基本任務(wù),而這并非顯而易見,非凡是當(dāng)您試圖訪問相關(guān)層次結(jié)構(gòu)中的深層表中的數(shù)據(jù)時,更是如此。您還將學(xué)習(xí)如何瀏覽包含具有多對多關(guān)系的表的數(shù)據(jù)集,其中每個表都通過第三方表(中間表)彼此相關(guān)聯(lián)。以下是本文所包含任務(wù)的概述:
  1. 創(chuàng)建 Windows 應(yīng)用程序項目。
  2. 顯示用作初始選定內(nèi)容的數(shù)據(jù)列表。
  3. 返回與選定記錄相關(guān)的記錄。
  4. 瀏覽多個表和多個相關(guān)結(jié)構(gòu),并在運行時直接訪問數(shù)據(jù)集中的數(shù)據(jù)。
此外,本文還介紹一些相關(guān)的任務(wù):
  1. 為數(shù)據(jù)表添加基于相關(guān)數(shù)據(jù)的表達(dá)式列。
  2. 生成相關(guān)數(shù)據(jù)的合計信息。
前提條件要充分理解本文,您應(yīng)該具有:
  • 基本的關(guān)系數(shù)據(jù)庫概念的知識。
  • 與羅斯文示例數(shù)據(jù)庫的有效連接,以便您能夠創(chuàng)建和運行應(yīng)用程序。
  • 大體上熟悉 ADO.NET 數(shù)據(jù)集。
重要的數(shù)據(jù)對象要使用數(shù)據(jù)集中的相關(guān)記錄,您應(yīng)基本了解 .NET 框架 System.Data 命名空間中的幾個對象以及它們?nèi)绾蜗嗷プ饔谩_@些對象協(xié)同工作以提供數(shù)據(jù)集中的導(dǎo)航功能。 以下對象用于表達(dá)數(shù)據(jù)集中的關(guān)系:
  • DataSet - 在內(nèi)存中表示數(shù)據(jù),可以包含多個可與 DataRelation 對象相關(guān)的 DataTable 對象。
  • DataTable - 表示一個完整的數(shù)據(jù)表。數(shù)據(jù)表的架構(gòu)是由構(gòu)成該表的 DataColumnCollection 定義的。當(dāng)兩個數(shù)據(jù)表相關(guān)時,DataRelation 對象使用每個表中的 DataColumn 來關(guān)聯(lián)數(shù)據(jù)。
  • DataRelation - 連接多個表,以便瀏覽相關(guān)表中的記錄。訪問相關(guān)記錄時,DataRelation 對象被傳遞給 GetChildRows 或 GetParentRow 方法。DataRelation 對象確定所要查詢的相關(guān)表,以便返回與 GetChildRows 或 GetParentRow 方法調(diào)用相關(guān)聯(lián)的相關(guān)數(shù)據(jù)。
  • DataRow - 表示數(shù)據(jù)的一個單獨的記錄。用于返回相關(guān)數(shù)據(jù)的 GetChildRows 方法和 GetParentRow 方法是 DataRow 對象的成員。
  • DataColumn - 表示一個單獨的字段,結(jié)合在一起時將定義 DataTable 的架構(gòu)。當(dāng)兩個數(shù)據(jù)表相關(guān)時,DataRelation 對象使用每個表中的數(shù)據(jù)列來關(guān)聯(lián)數(shù)據(jù)。
創(chuàng)建應(yīng)用程序本節(jié)將建立這一演練的起點。隨后的步驟將創(chuàng)建數(shù)據(jù)連接、數(shù)據(jù)適配器和包含相關(guān)表的數(shù)據(jù)集,以及幾個選擇和顯示數(shù)據(jù)的控件。創(chuàng)建新的 Windows 應(yīng)用程序
  1. 從 File(文件)菜單中,指向 New(新建),并選擇 PRoject(項目)。將顯示 New Project(新建項目)對話框。
  2. 在 Project Types(項目類型)窗格中,根據(jù)您需要的編程語言,選擇 Visual Basic Projects(Visual Basic 項目)或 Visual C# Projects(Visual C# 項目)。
  3. 在 Templates(模板)窗格中,選擇 Windows application(Windows 應(yīng)用程序),并將其命名為 DataRelationExample,然后單擊 OK(確定)。 DataRelationExample 項目將添加到 Solution EXPlorer(解決方案資源治理器)中。
連接到數(shù)據(jù)庫此連接答應(yīng)您與 Visual Studio? 集成開發(fā)環(huán)境 (IDE) 中的數(shù)據(jù)源進(jìn)行通訊。連接到 Server Explorer(服務(wù)器資源治理器)中的羅斯文示例數(shù)據(jù)庫
  1. 在 Server Explorer(服務(wù)器資源治理器)中,建立連接到羅斯文示例數(shù)據(jù)庫的數(shù)據(jù)連接。
  2. 在 Server Explorer(服務(wù)器資源治理器)中展開羅斯文數(shù)據(jù)連接,直到可以看到所有的表。
創(chuàng)建數(shù)據(jù)適配器和連接
此步驟創(chuàng)建用于在應(yīng)用程序和數(shù)據(jù)源之間連接和交換數(shù)據(jù)的連接和數(shù)據(jù)適配器。創(chuàng)建數(shù)據(jù)適配器和連接
  1. 將"客戶"表從 Server Explorer(服務(wù)器資源治理器)中拖到窗體上。組件欄中將顯示連接和數(shù)據(jù)適配器。
  2. 選擇 Connection(連接)并將 Name 屬性設(shè)置為 dcNorthwind。
  3. 選擇數(shù)據(jù)適配器并將 Name 屬性設(shè)置為 daCustomers。
  4. 將"訂單"表從 Server Explorer(服務(wù)器資源治理器)中拖到窗體上。組件欄中將顯示第二個數(shù)據(jù)適配器。
  5. 選擇新的數(shù)據(jù)適配器并將 Name 屬性設(shè)置為 daOrders。
生成數(shù)據(jù)集使用剛剛添加到窗體上的數(shù)據(jù)適配器生成包含客戶表和訂單表的數(shù)據(jù)集。生成將包含相關(guān)數(shù)據(jù)表的數(shù)據(jù)集
  1. 從 Data(數(shù)據(jù))菜單中,選擇 Generate Dataset(生成數(shù)據(jù)集)。將顯示 Generate Dataset(生成數(shù)據(jù)集)對話框。 提示:將光標(biāo)移到窗體上即可使用 Data(數(shù)據(jù))菜單。
  2. 單擊 New(新建)并將數(shù)據(jù)集命名為 dsNorthwind。
  3. 選擇客戶表和訂單表。
  4. 選擇 Add this dataset to the designer(將此數(shù)據(jù)集添加到設(shè)計器)復(fù)選框,然后單擊 OK(確定)。 Solution Explorer(解決方案資源治理器)的項目中將添加一個名為 dsNorthwind.xsd 的文件,并且組件欄中將顯示該數(shù)據(jù)集的一個實例。
創(chuàng)建關(guān)系生成數(shù)據(jù)集并不能自動創(chuàng)建數(shù)據(jù)集中各表之間的關(guān)系。關(guān)系可以通過編程創(chuàng)建,也可以使用 xml Designer(XML 設(shè)計器)直觀地創(chuàng)建。本文使用 XML Designer(XML 設(shè)計器)。創(chuàng)建客戶表和訂單表之間的關(guān)系
  1. 在 Solution Explorer(解決方案資源治理器)中,雙擊 dsNorthwind.xsd 文件。文件將在 XML Designer(XML 設(shè)計器)中打開。
  2. 從工具欄的 XML Schema(XML 架構(gòu))選項卡中,將 Relation(關(guān)系)拖到訂單表上。
  3. 在 Edit Relation(編輯關(guān)系)對話框中,設(shè)置以下屬性:

    元素 設(shè)置 Name CustomersOrders Parent Customers Child Orders Key Fields CustomerID Foreign Key Fields CustomerID
  4. 單擊 OK(確定)以創(chuàng)建關(guān)系并關(guān)閉對話框。
  5. 從 File(文件)菜單中,選擇 Save All(全部保存)以保存該項目。
顯示數(shù)據(jù)此應(yīng)用程序使用組合框、列表框和 RTF 文本框來選擇和顯示數(shù)據(jù)。添加選擇和顯示數(shù)據(jù)的控件
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1(.cs 或 .vb,取決于應(yīng)用程序的語言),然后從快捷菜單中選擇 View Designer(視圖設(shè)計器)。
  2. 在窗體的左半部,添加一個 ListBox 控件,并將其 Name 屬性設(shè)置為 lbOrders。
  3. 在窗體的右半部,添加一個 RichTextBox 控件,并將其 Name 屬性設(shè)置為 rtbDetails。
  4. 在列表框的上方,添加一個 ComboBox 控件,并將其 Name 屬性設(shè)置為 cbCustomers。
  5. 保存項目。
現(xiàn)在,可以開始向應(yīng)用程序添加功能了。設(shè)置顯示公司名稱的組合框
  • 選擇組合框 (cbCustomers) 并設(shè)置以下屬性: 屬性 設(shè)置 DataSource DsNorthwind1 DisplayMember Customers.CompanyName ValueMember Customers.CustomerID
用數(shù)據(jù)填充表
要用數(shù)據(jù)填充表,必須為應(yīng)用程序添加代碼。在數(shù)據(jù)集 (dsNorthwind1) 中的客戶表和訂單表中填充數(shù)據(jù)
  1. 雙擊窗體上的一塊空白區(qū)域,為 Form1_Load 事件創(chuàng)建事件處理程序。
  2. 添加以下代碼:

    ' Visual Basic
    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
    ' 關(guān)閉數(shù)據(jù)集中的約束。
    DsNorthwind1.EnforceConstraints = False ' 用數(shù)據(jù)填充表。
    daOrders.Fill(DsNorthwind1)
    daCustomers.Fill(DsNorthwind1) ' 重新開啟約束。
    DsNorthwind1.EnforceConstraints = True
    End Sub // C#
    private void Form1_Load(object sender, System.EventArgs e)
    {
    // 關(guān)閉數(shù)據(jù)集中的約束。
    dsNorthwind1.EnforceConstraints = false; // 用數(shù)據(jù)填充表。
    daOrders.Fill(dsNorthwind1);
    daCustomers.Fill(dsNorthwind1); // 重新開啟約束。
    dsNorthwind1.EnforceConstraints = true;
    }
  3. 保存項目。
  4. 按 F5 鍵運行該應(yīng)用程序。現(xiàn)在組合框中包含一個公司名稱列表。
  5. 關(guān)閉窗體。
在兩個表中瀏覽相關(guān)記錄這里簡要介紹一下如何在數(shù)據(jù)集中構(gòu)成一對多關(guān)系的兩個表之間訪問數(shù)據(jù)。在選擇一個數(shù)據(jù)行之后,可以通過調(diào)用 GetChildRows 或 GetParentRow 方法并向該數(shù)據(jù)行傳遞適當(dāng)?shù)臄?shù)據(jù)關(guān)系來返回其相關(guān)記錄。 注重:GetChildRows 方法將以 DataRow 對象數(shù)組的形式返回數(shù)據(jù),而 GetParentRow 方法只返回一個單個的數(shù)據(jù)行。 要演示這一功能,需要給應(yīng)用程序添加一些代碼,以返回組合框中選定客戶的所有訂單(子行)。更改組合框中的選定客戶會引發(fā) ComboBox.SelectedIndexChanged 事件,列表框中將填充該選定客戶的每個訂單的訂單 ID。 您可以根據(jù)組合框中選定的客戶,調(diào)用 GetChildRows 方法。訂單表中的所有相關(guān)記錄都將分配給名為 draOrders 的數(shù)據(jù)行數(shù)組。 注重:下一節(jié)將添加在列表框中顯示相關(guān)訂單列表的功能。為確認(rèn)數(shù)組中確實包含相關(guān)的記錄,數(shù)組的長度(即選定客戶的訂單總數(shù))將顯示為窗體的標(biāo)題。 創(chuàng)建獲取選定客戶的訂單的事件處理程序
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Designer(視圖設(shè)計器)。
  2. 雙擊組合框為 SelectedIndexChanged 事件創(chuàng)建事件處理程序。
  3. 添加以下代碼:

    ' Visual Basic
    Private Sub cbCustomers_SelectedIndexChanged _
    (ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles cbCustomers.SelectedIndexChanged
    ' 聲明一個用來保存選定客戶的客戶 ID 的字符串。
    Dim SelectedCustomerID As String
    SelectedCustomerID = cbCustomers.SelectedValue.ToString()
    ' 聲明一個用來保存選定客戶的記錄的數(shù)據(jù)行。
    Dim drSelectedCustomer As DataRow
    drSelectedCustomer = _
    DsNorthwind1.Customers.FindByCustomerID _
    (SelectedCustomerID)
    ' 聲明一個用來保存相關(guān)記錄的數(shù)據(jù)行數(shù)組。
    Dim draOrders As DataRow()
    draOrders = drSelectedCustomer.GetChildRows("CustomersOrders")
    ' 在窗體標(biāo)題中顯示數(shù)組的長度(訂單數(shù))
    ' 和客戶 ID。
    Me.Text = draOrders.Length.ToString() & " 訂單所有者 " & _
    SelectedCustomerID
    End Sub // C#
    private void cbCustomers_SelectedIndexChanged
    (object sender, System.EventArgs e)
    {
    // 聲明一個用來保存選定客戶的客戶 ID 的字符串。
    String SelectedCustomerID;
    SelectedCustomerID = cbCustomers.SelectedValue.ToString(); // 聲明一個用來保存選定客戶的記錄的數(shù)據(jù)行。
    DataRow drSelectedCustomer;
    drSelectedCustomer =
    dsNorthwind1.Customers.FindByCustomerID(SelectedCustomerID); // 聲明一個用來保存相關(guān)記錄的數(shù)據(jù)行數(shù)組。
    DataRow[] draOrders;
    draOrders = drSelectedCustomer.GetChildRows("CustomersOrders"); // 在窗體標(biāo)題中顯示數(shù)組的長度(訂單數(shù))
    // 和客戶 ID。
    this.Text = draOrders.Length.ToString() +
    " 訂單所有者 " + SelectedCustomerID;
    }
  4. 保存項目。
  5. 運行應(yīng)用程序。 選擇另一個客戶,并檢查窗體標(biāo)題。將顯示選定客戶的訂單總數(shù)及其客戶 ID。
  6. 關(guān)閉窗體。
顯示相關(guān)記錄 現(xiàn)在您已經(jīng)有了選定客戶的相關(guān)記錄(存儲在數(shù)據(jù)行數(shù)組中),您可以顯示它們以便與用戶進(jìn)行交互。應(yīng)用程序?qū)⒅鹨辉L問 GetChildRows 方法返回的數(shù)據(jù)行數(shù)組中的數(shù)據(jù),并將每個相關(guān)記錄的"訂單 ID"作為單獨的項添加到列表框中。 注重:雖然此示例將逐一訪問相關(guān)數(shù)據(jù)行數(shù)組中的數(shù)據(jù),但列表框可能已經(jīng)使用屬性窗口,通過 DataSource 屬性、DataMember 屬性和 ValueMember 屬性被綁定到相關(guān)的記錄。 在列表框中顯示相關(guān)記錄
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Code(查看代碼)。
  2. 在前面步驟中創(chuàng)建的組合框的 SelectedIndexChanged 事件處理程序中,將以下代碼添加到處理程序中已有代碼之下:

    ' Visual Basic
    ' 當(dāng)更改選定客戶時,清除訂單列表。
    lbOrders.Items.Clear()
    rtbDetails.Text = "" ' 將每個相關(guān)訂單的訂單 ID 添加到列表框中。
    Dim drOrder As DataRow
    For Each drOrder In draOrders
    lbOrders.Items.Add(drOrder("OrderID"))
    Next // C#
    // 當(dāng)更改選定客戶時,清除訂單列表。
    lbOrders.Items.Clear();
    rtbDetails.Text = "";
    // 將每個相關(guān)訂單的訂單 ID 添加到列表框中。
    foreach(DataRow drOrder in draOrders)
    {
    lbOrders.Items.Add(drOrder["OrderID"]);
    }

  3. 保存項目。
  4. 運行應(yīng)用程序。 列表框中將顯示訂單列表。在組合框中選擇另一個客戶,訂單列表將被更新。
  5. 關(guān)閉窗體。
在三個或更多表中瀏覽相關(guān)記錄 瀏覽三個或更多表與處理兩個表一樣簡單。要了解如何處理兩個以上的表,請將訂單明細(xì)表和產(chǎn)品表添加到 dsNorthwind 數(shù)據(jù)集中。在列表框中選定一個訂單后,該訂單的具體信息即顯示在 RTF 文本框中。 為了滿足約束規(guī)則,您需要刪除現(xiàn)有的數(shù)據(jù)關(guān)系,將來再重新創(chuàng)建。 暫時刪除 dsNorthwind 數(shù)據(jù)集中的 DataRelation
  1. 在 Solution Explorer(解決方案資源治理器)中,雙擊 dsNorthwind.xsd 以在 XML Designer(XML 設(shè)計器)中打開它。
  2. 選擇現(xiàn)有的 CustomersOrders 關(guān)系并將其刪除。
  3. 保存項目。
現(xiàn)在您需要將另外兩個表添加到現(xiàn)有數(shù)據(jù)集中,并創(chuàng)建新的 DataRelation 對象以將所有表連在一起。 將訂單明細(xì)表和產(chǎn)品表添加到 dsNorthwind 數(shù)據(jù)集中
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Designer(視圖設(shè)計器)。
  2. 將"訂單明細(xì)"表從 Server Explorer(服務(wù)器資源治理器)中拖到窗體上。組件欄中將顯示一個新的數(shù)據(jù)適配器。
  3. 選擇該新的數(shù)據(jù)適配器并將其 Name 屬性設(shè)置為 daOrderDetails。
  4. 將"產(chǎn)品"表從 Server Explorer(服務(wù)器資源治理器)中拖到窗體上。組件欄中將顯示一個新的數(shù)據(jù)適配器。
  5. 選擇該新的數(shù)據(jù)適配器并將其 Name 屬性設(shè)置為 daProdUCts。
新表只是被添加到了窗體上,因此每次添加額外的表時,都必須重新生成數(shù)據(jù)集。 重新生成 dsNorthwind 數(shù)據(jù)集
  1. 從 Data(數(shù)據(jù))菜單中,選擇 Generate Dataset(生成數(shù)據(jù)集)。 提示:將光標(biāo)移到窗體上即可使用 Data(數(shù)據(jù))菜單。
  2. 單擊 Existing(現(xiàn)有),然后選擇 dsNorthwind 數(shù)據(jù)集。
  3. 選擇所有四個表(客戶表、訂單表、訂單明細(xì)表和產(chǎn)品表)。
  4. 清除 Add this dataset to the designer(將此數(shù)據(jù)集添加到設(shè)計器)復(fù)選框,然后單擊 OK(確定)。將生成帶有附加表的數(shù)據(jù)集。 注重:假如出現(xiàn)一個對話框,其中說明"The file has been modified outside of the source editor. Do you want to reload it?"(文件已在源編輯器之外被修改。是否要重新加載?),請單擊 Yes(是)。
請記住,生成數(shù)據(jù)集并不能自動創(chuàng)建數(shù)據(jù)集中各表之間的關(guān)系。 創(chuàng)建關(guān)系
  1. 在 Solution Explorer(解決方案資源治理器)中,雙擊 dsNorthwind.xsd 文件。文件將在 XML Designer(XML 設(shè)計器)中打開。
  2. 從工具欄的 XML Schema(XML 架構(gòu))選項卡中,將 Relation(關(guān)系)拖到訂單表上。
  3. 在 Edit Relation(編輯關(guān)系)對話框中,設(shè)置以下屬性:

    元素 設(shè)置 Name CustomersOrders Parent Customers Child Orders Key Fields CustomerID Foreign Key Fields CustomerID
  4. 單擊 OK(確定)以創(chuàng)建關(guān)系并關(guān)閉對話框。
  5. 從工具欄的 XML Schema(XML 架構(gòu))選項卡中,將 Relation(關(guān)系)拖到訂單明細(xì)表上。
  6. 在 Edit Relation(編輯關(guān)系)對話框中,設(shè)置以下屬性:

    元素 設(shè)置 Name OrdersOrderDetails Parent Orders Child OrderDetails Key Fields OrderID Foreign Key Fields OrderID
  7. 單擊 OK(確定)以創(chuàng)建關(guān)系并關(guān)閉對話框。
  8. 從工具欄的 XML Schema(XML 架構(gòu))選項卡中,將 Relation(關(guān)系)拖到訂單明細(xì)表上。
  9. 在 Edit Relation(編輯關(guān)系)對話框中,設(shè)置以下屬性:

    元素 設(shè)置 Name ProductsOrderDetails Parent Products Child OrderDetails Key Fields ProductID Foreign Key Fields ProductID
  10. 單擊 OK(確定)以創(chuàng)建關(guān)系并關(guān)閉對話框。
  11. 保存項目。

訂單明細(xì)表和產(chǎn)品表已被添加到數(shù)據(jù)集中,但是您仍需要添加代碼,以便在運行時用數(shù)據(jù)來填充它們。 用數(shù)據(jù)填充表
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Code(查看代碼)。
  2. 在 Form1_Load 事件處理程序中,將以下代碼添加到注釋"用數(shù)據(jù)填充表"與 daOrders.Fill(dsNorthwind1) 行之間:

    ' Visual Basic
    daOrderDetails.Fill(dsNorthwind1)
    daProducts.Fill(dsNorthwind1) // C#
    daOrderDetails.Fill(dsNorthwind1);
    daProducts.Fill(dsNorthwind1);
用數(shù)據(jù)填充 RTF 文本框 現(xiàn)在您要為項目添加代碼,以便在列表框中選定某個訂單時,可以在 RTF 文本框中顯示所有訂單明細(xì)。 以下代碼將基于列表框中的選定訂單調(diào)用 GetChildRows 方法。訂單明細(xì)表中的所有相關(guān)記錄都將分配給名為 draOrderDetails 的數(shù)據(jù)行數(shù)組。每個數(shù)據(jù)行的內(nèi)容將顯示在 RTF 文本框中。 注重:請注重嵌套的 For Each 循環(huán)是如何首先選取一個數(shù)據(jù)行,然后在該數(shù)據(jù)行的所有列中循環(huán)以訪問整個相關(guān)記錄的。 設(shè)置 RTF 文本框以顯示所有訂單明細(xì)
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Designer(視圖設(shè)計器)。
  2. 雙擊列表框為列表框 lbOrders 的 SelectedIndexChanged 事件創(chuàng)建事件處理程序。
  3. 添加以下代碼:

    ' Visual Basic
    Private Sub lbOrders_SelectedIndexChanged _
    (ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles lbOrders.SelectedIndexChanged
    ' 選擇新訂單時,清除 RTF 文本框。
    rtbDetails.Clear() ' 聲明一個用來保存選定的訂單 ID 的整數(shù)。
    Dim SelectedOrderID As Integer
    ' 將選定的項目設(shè)置為整數(shù)。
    SelectedOrderID = CType(lbOrders.SelectedItem, Integer) ' 聲明一個用來保存選定訂單的記錄的數(shù)據(jù)行。
    Dim drSelectedOrder As DataRow
    drSelectedOrder = _
    DsNorthwind1.Orders.FindByOrderID(SelectedOrderID) ' 聲明一個用來保存相關(guān)記錄的數(shù)據(jù)行數(shù)組。
    Dim draOrderDetails() As DataRow
    draOrderDetails = _
    drSelectedOrder.GetChildRows("OrdersOrderDetails") Dim details As String = ""
    Dim drDetails As DataRow
    Dim dcDetails As DataColumn
    For Each drDetails In draOrderDetails
    For Each dcDetails In drDetails.Table.Columns
    details &= dcDetails.ColumnName & ": "
    details &= drDetails(dcDetails).ToString()
    details &= ControlChars.CrLf
    Next
    details &= ControlChars.CrLf
    Next
    rtbDetails.Text = details
    End Sub
    // C#
    private void lbOrders_SelectedIndexChanged
    (object sender, System.EventArgs e)
    {
    // 選擇新訂單時,清除 RTF 文本框。
    rtbDetails.Clear(); // 聲明一個用來保存選定的訂單 ID 的整數(shù)。
    int SelectedOrderID;
    // 將選定的項目設(shè)置為整數(shù)。
    SelectedOrderID = (int)lbOrders.SelectedItem; // 聲明一個用來保存選定訂單的記錄的數(shù)據(jù)行。
    DataRow drSelectedOrder;
    drSelectedOrder =
    dsNorthwind1.Orders.FindByOrderID(SelectedOrderID); // 聲明一個用來保存相關(guān)記錄的數(shù)據(jù)行數(shù)組。
    DataRow[] draOrderDetails;
    draOrderDetails =
    drSelectedOrder.GetChildRows("OrdersOrderDetails"); string details = "";
    foreach(DataRow drDetails in draOrderDetails)
    {
    foreach(DataColumn dcDetails in drDetails.Table.Columns)
    {
    details += dcDetails.ColumnName + ": ";
    details += drDetails[dcDetails].ToString() + "/n";
    }
    details += "/n";
    }
    rtbDetails.Text = details;
    }
  4. 保存項目。
  5. 運行應(yīng)用程序。
  6. 在列表框中選擇一個訂單,其訂單明細(xì)將顯示在 RTF 文本框中。
  7. 在列表框中選擇另一個訂單。RTF 文本框中的訂單明細(xì)將被更新。
瀏覽多對多關(guān)系 構(gòu)成多對多關(guān)系的表通常通過保證數(shù)據(jù)完整性的第三方表進(jìn)行連接。在羅斯文數(shù)據(jù)庫中,訂單表和產(chǎn)品表就是這樣相關(guān)的。因為有些訂單可能包含很多產(chǎn)品,而有些產(chǎn)品又在很多訂單中銷售。這兩個表是通過訂單明細(xì)表連接的,訂單明細(xì)表利用這兩個表中的列建立自己特定的列,并使這些數(shù)據(jù)相關(guān)。瀏覽構(gòu)成多對多關(guān)系的三個表與處理一對多關(guān)系的表并沒有太大區(qū)別。 要瀏覽多對多關(guān)系,您可以基于訂單明細(xì)表中的單個記錄來訪問產(chǎn)品,這將返回產(chǎn)品名稱并顯示在訂單明細(xì)中。 您可以使用 GetParentRow 方法從產(chǎn)品表中訪問產(chǎn)品名稱。調(diào)用 GetParentRow 方法將返回單個數(shù)據(jù)行,而調(diào)用 GetChildRows 方法將返回數(shù)據(jù)行數(shù)組(如上例所示)。 從訂單明細(xì)記錄中獲取產(chǎn)品名稱
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Code(查看代碼)。
  2. 在列表框 (lbOrders) 的 SelectedIndexChanged 事件處理程序中,將以下代碼添加到 For Each 行之間:

    ' Visual Basic
    details &= "產(chǎn)品名稱: " & _
    CType(drDetails.GetParentRow("ProductsOrderDetails") _
    ("ProductName"), String) & ControlChars.CrLf // C#
    details += "產(chǎn)品名稱: " +
    drDetails.GetParentRow("ProductsOrderDetails")["ProductName"]
    + "/n";
  3. 保存項目。
  4. 運行應(yīng)用程序。
  5. 在列表框中選擇一個訂單,
    RTF 文本框中將顯示產(chǎn)品名稱和具體信息。現(xiàn)在窗體中顯示來自所有四個表的相關(guān)數(shù)據(jù)。
  6. 在列表框中選擇另一個訂單。RTF 文本框中的訂單明細(xì)將被更新。
  7. 關(guān)閉窗體。更多的請看:http://www.QQread.com/windows/2003/index.Html
表達(dá)式列 除了包含靜態(tài)數(shù)據(jù)外,還可以基于表達(dá)式的結(jié)果為 DataColumn 分配值。表達(dá)式是一個分配給 DataColumn.Expression 屬性的字符串。 當(dāng)表達(dá)式與相關(guān)數(shù)據(jù)一同使用時,數(shù)據(jù)列可以包含:
  • 相關(guān)數(shù)據(jù)列的計算所得值。
  • 相關(guān)數(shù)據(jù)列的合計信息。
  • 相關(guān)數(shù)據(jù)的邏輯比較結(jié)果。
為說明處理相關(guān)數(shù)據(jù)時的值表達(dá)式列,我們將針對每種使用情況介紹一個示例,并添加到 DataRelationExample 應(yīng)用程序中。 添加包含計算值的表達(dá)式列 計算的列包含數(shù)學(xué)運算結(jié)果。可以從現(xiàn)有的列中取值進(jìn)行計算。訂單明細(xì)表中將添加一個名為 Total 的新列,它將包含由表達(dá)式 UnitPrice * Quantity 返回的值(訂單的總計美元值)。 添加表達(dá)式列
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Code(查看代碼)。
  2. 將以下代碼添加到 Form1_Load 事件處理程序中已有代碼之上:

    ' Visual Basic
    ' 在訂單明細(xì)表中創(chuàng)建名為 Total 的表達(dá)式列。
    Dim dcTotal as DataColumn = new DataColumn("Total")
    dcTotal.DataType = System.Type.GetType("System.Decimal")
    dcTotal.Expression = "UnitPrice * Quantity"
    DsNorthwind1.Order_Details.Columns.Add(dcTotal) // C#
    // 在訂單明細(xì)表中創(chuàng)建名為 Total 的表達(dá)式列。
    DataColumn dcTotal = new DataColumn("Total");
    dcTotal.DataType = System.Type.GetType("System.Decimal");
    dcTotal.Expression = "UnitPrice * Quantity";
    dsNorthwind1.Order_Details.Columns.Add(dcTotal);
  3. 運行應(yīng)用程序。
  4. 在列表框中選擇一個訂單, 檢查 RTF 文本框中的訂單明細(xì),并注重每個記錄都有一個新的 Total 列,顯示 UnitPrice 和 Quantity 字段的乘積。
  5. 關(guān)閉窗體。
添加包含合計信息的表達(dá)式列 Expression 屬性支持幾個合計功能(Sum、Avg、Count 等)。有關(guān)具體信息,請參閱 DataColumn.Expression 屬性。 為演示如何生成合計信息,需要在訂單表中添加一個名為 OrderTotal 的新列。此列將使用 Sum 功能,根據(jù)在列表框 (lbOrders) 中選定的訂單返回所有子訂單明細(xì)記錄的總計美元值。然后,該值將顯示在 RTF 文本框中每個訂單明細(xì)的上方。 創(chuàng)建 OrderTotal 列
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Code(查看代碼)。
  2. 在 Form1_Load 事件處理程序中,將以下代碼添加到在訂單明細(xì)表中創(chuàng)建 Total 列的代碼的下方:

    ' Visual Basic
    ' 在訂單表中創(chuàng)建名為 OrderTotal 的表達(dá)式列。
    Dim dcOrderTotal as DataColumn = new DataColumn("OrderTotal")
    dcOrderTotal.DataType = System.Type.GetType("System.Decimal")
    dcOrderTotal.Expression = "Sum(Child.Total)"
    DsNorthwind1.Orders.Columns.Add(dcOrderTotal)
    // C#
    // 在訂單表中創(chuàng)建名為 OrderTotal 的表達(dá)式列。
    DataColumn dcTotal2 = new DataColumn("OrderTotal");
    dcTotal2.DataType = System.Type.GetType("System.Decimal");
    dcTotal2.Expression = "Sum(Child.Total)";
    dsNorthwind1.Orders.Columns.Add(dcTotal2);
將合計信息顯示在所有訂單明細(xì)的上方
  1. 在 lbOrders_SelectedIndexChanged 事件處理程序中,將以下代碼添加到 Dim details As String = ""string details = "" 行之下:

    ' Visual Basic
    details = "訂單總計: " & String.Format("{0:c}", _
    DsNorthwind1.Orders.FindByOrderID(CType(lbOrders.SelectedItem, _
    Integer))("OrderTotal")) & ControlChars.CrLf // C#
    details = "訂單總計: " +
    String.Format("{0:c}",dsNorthwind1.Orders.FindByOrderID
    ((int)lbOrders.SelectedItem)["OrderTotal"]) + "/n";
  2. 運行應(yīng)用程序。
  3. 在列表框中選擇一個訂單, 請注重,選定訂單的所有訂單明細(xì)的總計金額將顯示在 RTF 文本框中的第一行。
  4. 在列表框中選擇另一個訂單,將更新顯示以反映新選擇的訂單。
  5. 關(guān)閉窗體。
添加包含邏輯求值的表達(dá)式列 Expression 屬性可以基于其他列中的計算值來填充某個數(shù)據(jù)列。例如,訂單表中的 OrderSize 列可以包含值"Big"(假如訂單總額大于 1000)或者"Small"(假如訂單總額小于 1000)。 為演示這類表達(dá)式,需要在 DataRelationExample 應(yīng)用程序中添加代碼以執(zhí)行以下操作:
  1. 在訂單表中添加名為 OrderSize 的數(shù)據(jù)列。
  2. 根據(jù)相關(guān)訂單明細(xì)的值來填充 OrderSize 列。
  3. 在 RTF 文本框的頂部同時顯示 OrderSize 列的值和 OrderTotal 的值。
添加創(chuàng)建 OrderSize 列的代碼
  1. 在 Solution Explorer(解決方案資源治理器)中,右鍵單擊 Form1 并從快捷菜單中選擇 View Code(查看代碼)。
  2. 在 Form1_Load 事件處理程序中,將以下代碼添加到在訂單表中創(chuàng)建 OrderTotal 列的代碼的下方:

    ' Visual Basic
    ' 在訂單表中創(chuàng)建名為 OrderSize 的表達(dá)式列。
    Dim dcOrderSize as DataColumn = new DataColumn("OrderSize")
    dcOrderSize.DataType = System.Type.GetType("System.String")
    dcOrderSize.Expression = "IIF(Sum(Child.Total)<1000,'Small','Big')"
    DsNorthwind1.Orders.Columns.Add(dcOrderSize)
    // C#
    // 在訂單表中創(chuàng)建名為 OrderSize 的表達(dá)式列。
    DataColumn dcOrderSize = new DataColumn("OrderSize");
    dcOrderSize.DataType = System.Type.GetType("System.String");
    dcOrderSize.Expression = "IIF(Sum(Child.Total)<1000,'Small','Big')";
    dsNorthwind1.Orders.Columns.Add(dcOrderSize);
顯示 OrderSize 的值
  1. 在 lbOrders_SelectedIndexChanged 事件處理程序中,將以下代碼添加到第一個 For Each 行的上方:

    ' Visual Basic
    details &= " (" & CType(DsNorthwind1.Orders.FindByOrderID _
    (CType(lbOrders.SelectedItem, Integer))("OrderSize"), String) & ")" _
    & ControlChars.CrLf // C#
    details += " (" + dsNorthwind1.Orders.FindByOrderID
    ((int)lbOrders.SelectedItem)["OrderSize"] + ")/n";
  2. 運行應(yīng)用程序。
  3. 在列表框中選擇一個訂單。
  4. 檢查 RTF 文本框中的第一行。選定訂單的 OrderSize 將顯示在 OrderTotal 的右側(cè)。
  5. 在列表框中選擇另一個訂單,將更新顯示以反映新選擇的訂單。
  6. 從 Debug(調(diào)試)菜單中,選擇 Stop Debugging(停止調(diào)試)。
有關(guān)相關(guān)表的其他信息 這里有必要提及一些其他信息以豐富本文的內(nèi)容。 填充相關(guān)數(shù)據(jù)表的順序非常重要 相關(guān)數(shù)據(jù)表的填充順序?qū)?shù)據(jù)的輸出有很大影響,因此必須在設(shè)計應(yīng)用程序時予以考慮。例如,請注重最后一個填充的客戶表的情況。當(dāng)填充客戶表時,組合框?qū)⑻畛淇蛻裘Q值。填充組合框時,會引發(fā) SelectedIndexChanged 事件。這將執(zhí)行事件處理程序中的代碼。由于尚未填充訂單表,GetChildRows 方法將返回零 (0) 個記錄,窗體的標(biāo)題將顯示錯誤信息。試一試:更改代碼以首先填充客戶表,并運行應(yīng)用程序。窗體的標(biāo)題顯示 ALFKI 的零 (0) 個訂單,這是不正確的。 返回相關(guān)記錄的特定版本 通過將所需的 DataRowVersion 作為第二個(可選的)參數(shù)傳遞給 GetChildRows 或 GetParentRow 方法,可以返回數(shù)據(jù)行的特定版本。以該應(yīng)用程序為例,假如只想查看特定客戶的原始訂單,可以將組合框的 SelectedIndexChanged 事件中的代碼更改為類似如下的代碼。由于此應(yīng)用程序中的數(shù)據(jù)并未更改,以下代碼不會產(chǎn)生明顯的效果,這里只是作為一個說明。 ' Visual Basic
' 只用選定客戶的原始子行
' 填充數(shù)組。
Dim draOrders As DataRow() = DsNorthwind1.Customers.FindByCustomerID _
(cbCustomers.SelectedValue.ToString()).GetChildRows _
("CustomersOrders", DataRowVersion.Original) // C#
// 只用選定客戶的原始子行
// 填充數(shù)組。
DataRow draOrders = dsNorthwind1.Customers.FindByCustomerID
(cbCustomers.SelectedValue.ToString()).GetChildRows
("CustomerOrders", DataRowVersion.Original);
總結(jié)
要訪問特定數(shù)據(jù)行的相關(guān)記錄,可以調(diào)用該行的 GetChildRows 或 GetParentRow 方法,以傳遞連接該數(shù)據(jù)行及其相關(guān)記錄的數(shù)據(jù)關(guān)系。然后,便可以通過檢查由該方法調(diào)用返回的數(shù)據(jù)行(或數(shù)據(jù)行數(shù)組)來訪問相關(guān)的記錄。 通過為 DataColumn.Expression 屬性分配一個有效的表達(dá)式字符串并將數(shù)據(jù)列添加到相應(yīng)的 DataTable.Columns 集合中,可以對相關(guān)記錄中的值進(jìn)行計算,合計和邏輯求值。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 施甸县| 霍城县| 利川市| 长海县| 稷山县| 绵阳市| 迁安市| 琼海市| 淮滨县| 曲阜市| 苍山县| 时尚| 织金县| 平阳县| 新龙县| 岚皋县| 和龙市| 阳新县| 雷山县| 陕西省| 宜阳县| 临高县| 峡江县| 镇赉县| 牟定县| 庆元县| 忻州市| 马关县| 如东县| 祁连县| 西林县| 沽源县| 马龙县| 阿荣旗| 民权县| 安庆市| 育儿| 伊吾县| 玛纳斯县| 房产| 宜章县|