DataTable、DataView、DataSet 區別

DataTable、DataView、DataSet 區別 

1、DataTable數據庫

DataTable 表示內存中數據的一個表,它徹底是在內存中的一個獨立存在,包含了這張表的所有信息。DataTable能夠是從經過鏈接從數據庫中讀取出來造成的一個 表,一旦將內容讀到DataTable中,此DataTable就能夠跟數據源斷開而獨立存在;也能夠是徹底由程序本身經過代碼來創建的一個表。架構

◆ DataColumnide

一個表是由行和列組成的一個兩維的結構。表的結構是由DataColumn 對象的集合組成,DataColumn 對象集合可由DataTable.Columns 屬性中能獲取到,經過定義每一列的數據類型來肯定表的架構,相似數據庫中定義表。定義完表的結構就能夠根據結構來生成DataRow,用 DataTable.NewRow()方法來生成此DataTable結構的新行。函數

一個DataTable是由DataRow的集合組成的, DataRow的集合這個能夠由DataTable.Rows 屬性來訪問。spa

DataTable還能夠經過現有的列用Expression 屬性的表達式建立一些列。orm

一、建立計算出的列對象

好比:已經有了一個表結構,表中有一個DataColumn的集合,其中有一個叫 UnitPrice的列,你能夠新建一個DataColumn,設置好ColumnName,再設置此列的表達 式,DataColumn.Expression = "UnitPrice * 0.086",這個列的值就是名字爲UnitPrice的列計算出來的,在建立表達式時,使用 ColumnName 屬性來引用列。blog

二、第二個用途是建立聚合列排序

聚合列聚合一般沿着關係執行(有關關係的描述見下面DataRelation部分),若是 order表有名爲 detail 的子表,兩個表之間經過order.orderid和detail.orderid兩個列創建一個關係 DataRelation 對象名爲「order2detail」,在主表order中就能夠創建一個聚合列,將計算每一個order在detail表中含有的全部item的價格的 和:DataColumn.Expression = 「sum(child(order2detail).price)",child(order2detail)表示經過關係order2detail聯繫 到的子表,child(order2detail).price就表示子表的price列。內存

◆ DataRow

DataRow對象沒有直接在代碼中使用的構造函數,通常是從具備必定結構的 DataTable用NewRow()方法來新建一個DataRow對象。一個DataRow根據其是獨立的,仍是屬於某個DataTable,是否修改 過,是否被DataTable刪除等等不一樣的狀況有不一樣的狀態,由 DataRow.RowState屬性公開,以下表:

成員名稱

說明

Added 該行已添加到 DataRowCollection 中,AcceptChanges 還沒有調用。Deleted 該行已經過 DataRow 的 Delete 方法被刪除。
Deleted 該行已經過 DataRow 的 Delete 方法被刪除。
Detached 該行已被建立,但不屬於任何 DataRowCollection。DataRow 在如下狀況下當即處於此狀態:建立以後添加到集合中以前;或從集合中移除以後。
Modified 該行已被修改,AcceptChanges 還沒有調用。
Unchanged 該行自上次調用 AcceptChanges 以來還沒有更改。

一個DataRow對象剛被建立以後其狀態是Detached,是孤立的一個存在,因此創建了 DataRow以後在DataRow中的單元填充了數據後還要經過DataTable.Rows.Add(DataRow)方法將此DataRow添加到 DataTable,DataRow添加到 DataTable後, 這個DataRow的狀態就轉變爲Added。當修改了這個DataRow後,這個DataRow狀態轉爲Modified,當用 DataRow.Delete()方法刪除DataRow後,DataRow狀態將轉爲Deleted,不過此行還存在在DataTable中的,只是狀 態改變了,這時用DataTable.Rows.Count查看行數,跟刪除前是同樣的。只有在調用了 DataTable.Remove(DataRow)方法後,此DataRow才被從DataTable移除,狀態也回覆到Detached孤立狀態。

一旦調用了DataTable.AcceptChanges()方法後,全部的行將根據不一樣的 狀態作不一樣的處理,Added、Modified、 Unchanged將保留當前值,Deleted的行將從DataTable中移除,最後全部的行的狀態都置爲Unchanged。當DataTable 是從DataAdapter.Fill(DataSet,DataTable)方法填充而造成的,Fill()方法將自動調用 AcceptChanges()方法,將DataTable的行狀態都置爲Unchanged。而且,若是Fill方法中指定的那個DataTable在 要填充的那個DataSet不存在時,會生成一個跟數據源表一樣的結構的DataTable並填充數據。

◆ DataRelation

表示兩個 DataTable 對象之間的父/子關係。能夠類比於數據庫中的表之間的關係,父表至關於關係列爲主鍵的表,子表至關於關係列爲外鍵的表。DataRelation 構造函數通常爲:DataRelation(String, DataColumn, DataColumn) ,string爲關係名,第一個DataColumn爲創建關係的父表列,第二個DataColumn爲創建關係的子表列,創建關係的兩個列的 DataType 值必須相同。

創建好了關係,必須把這個關係加入到DataTable的ParentRelations屬性 或ChildRelations 屬性,這兩個屬性包含這個表的全部的跟父表的關係和跟子表的關係。若關係中此表是父表則將此關係加入到ChildRelations集合中,不然加入到 ParentRelations集合中。

2、DataView

DataView表示用於排序、篩選、搜索、編輯和導航的 DataTable 的可綁定數據的自定義視圖。能夠將DataView同數據庫的視圖類比,不過有點不一樣,數據庫的視圖能夠跨表創建視圖,DataView則只能對某一個 DataTable創建視圖。DataView通常經過DataTable.DefaultView 屬性來創建,再經過經過RowFilter 屬性和RowStateFilter 屬性創建這個DataTable的一個子集。

RowFilter屬性用來篩選要查看DataTable中哪些行的表達式,這個表達式同上面所說的創建計算列的表達式相同。例如:"LastName = 'Smith'",這就是隻查看列LastName的值爲'Smith'的那些數據行。

RowStateFilter 屬性用來設置 DataView 中的行狀態篩選器,上面介紹DataRow時介紹了DataRow的狀態,一個DataRow可能有五種狀態,RowStateFilter就是能夠經過 這些狀態來篩選要查看的行集。其實DataRow不只有五種狀態,DataRow還有版本的問題,好比當DataRow的狀態爲Modified,即這行 已經被修改了,這時這個DataRow就會有兩個版本,Current版本和Original版本(修改前的)。實際上RowStateFilter屬性 是綜合了DataRow的狀態和版原本篩選的(RowStateFilter確省值是CurrentRows)見下表:

成員名稱

說明

Added 一個新行。
CurrentRows 包括未更改行、新行和已修改行的當前行。
Deleted 已刪除的行。
ModifiedCurrent 當前版本,原始數據(請參閱 ModifiedOriginal)的修改版本。
ModifiedOriginal 原始版本(儘管它後來已被修改並以 ModifiedCurrent 形式存在)。
None 無。
OriginalRows 包括未更改行和已刪除行的原始行。
Unchanged 未更改的行。

DataView.Count屬性獲得的計數是在應用了 RowFilter 和 RowStateFilter 以後,獲取 DataView 中記錄的數量。

DataView是創建在DataTable基礎上的,DataView.Table 屬性能夠獲得此DataView對應的那個DataTable。DataView的行叫DataRowView,能夠從DataRowView直接經過 DataRowView.Row 屬性獲得此DataRowView對應的DataRow。

3、GridView

這裏說的GridView是winform中的GridView,通常都是跟DataView綁定來顯示DataTable中的數據,和修改DataTable中的數據。

DotNet的DataGrid的功能強大,但是在使用上與之前的習慣不太同樣,有時還比較麻煩,因此不少人都對這個GridView感到有些摸不着頭腦,有一種無從下手的感受,其實把一些概念搞清楚了許多問題就會迎刃而解了。

GridView經過DataSource 和 DataMember 屬性來綁定其要顯示的數據源。數據源通常是DataTable、DataView、DataSet等,不過將這些數據源綁定到GridView時其實是 綁定的DataView。若數據源是DataTable時,其實是綁定了此DataTable的DefaultView,若數據源是DataSet時, 則能夠向 DataMember 屬性設置一個字符串,該字符串指定要綁定到的表,而後再將DataMember指定的那個DataTable的DefaultView綁定到 GridView。

因此GridView實際顯示的是DataTable通過篩選的DataView

相關文章
相關標籤/搜索