1. 程式人生 > >C#:DataSet控制元件(資料控制元件)

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可以看成是一個數據的容器。