相關知識:
- DataSet和DataAdapter的內部結構:
-

- DataSet通過DataAdapter從數據庫中獲取數據
- DataSet對象內部包括一個集合(Tables),也就是可以擁有多個表(DataTables);每個表存放着從數據庫放回的一個結果集(一般由一條SELECT語句產生一個結果集)
- DataTable對象包含一個行集合(Rows),集合中的每個元素都是一個DataRow類型的對象。DataRow提供了通過下標或者列名進行訪問字段數據的操作
- DataTable對象還包含一個列集合(Columns),集合中的每個元素都是一個DataColumn類型的對象,用於代表查詢結果集合中每一列的屬性,例如名稱、數據類型等
- DataSet對象包含一個關聯集合(Relations),集合中的每一個DataRelation代表兩個表之間的關聯。請注意,數據庫表之間的關聯不會被自動帶到DataSet中來,需要變成為DataSet中的SataTable建立關聯
- 可以由DataTable創建(DataView),DataView可以用來代表DataTable中經過過濾后的數據,並且將用來綁定到數據展現控件中
-
- 連接的打開和關閉
- 與SqlDataReader不用,使用DataAdapter對象,把數據加載到DataSet中,並不需要顯式打開和關閉連接
- 當調用DataAdapter的Fill函數時,該函數內部首先檢查連接對象是否已經打開
- 如果沒有打開,則打開鏈接,填充數據,然后關閉連接
- 如果已經打開,則直接填充數據,之后也不關閉連接
- 一旦數據已經填充到DataSet中,就不必與數據庫繼續保持連接。事實上,DataSet中的數據全在內存中,與數據庫無關。
代碼示例:
(示例數據庫使用紅皮書的示例數據庫:AdventureWorks_WroxSSRS2012)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Data; 7 using System.Data.SqlClient; 8 9 namespace ConsoleApplication10 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 string strConn = @"server=Joe-PC;database=AdventureWorks_WroxSSRS2012;uid=sa;pwd=root"; 16 SqlConnection conn = new SqlConnection(strConn); 17 18 DataSet ds = new DataSet(); 19 20 string strCmd1 = "SELECT ProductCategoryID,Name FROM Production.ProductCategory"; 21 SqlDataAdapter da1 = new SqlDataAdapter(strCmd1, conn); 22 // 將第一個查詢結果集合填入DataSet中,並且將DataTable命名為"Category" 23 da1.Fill(ds, "Category"); 24 25 string strCmd2 = "SELECT ProductSubcategoryID,ProductCategoryID,Name From Production.ProductSubcategory"; 26 SqlDataAdapter da2 = new SqlDataAdapter(strCmd2, conn); 27 // 將第二個查詢結果集合填入DataSet中,並且將DataTable命名為"Subategory" 28 da2.Fill(ds, "Subcategory"); 29 30 // 使用視圖 31 // 打印表中的數據 32 Console.WriteLine("主類別表:"); 33 DataTable dt1 = ds.Tables["Category"];//獲得Category表 34 DataView dv1 = new DataView(dt1); //創建視圖 35 dv1.Sort = "ProductCategoryID ASC"; //設置排序規則 36 foreach (DataRowView drv in dv1) 37 { 38 Console.WriteLine("{0}:{1}", drv[0], drv["Name"]); 39 } 40 41 Console.WriteLine(""); 42 43 Console.WriteLine("過濾后的子類別表:"); 44 DataTable dt2 = ds.Tables["Subcategory"]; 45 DataView dv2 = new DataView(dt2); 46 dv2.RowFilter = "ProductSubcategoryID>10";//設置過濾條件 47 dv2.Sort = "ProductSubcategoryID ASC"; 48 foreach (DataRowView drv in dv2) 49 { 50 Console.WriteLine("{0}:{1}", drv[0], drv["Name"]); 51 } 52 53 Console.WriteLine(""); 54 55 // 在兩個表之間建立關聯 56 DataRelation relation = new DataRelation("ProductCategory_ProductSubcategory", 57 dt1.Columns["ProductCategoryID"], dt2.Columns["ProductCategoryID"]); 58 ds.Relations.Add(relation);//將關聯添加到DataSet的集合中 59 try 60 { 61 for (int i = 0; i < dt1.Rows.Count; i++) 62 { 63 DataRow dri = dt1.Rows[i]; 64 //根據關聯找到數據相關的子類別數據 65 DataRow[] subRows = dri.GetChildRows(relation); 66 Console.WriteLine("{0}的子類別信息:", dri["Name"]); 67 foreach (DataRow dr in subRows) 68 { 69 Console.WriteLine("{0}:{1}", dr[0], dr["Name"]); 70 } 71 Console.WriteLine(""); 72 } 73 } 74 catch (Exception e) 75 { 76 Console.WriteLine(e); 77 } 78 } 79 } 80 }
