2009年8月8日 星期六

離線環境下的編輯作業-建立DataSet物件

DataSet物件是SystemData命名空間中的一個物件,主要用途為提供應用程式一個於記憶體之中的資料暫存機制
DataSet
-Tables
-DataTable1
-DataTable2
經由DataRelation物件來描述DataTable物件之間的關係。

一、DataSet物件
1、一般可區分為兩種不同型態的DataSet物件
  • 具型別(Typed):具型別的DataSet結構描述則是源自於.xsd檔,並包含明確的具型別集合。
  • 不 具型別(Untyped):自行建立DataTable(Untyped DataTable)物件,將DataTable加入至DataSet的Tables 集合中,手動地為DataSet建立資料結構描述(Schema)。可以職由集合的索引值來存取該DataSet中不具型別的DataTable及其 DataColumn物件。
2、Visual Studio提供了三種不同的方式建立DataSet物件
  • 於程式編輯器中撰寫程式宣告DataSet物件,建立空的DataSet物件後再另行建立DataTable物件,最後再選擇性加入DataRelation物件。
  • 選擇使用DataSet設計工具以及資料來源組態精靈(Data Source Configuration Wizard)兩者其中之一來協助建立,從選擇或建立資料連結開始逐步選取資料庫裡的資料對象,進而建立具型別的DataSet,最後再產生相關的程式碼。
  • 用滑鼠自工具箱拖曳一個DataSet物件到表單之上,再利用對應Table以及Column集合編輯為所屬的DataSet建立結構描述。
3、基本語法
  • 建立DataSet物件 Private ds_Northwind As New DataSet("ds_Northwind")
  • 建立DataTable並加入DataSet裡
Dim table_Customers As New DataTable("Customers")
table_Customers.Columns.Add("CustomerID", Type.GetType("System.Int32"))
table_Customers.Columns(0).AutoIncrement = True
table_Customers.Columns(0).Unique = True

table_Customers.Columns.Add("CustomerName", Type.GetType("System.String"))

Dim table_Orders As New DataTable("Orders")
table_Orders.Columns.Add("OrderID", Type.GetType("System.Int32"))
table_Orders.Columns(0).AutoIncrement = True
table_Orders.Columns.Add("OrderProduct", Type.GetType("System.String"))
table_Orders.Columns.Add("CustomerID", Type.GetType("System.Int32"))

ds_Northwind.Tables.Add(table_Customers)
ds_Northwind.Tables.Add(table_Orders)
  • 新增父表單資料
Dim newRow1 As DataRow = ds_Northwind.Tables("Customers").NewRow()
newRow1.Item("CustomerName") = "Jone"
ds_Northwind.Tables("Customers").Rows.Add(newRow1)

Dim newRow2 As DataRow = ds_Northwind.Tables("Customers").NewRow()
newRow2.Item("CustomerName") = "Amy"
ds_Northwind.Tables("Customers").Rows.Add(newRow2)

Dim newRow3 As DataRow = ds_Northwind.Tables("Customers").NewRow()
newRow3.Item("CustomerName") = "Jone"
ds_Northwind.Tables("Customers").Rows.Add(newRow3)
  • 新增子表單資料
Dim newRow4 As DataRow = ds_Northwind.Tables("Orders").NewRow()
newRow4.Item("OrderProduct") = "AProduct"
newRow4.Item("CustomerID") = 0
ds_Northwind.Tables("Orders").Rows.Add(newRow4)

Dim newRow5 As DataRow = ds_Northwind.Tables("Orders").NewRow()
newRow5.Item("OrderProduct") = "BProduct"
newRow5.Item("CustomerID") = 1
ds_Northwind.Tables("Orders").Rows.Add(newRow5)

Dim newRow6 As DataRow = ds_Northwind.Tables("Orders").NewRow()
newRow6.Item("OrderProduct") = "CProduct"
newRow6.Item("CustomerID") = 2
ds_Northwind.Tables("Orders").Rows.Add(newRow6)
  • 建立關聯
Dim customersOrders As New DataRelation("dr_customersOrders", table_Customers.Columns("CustomerID"), table_Orders.Columns("CustomerID"))

ds_Northwind.Relations.Add(customersOrders)
  • 將資料丟入DataGridView
DataGridView2.Columns.Clear()
DataGridView2.Rows.Clear()
For Each col As DataColumn In ds_Northwind.Tables("Customers").Columns

DataGridView2.Columns.Add(col.ColumnName, col.ColumnName)
Next

For Each row As DataRow In ds_Northwind.Tables("Customers").Rows
DataGridView2.Rows.Add(CInt(row(0)), row(1).ToString)
Next
  • 取得子資料列
ListView1.Items.Clear()
For Each Customer_Row As DataRow In ds_Northwind.Tables("Customers").Rows(e.RowIndex).GetChildRows("dr_customersOrders")
ListView1.Items.Add(Customer_Row("OrderProduct"))
Next
  • 其它
  • 合併DataSet:內容
ds_SaleHistory.Merge(ds_OldSales,True,MissingSchemaAction.Ignore)
  • 複製DataSet內容
Dim ds_Copy as new DataSet
ds_Copy = ds_Original.Copy

二、利用DataSet設計工具建立DataSet
1、首先建立一個名為DataSetDesignerExample的Windows Form
2、自「專案」功能表裡選擇執行「加入新項目」選項
3、選擇資料集樣版,並命名為NorthwindDataSet.xsd
4、自伺服器總管裡挑選Customers資料表及Order資料表,並將其拖曳至設計工具上。
完成拖曳Customers以及Orders資料表至DataSet設計工具上後的設計具看起來應接近下圖。

5、在進行後續步驟之前請先建置(Build)本專案
6、用滑鼠拖曳一個ListBox控制項至Frm_Ex1上,並命名為CustomersListbox
7、用滑鼠拖曳一個Button控制項至Frm_Ex1上
  • Name = GetCustomersButton
  • Text=Get Customers
8、用滑鼠雙擊Get Customers按鈕,並將下列程式碼加入GetCustomersButton_Click事件處理常式中
Imports System.Data
Imports System.Data.SqlClient

Private Sub GetCustomersButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GetCustomersButton.Click
'建立一個具型別的Northwind DataSet執行個體
Dim ds_Northwind As New NorthwindDataSet

'建立一個CustomerTableAdapter的執行個體
Dim da_Customers As New NorthwindDataSetTableAdapters.CustomersTableAdapter

'呼叫Fill方法為Customers DataTable載入所有的客戶資料紀錄
da_Customers.Fill(ds_Northwind.Customers)

'將所有Customers資料表的CompanyName欄位加入ListBox之中
For Each ds_NW_customers As NorthwindDataSet.CustomersRow In ds_Northwind.Customers.Rows
CustomersListBox.Items.Add(ds_NW_customers.CompanyName)
Next

End Sub
9、執行結果



三、利用資料來源組態精靈建立具型別的DataSet
1、建立一個名為DatasourceWizardExample的Windows Form
2、至「資料」功能表裡選擇執行「加入新資料來源」選項以開啟資料來源組態精靈
3、選擇「選擇資料來源類型(Choose A Data Source Type)」畫面上的預設選項「資料庫」,並按「下一步」

4、清單控制項裡顯的是伺服器總管裡所有可用的資料連接。如下圖所示。於畫面上選取Northwind範例資料庫連接,或是建立新的資料連結,並按「下一步」。再按「是」(若出現詢問對話方塊時)以確認將資料庫連接加入至此專案。

5、選擇欲使用的資料連接後,將可選擇是否將設定儲存至應用程式組態檔(Application Configuration File)之中,在此請保留預設選項並按「下一步」。
6、展開「選擇你的資料庫物件」畫面上的「資料表」節點,並選取Customers資料表


7、按「完成」以結束此精靈的操作。此具型別的DataSet將自動被加到專案中。資料來源視窗裡將出現此資料來源,利用此資料來源將可快速開發資料繫結的表單。
8、切換至frm_Ex2的設計畫面,並自「資料」功能表裡選擇「顯示資料來源」選項。
9、自資料來源視窗中將Customers節點拖曳至frm_Ex2之上

自資料來源視窗拖曳至Customer資料表後,Visual Studio將於表單之中自動載入Customers DataTable資料的程式碼
10、執行結果


四、設定不具型別的DataSet物件
1、DataSet重要屬性
  • 自工具箱-->資料區段裡拖曳一個DataSet至Form之中
  • 自「加入資料集」對話方塊裡,選擇「不具型別資料集」並按「確定」
  • 選取DataSet1執行個體,切換到屬性視窗上的Table屬性,開啟「資料表集合編輯器(Table Collection Editor)」
  • 選取DataSet1執行個體,切換到屬性視窗上的Relations屬性,開啟「關聯性集合編輯器(Relations Collection Editor)」
  • Table下選取Columns屬性,開啟「資料行集合編輯器(Columns Collection Editor)」
2、DataGridView
3、ListView
4、相關程式碼
Public Class frm_Ex3

Private Sub FillDataSetButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FillDataSetButton.Click
Dim newRow As DataRow = DataSet1.Tables("Categories").NewRow()
newRow.Item("CategoryName") = "Beverages"
DataSet1.Tables("Categories").Rows.Add(newRow)

Dim newRow1 As DataRow = DataSet1.Tables("Categories").NewRow()
newRow1.Item("CategoryName") = "Condiments"
DataSet1.Tables("Categories").Rows.Add(newRow1)

Dim newRow2 As DataRow = DataSet1.Tables("Categories").NewRow()
newRow2.Item("CategoryName") = "Seafood"
DataSet1.Tables("Categories").Rows.Add(newRow2)

Dim newRow3 As DataRow = DataSet1.Tables("Products").NewRow()
newRow3.Item("CategoryID") = 1
newRow3.Item("ProductName") = "Chai"
DataSet1.Tables("Products").Rows.Add(newRow3)

Dim newRow4 As DataRow = DataSet1.Tables("Products").NewRow()
newRow4.Item("CategoryID") = 2
newRow4.Item("ProductName") = "Aniseed Syrup"
DataSet1.Tables("Products").Rows.Add(newRow4)

Dim newRow5 As DataRow = DataSet1.Tables("Products").NewRow()
newRow5.Item("CategoryID") = 3
newRow5.Item("ProductName") = "Ikura"
DataSet1.Tables("Products").Rows.Add(newRow5)

Dim newRow6 As DataRow = DataSet1.Tables("Products").NewRow()
newRow6.Item("CategoryID") = 1
newRow6.Item("ProductName") = "Chang"
DataSet1.Tables("Products").Rows.Add(newRow6)

Dim newRow7 As DataRow = DataSet1.Tables("Products").NewRow()
newRow7.Item("CategoryID") = 2
newRow7.Item("ProductName") = "Chef Anton's Gumbo Mix"
DataSet1.Tables("Products").Rows.Add(newRow7)

Dim newRow8 As DataRow = DataSet1.Tables("Products").NewRow()
newRow8.Item("CategoryID") = 3
newRow8.Item("ProductName") = "Boston Crab Meat"
DataSet1.Tables("Products").Rows.Add(newRow8)
End Sub

Private Sub frm_Ex3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DataGridView1.DataSource = DataSet1.Tables("Categories")
DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
End Sub

Private Sub DataGridView1_CellDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellDoubleClick
'取得使用者選取的資料列的CategoryID欄位資料
Dim categoryID As Integer = CInt(DataGridView1.SelectedRows(0).Cells("CategoryID").Value.ToString())

'取得該資料的DataRow
Dim rows() As DataRow = DataSet1.Tables("Categories").Select("CategoryID =" & categoryID)
ListView1.Items.Clear()

'呼叫GetChildRows方法以取得相關聯的產品資料
For Each r As DataRow In rows(0).GetChildRows("DR_CategoriesProducts")
ListView1.Items.Add(r.Item("ProductName").ToString())
Next
End Sub
End Class

沒有留言:

張貼留言