Home [ADO.NET] DataSet 物件(資料集)
Post
Cancel

[ADO.NET] DataSet 物件(資料集)

  • Dataset 表示一個資料集,是資料在記憶體中的快取資料。可以包括多個資料表。
  • DataSet 可以離線操作(離線處理),前後讀滾動(前後讀取)。(DataReader不能離線處理,且是唯讀的向前的,不過進度明顯會很快)
  • DataSet 可以更新回原来的資料庫 (DataReader不行)。

DataSet是什麼?
可以想像成DateSet在c#程式中建立一個暫存資料庫

  • 把dataset看作資料庫,
  • 把datatable看作資料庫裡的一個表

DataSet、DataTable、DataView的區别

如果以資料庫來打比方,
DataSet 就是一個功能簡單的資料庫,
DataSet 是多個表(DataTable)的集合,
DataTable 就是對應數(對應資料庫中的資料表)
DataView 則對應資料庫中的視圖(View)。


DataSet 架構圖

Ado.Net的核心組件。資料在記憶體中的緩存(快取資料),即記憶體中的一個資料庫。資料庫中的資料載入到記憶體中處理。

DataSet 和 DataTable 是什麼?

可以把DataTable和DataSet看做是資料容器,例如你查詢資料庫後面得到一些結果,可以放到這種容器裡。

那你可能要問:我不用這種容器,自己讀到變數或陣列裡也一樣可以存起來啊,為什麼要用容器?

原因是,這種容器的功能比較強大,除了可以存數據,還可以有更大用途。

舉例:在一個c/s結構的桌面資料庫系統裡,你可以把前面存放查詢結果的容器裡的資料顯示到你客戶端介面上,使用者在介面上對資料進行新增、刪除、修改,你可以把使用者的操作更新到容器,等使用者操作完畢了,要求更新,然後你才把容器整個的資料變化更新到資料庫,

這樣做的好處是什麼?就是減少了資料庫操作,客戶端速度提高了,資料庫壓力減少了。

DataSet 可以比喻為一個記憶體中的資料庫,DataTable 是一個記憶體中的資料表,DataSet裡可以儲存多個 DataTable。

  • DataSet:資料集。一般包含多個DataTable,用的時候,dataset[“表名”]得到 DataTable
  • DataTable:資料表。

簡介:

  • DataSet:表示一個資料集,是資料在記憶體中的快取資料(緩存),可以包含多個資料表。
1
2
3
4
DataSet.Table["表名"].Rows[行號]["欄位名稱"];

var id = ds.Tables[0].Rows[0][1];
var id = ds.Tables["Emp"].Rows[0]["Id"];
  • DataTable:表示記憶體中資料的一個資料表。
1
2
3
4
DataTable.Rows[行號]; //或「欄位名稱」

var id = dt.Rows[0]; //指定 行號
var id = dt.Rows["Id"]; //指定 欄位名稱
  • DataReader:DataReader物件是用來讀取資料庫最簡單的方式,只能讀取,不能寫入,而且是從頭到尾往下讀的,無法只讀某條資料;但它佔用記憶體小,速度快。

  • DataAdapter:DataAdapter 物件是用來讀取資料庫,可讀取寫入資料;但它佔用記憶體比 DataReader 大,速度慢。

範例

從資料庫將資料填入 DataSet中,並由DataSet 逐一取出資料,顯示在控制台上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//連線字串
string connString = "Data Source=.;Initial catalog=Northwind;User id=riva;Password=1234;Encrypt=true;Trust Server Certificate=True";

SqlConnection conn = new(connString); //建立連線
SqlDataAdapter da = new("select top 2 CustomerID,CompanyName,ContactName from customers", conn); //執行SQL
DataSet ds = new(); //建立DataSet,用來裝 da 執行sql結果的資料。
da.Fill(ds); //用fill將資料放入ds (fill方法會自動開啟/關閉conn連線)

//從 DataSet 取出資料, ds.Tables[0]就是所要查詢的結果集
foreach (DataRow row in ds.Tables[0].Rows) //ds.Tables[0].Rows 表示table的第一行資料
{
    //row[0] 指定index 將該行(row)的 每一列(column)資料 輸出到控制台
    Console.WriteLine($"客戶編號: {row[0]}, 公司名稱: {row[1]}, 聯絡人: {row[2]}");
}
da.Dispose();//釋放SqlDataAdapter資源

資料填入DataSet時,也可以加上 Table名:da.Fill(ds, "Customers");

執行結果:

1
2
客戶編號: ALFKI, 公司名稱: Alfreds Futterkiste, 聯絡人: Maria Anders
客戶編號: ANATR, 公司名稱: Ana Trujillo Emparedados y helados, 聯絡人: Ana Trujillo

MSDN - 將 DataTable 加入至資料集
MSDN - ADO.NET 資料集 MSDN - DataSet、DataTable 和 DataView
c#中的DataSet原理和用法
[ADO.NET] DataAdapter 物件(資料配接器) by R

This post is licensed under CC BY 4.0 by the author.