C#:DataSet控制元件(資料控制元件)
DataSet控制元件是ADO.NET結構的主要元件,它是從資料來源中檢索到的資料在記憶體中的快取。DataSet由一組DataTable物件組成,可以使這些物件與DataRelation物件互相關聯。還可以通過使用UniqueConstraint和ForeginKeyConstraint物件在DataSet中實施資料完整性。
在典型的多層實現中,用於建立和重新整理DataSet並依次更新原始資料的步驟如下:
(1)通過DataAdapter使用資料來源中的資料生成和填充DataSet中的每個DataTable。
(2)通過新增、更新或刪除DataRow物件更改單個的DataTable物件中的資料。
(3)呼叫GetChanges方法建立只反映對資料進行更改的第二個DataSet。
(4)呼叫DataAdapter的Update方法,並將第二個DataSet作為引數傳遞。
(5)呼叫Merge方法將第二個DataSet中的更改合併到第一個中。
(6)針對DataSet呼叫AcceptChanges接受更改,或者呼叫RejectChanges取消更改。
DataSet控制元件的常用屬性及說明
屬性 |
說明 |
CaseSensitive |
確定DataTable物件中的字串比較是否區分大小寫。預設請款下,為DataSet設定CaseSensitive屬性時還將每個相關的DataTable的CaseSensitive屬性設定為同一個值。而且,這個屬性只對字母有效,對中文和數字就不起作用 |
DataSetName |
獲取或設定當前DataSet的名稱。如果不指定,則該屬性值設定為NewDataset。如果將DataSet內容寫入XML檔案,DataSetName是XML檔案的根節點名稱 |
DesignMode |
如果在設計時使用元件中的DataSet,DesignMode返回True,否則返回False |
DefaultViewManager |
獲取DataSet所包含的資料的自定義檢視,以便使用自定義的DataViewManager進行篩選、搜尋和導航 |
DataViewManager |
獲取與當前檢視關聯的DataViewManager。如果當前檢視是DataTable預設的DataView,則DataViewManager屬性返回DataSet的預設DataViewManager;否則,如果DataView沒有使用DataViewManager,則該屬性為空引用 |
EnforceConstraints |
確定在嘗試執行任何更新操作時是否遵循約束規則。如果遵循約束規則,則為true;否則為false。預設為true。 |
ForeignKeyConstraint |
強制使用有關如何對相關表所做更新和刪除進行傳播的規則。ForeignKeyConstraint的DeleteRule和UpdateRule屬性定義在使用者試圖刪除或更新相關表中某行時採取的操作 |
ExtendedProperties |
用於獲取與DataSet相關的自定義資訊,通常用這個屬性儲存自定義使用者資訊 |
Relations |
獲取用於將錶鏈接起來並允許從父表瀏覽到子表的關係的集合 |
RemotingFormat |
為遠端處理期間使用的DataSet獲取或設定SerializationFormat,可用值由系統列舉值確定,包括Binary(作為二進位制內容序列化)和Xml(作為Xml內容序列化,預設值) |
Tables |
檢查現有的DataTable物件。通過索引訪問DataTable有更好的效能 |
HasErrors |
表示DataSet中的DataRow物件是否包含錯誤。如果將一批更改提交給資料庫並將DataAdapt物件的ContinueUpdateOnError屬性設定為True,則在提交更改後必須檢查DataSet的HasErrors屬性,以確定是否有更新失敗 |
[補充]:屬性說明
►ForeignKeyConstraint屬性
ForeignKeyConstraint可以限制並傳播對相關欄位的更改。根據為欄位的ForeignKeyConstraint設定的屬性,並且如果DataSet的EnforceConstraints屬性是True,對父行執行某些特定操作將會導致異常(例如,如果ForeignKeyConstraint的DeleteRule屬性是None,那麼在父行有子行的情況下,則無法刪除父行)。
DeleteRule和UpdateRule不同屬性的設定 |
|
屬性值 |
說明 |
Cascade |
刪除或更新相關的行 |
SetNull |
將相關行中的值設定為DBNull |
SetDefault |
將相關行中的值設定為預設值 |
None |
對相關行不執行任何操作,這是預設設定 |
[注]:ADO.NET中有兩種約束:ForeignKeyConstraint和UniqueConstraint。預設情況下,通過將DataRelation新增到DataSet來建立兩個或多個表之間的關係時,兩種約束都會自動建立。但是,也可以在建立關係時,通過指定createConstraints=false禁用這一行為。
DateSet控制元件的常用方法及屬性
方法 |
說明 |
AcceptChanges |
提交自載入DateSet或上次呼叫AcceptChanges以來對其進行的所有更改 |
Clear |
通過移除所有表中的所有行來清除任何資料的DataSet |
Clone |
複製DataSet的結構,包括所有DataTable架構、關係和約束。不要複製任何資料 |
Copy |
複製DataSet的結構和資料 |
GetXml |
返回儲存在DataSet中的資料的XML表示形式 |
GETXMLSchema |
返回儲存在DataSet中的資料的XML表示形式的XML架構 |
HasChanges |
獲取一個值,該值指示DataSet是否有更改,包括新增行、已刪除的行或已修改的行 |
RejectChanges |
回滾自建立DataSet以來或上次呼叫DataSet.AcceptChanges以來對其進行的所有更改 |
Merge |
將指定的DataSet、DataTable或DataRow物件的數組合併到當前的DataSet或DataTable中 |
1、建立DataSet
(1)新建:可以指定一個名稱引數,如果沒有為DataSet指定名稱,則預設設定為”NewDataSet”。程式碼如下:
DataSet customerDS = new DataSet( ”customer”);
(2)複製:
►DataSet的原樣副本,其中包含架構、資料、行狀態資訊和行版本。程式碼如下:
DataSet copyDataSet = customerDS.Copy();
►建立包含現有DataSet的架構但僅包含已修改行的DataSet。可以返回已修改的所有行或者指定特定的DataRowState。程式碼如下:
// Copy all changes.
DataSet changeDS = customerDS.GetChanges();
// Copy only new rows.
DataSet addedDS =customerDS.GetChanges(DataRowState.Added);
►僅複製 DataSet 的架構(即關係結構),而不復制任何行。可以使用 ImportRow 將行匯入現有 DataTable。程式碼如下:
DataSet gCustomers = customerDS.Clone();
2、 向 DataSet 新增 DataTable
以下示例構造一個DataSet,將一個新的DataTable 物件新增到該 DataSet 中,然後將三個 DataColumn 物件新增到該表中。最後,該程式碼將一個列設定為主鍵列。
DataSet customerDS = newDataSet("CustomerDS");
DataTable orderTable =customerDS.Tables.Add("Orders");
DataColumn pkOrderID =orderTable.Columns.Add("OrderID", typeof(Int32));
orderTable.Columns.Add("OrderQuantity",typeof(Int32));
orderTable.Columns.Add("CompanyName",typeof(string));
orderTable.PrimaryKey = new DataColumn[] {pkOrderID };
[注]:對DataSet的任何操作,都是在計算機快取中完成的。在從資料庫完成資料讀取後,DataSet就是資料的存放地,它是各種資料來源中的資料在計算機記憶體中對映成的快取,所以DataSet可以看成是一個數據的容器。