複製鏈接
請複製以下鏈接發送給好友

DataSet

鎖定
DataSet是ADO.NET的中心概念。可以把DataSet當成內存中的數據庫,DataSet是不依賴於數據庫的獨立數據集合。
所謂獨立,就是説,即使斷開數據鏈路,或者關閉數據庫,DataSet依然是可用的,DataSet在內部是用XML來描述數據的,由於XML是一種與平台無關、與語言無關的數據描述語言,而且可以描述複雜關係的數據,比如父子關係的數據,所以DataSet實際上可以容納具有複雜關係的數據,而且不再依賴於數據庫鏈路。
中文名
DataSet
概    述
DataSet是ADO.NET的中心概念
應用領域
數據庫
特    點
獨立性、離線
實    質
DataTable物件集合
優    勢
處理脱機數據等

DataSet簡介

DataSet 是 ADO. NET結構的主要組件,它是從數據源中檢索到的數據在內存中的緩存。DataSet 由一組 DataTable 對象組成,可使這些對象與 DataRelation 對象互相關聯。還可通過使用 UniqueConstraint 和 ForeignKeyConstraint 對象在 DataSet 中實施數據完整性 [1] 
正是由於DataSet才使得程序員在編程時可以屏蔽數據庫之間的差異,從而獲得一致的編程模型。DataSet支持多表、表間關係、數據約束等,和關係數據庫的模型基本一致。
ado.net DataSet 的設計已明確指出它可獨立於任何資料來源外而存取資料。因此,它可與多個不同的資料裏來源搭配使用、與 XML 資料搭配使用,或用於管理應用程序的本機資料。DataSet 包含一或多個由資料列和資料行所組成的DataTable物件集合,以及 DataTable 物件中的主索引鍵、外部索引鍵、條件約束 (Constraint) 及資料的相關資訊。
儘管 DataTable 對象中包含數據,但是 DataRelationCollection 允許遍覽表的層次結構。這些表包含在通過 Tables 屬性訪問的 DataTableCollection 中。當訪問 DataTable 對象時,請注意它們是按條件區分大小寫的。
例如,如果一個 DataTable 被命名為“mydatatable”,另一個被命名為“Mydatatable”,則用於搜索其中一個表的字符串被認為是區分大小寫的。但是,如果“mydatatable”存在而“Mydatatable”不存在,則認為該搜索字符串不區分大小寫。 [1] 
DataSet 可將數據和架構作為 XML 文檔進行讀寫。數據和架構可通過 HTTP 傳輸,並在支持 XML 的任何平台上被任何應用程序使用。可使用 WriteXmlSchema 方法將架構保存為 XML 架構,並且可以使用 WriteXml 方法保存架構和數據。若要讀取既包含架構也包含數據的 XML 文檔,可使用 ReadXml 方法。
在典型的多層實現中,用於創建和刷新 DataSet 並依次更新原始數據的步驟包括:
通過 DataAdapter 使用數據源中的數據生成和填充 DataSet 中的每個 DataTable。
通過添加、更新或刪除 DataRow 對象更改單個 DataTable 對象中的數據。
調用 GetChanges 方法以創建只反映對數據進行的更改的第二個 DataSet。
調用 DataAdapter 的 Update 方法,並將第二個 DataSet 作為參數傳遞
調用 Merge 方法將第二個 DataSet 中的更改合併到第一個中。
針對 DataSet 調用 AcceptChanges。或者,調用 RejectChanges 以取消更改。
需要注意的是:dataset所有數據都加載在內存上執行的,可以提高數據訪問速度,提高硬盤數據的安全性。極大的改善了程序運行的速度和穩定性。 [1] 

DataSet數據模型

因為DataSet可以看做是內存中的數據庫,也因此可以説DataSet是數據表的集合,它可以包含任意多個數據表(DataTable),而且每一 DataSet中的數據表(DataTable)對應一個數據源中的數據表(Table)或是數據視圖(View)。數據表實質是由行(DataRow)和 列(DataColumn)組成的集合為了保護內存中數據記錄的正確性,避免併發訪問時的讀寫衝突,DataSet對象中的DataTable負責維護每一條記錄,分別保存記錄的初始狀態和當前狀態。從這裏可以看出DataSet是與只能存放單張數據表的Recordset是截然不同的概念。
DataSet對象結構還是非常複雜的,在DataSet對象的下一層中是DataTableCollection對象、 DataRelationCollection對象和ExtendedProperties對象。上文已經説過,每一個DataSet對象是由若干個 DataTable對象組成。DataTableCollection就是管理DataSet中的所有DataTable對象。表示DataSet中兩個 DataTable對象之間的父/子關係是DataRelation對象。它使一個DataTable 中的行與另一個DataTable中的行相關聯。這種關聯類似於關係數據庫中數據表之間的主鍵列和外鍵列之間的關聯。 DataRelationCollection對象就是管理DataSet中所有DataTable之間的DataRelation關係的。在 DataSet中DataSet、DataTable和DataColumn都具有ExtendedProperties屬性。 ExtendedProperties其實是一個屬性集(PropertyCollection),用以存放各種自定義數據,如生成數據集的SELECT 語句等。DataRow表示DataType中實際的數據,我們通過DataRow將數據添加到用DataColumn定義好的DataTable。 [2] 

DataSet三大特性

DataSet對象的三大特性包括: [2] 
(1) 獨立性。DataSet獨立於各種數據源。
(2) 離線(斷開)和連接。
(3) DataSet對象是一個可以用XML形式表示的數據視圖,是一種數據關係視圖。
特點介紹:
1、處理脱機數據,在多層應用程序中很有用。
2、可以在任何時候查看DataSet中任意行的內容,允許修改查詢結果的方法。
3、處理分級數據
4、緩存更改
5、XML的完整性: DataSet對象和XML文檔幾乎是可互換的。

DataSet使用方法

在實際應用中,DataSet使用方法一般有三種:
(1) 把數據庫中的數據通過DataAdapter對象填充DataSet。
(2) 通過DataAdapter對象操作DataSet實現更新數據庫。
(3) 把XML數據流或文本加載到DataSet。

DataSet屬性

CaseSensitive
用於控制DataTable中的字符串比較是否區分大小寫。
DataSetName
當前DataSet的名稱。如果不指定,則該屬性值設置為"NewDataSet"。如果將DataSet內容寫入XML文件,DataSetName 是XML文件的根節點名稱。
DesignMode
如果在設計時使用組件中的DataSet, DesignMode 返回True,否則返回False。
HasErrors
表示DataSet 中的DataRow對象是否包含錯誤。如果將一批更改提交給數據庫並將DataAdapter對象的ContinueUpdateOnError 屬性設置為True,則在提交更改後必須檢查DataSet的HasErrors屬性,以確定是否有更新失敗。
NameSpace和Prefix
指定XML命名空間和前綴。
Relations
返回一個DataRelationCollection對象。
Tables
檢查現有的DataTable對象。通過索引訪問DataTable 有更好的性能。

DataSet方法

ejectChanges
接受或放棄DataSet中所有掛起更改。調用AcceptChanges時,RowState屬性值為Added或Modified的所有行的RowState屬性都將被設置為UnChanged。任何標記為Deleted的DataRow對象將從DataSet中刪除。調用RejectChanges時,任何標記為Added的DataRow對象將會被從DataSet中刪除,其他修改過的DatRow對象將返回前一狀態。
Clear
清除DataSet中所有DataRow對象。該方法比釋放-一個DataSet然後再創建--個相同結構的新DataSet要快。
Clone和Copy
使用Copy方法會創建與原DataSet具有相同結構和相同行的新DataSet。 使用Clone方法會創建具有相同結構的新DataSet,但不包含任何行。
GetChanges
返回與原DataSet對象具有相同結構的新DataSet,並且還包含原DataSet中所有掛起更改的行。
GetXml和GetXmlSchema
使用GetXml方法得到由DataSet的內容與她的架構信息轉換為XML格式後的字符串。如果只希望返回架構信息,可以使用GetXmlSchema。
HasChange
表示DataSet中是否包含掛起更改的DataRow對象。
Merge
從另一個DataSet、DataTable 或現有DataSet中的-組DataRow對象載入數據。
ReadXml和WriteXml
使用ReadXml方法從文件、TextReader、數據流或者XmlReader中將XML數據載入DataSet中。
Reset
將DataSet返回為未初始化狀態。如果想放棄現有DataSet並且開始處理新的DataSet, 使用Reset方法比創建一個DataSet的新實例好。

DataSet事件

MergeFailed:在DataSet的Merge方法發生一個異常時觸發。
參考資料
  • 1.    (美)Karli Watson Christian Nagel 齊立波 譯.C#入門經典第3版:清華大學出版社,2006 年5月
  • 2.    ADO+   .NET tutorial - developer Fusion[引用日期2019-09-04]