DataSet

DataSet

DataSet是ADO.NET的中心概念。可以把DataSet當成內存中的資料庫,DataSet是不依賴於資料庫的獨立數據集合。所謂獨立,就是說,即使斷開數據鏈路,或者關閉資料庫,DataSet依然是可用的,DataSet在內部是用XML來描述數據的,由於XML是一種與平台無關、與語言無關的數據描述語言,而且可以描述複雜關係的數據,比如父子關係的數據,所以DataSet實際上可以容納具有複雜關係的數據,而且不再依賴於資料庫鏈路。

概述


程序編程屏蔽據庫差異,獲致編程模型。支持、系、據約束,關係資料庫的模型基本一致。
  . 構組件,據源檢索據存緩存。 組 DataTable 對象組成,您可使這些對象與 DataRelation 對象互相關聯。您還可通過使用 UniqueConstraint 和 ForeignKeyConstraint 對象在 DataSet 中實施數據完整性。有關使用 DataSet 對象的詳細信息,請參見。
儘管  包含據,  允您遍覽層構。包含  屬訪  。訪  ,請注按件區。例,  “datatable”,另一個被命名為“Mydatatable”,則用於搜索其中一個表的字元串被認為是區分大小寫的。但是,如果“mydatatable”存在而“Mydatatable”不存在,則認為該搜索字元串不區分大小寫。有關使用 DataTable 對象的更多信息,請參見 創建 DataTable。
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所有數據都載入在內存上執行的,可以提高數據訪問速度,提高硬碟數據的安全性。極大的改善了程序運行的速度和穩定性。

數據模型


因為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。

三大特性


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

使用方法


在實際應用中,DataSet使用方法一般有三種:
(1)把資料庫中的數據通過DataAdapter對象填充DataSet。
(2)通過DataAdapter對象操作DataSet實現更新資料庫。
(3)把XML數據流或文本載入到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 有更好的性能。

方法


AcceptChanges和RejectChanges
接受或放棄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的新實例好。

事件


MergeFailed:在DataSet的Merge方法發生一個異常時觸發。