ADO.NET筆記——使用DataSet返回數據


相關知識:

  1. 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中經過過濾后的數據,並且將用來綁定到數據展現控件中
  2. 連接的打開和關閉
    • 與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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM