1. 程式人生 > >ADO.NET DataSet、DataView 和 DataViewManager 物件指南

ADO.NET DataSet、DataView 和 DataViewManager 物件指南

本文提供學習和掌握 ADO.NET DataSetDataViewDataViewManager 物件的指南。

指南文章提供指向有用資訊的連結,這些資訊包括聯機文件、Microsoft 知識庫文章和 Microsoft 白皮書,目的在於幫助您瞭解 Microsoft 產品或技術。Microsoft 知識庫“如何”文章和演練提供完成具體任務的分步說明。快速入門示例檔案是用來闡釋技術的現成的程式。

有關其他 ADO.NET 技術指南文章,請單擊下面的文章編號,以檢視 Microsoft 知識庫中相應的文章: 313590 (http://support.microsoft.com/kb/313590/) INFO:ADO.NET 指南
回到頂端
回到頂端

概述

DataSet 是一個處於非連線狀態的資料儲存;無論資料來源是什麼,它都可提供一致的功能。DataSet 還是資料的關係組織(如資料庫)和資料的分層組織(如可擴充套件標記語言)之間的橋樑。

DataSet 類似於處於非連線狀態的 Recordset 物件的陣列,但 DataSet 可提供更強大的功能。DataSet 可以維護本地約束、級聯更新和刪除,並按照關係提供分層導航。與 Microsoft ActiveX 資料物件 (ADO) 相比,DataSet 還具有功能更強大的表示式計算器。這使您在搜尋和篩選記錄時更具靈活性。還可以使用 DataSet 對行版本和錯誤狀態進行低級別的控制。

DataView
可提供對單個 DataTable 進行排序和篩選的機制。DataViewManager 可在執行分層導航時,提供對多個 DataTable 物件進行排序和篩選的機制。

有關 ADO.NET DataSet 物件的更多資訊,請參考以下 Microsoft 網站:
回到頂端 回到頂端

DataSet

DataSet 物件包括下列元素:
DataTable 物件
DataColumn 物件
DataRow 物件
DataRelation
物件
ExtendedProperties 集合
DataSetDataTable 物件的集合。DataSet 還包含允許使用引用完整性、級聯更新、分層導航和聚合表示式的 DataRelation 物件的集合。

DataSet 通過以下方法提供讀寫可擴充套件標記語言 (XML) 資料和架構的功能:
InferXmlSchema
ReadXml
ReadXmlSchema
WriteXml
WriteXmlSchema
GetXml
GetXmlSchema
注意DataTableDataRow 物件無法單獨讀取或寫入 XML。Clone 方法返回與源 DataSet 具有相同架構的空 DataSetCopy 方法返回包含資料的副本。

下面的列表介紹了 DataSet 的某些方法和屬性:
HasChanges 屬性。如果任何 DataTable 物件包含已修改的記錄,則該屬性返回 True
GetChanges 方法。此方法返回只包含已更改元素的 DataSet 的副本。

可以結合 DataRowState 標誌來控制是新增、刪除還是修改記錄(或這些操作的組合)。預設情況下,返回所有更改。如果不存在任何更改,則返回 null(在 Microsoft Visual C# .NET、Microsoft Visual C++ .NET、Microsoft JScript .NET 中)或 Nothing(在 Microsoft Visual Basic .NET 中)。
Merge 方法。本方法可合併兩個 DataSet 物件。MissingSchemaAction 引數控制是否對目標 DataSet 架構進行擴充套件以匹配源 DataSet 架構、是否忽略擴充套件的架構或者擴充套件的架構是否導致異常。
如果 DataTable 物件存在主鍵,則該鍵用於根據源 DataSet 中的具有相同鍵的記錄更新目標記錄。如果不存在主鍵,則追加這些記錄,這會導致重複的記錄。
如果 PreserveChanges 引數為 True,則只合並新增的記錄(即,保留目標 DataSet 中的任何更改)。如果源 DataSet 包含已修改的記錄,則使用原來的鍵值匹配目標 DataSet 中的記錄。
CaseSensitive 屬性。此屬性確定資料是否區分大小寫;不過,也可以一個表一個表地進行此項設定。架構既可以區分大小寫,也可以不區分大小寫。當 ADO.NET 訪問某個專案時,ADO.NET 採用區分大小寫的查詢方式。如果此查詢方式失敗,ADO.NET 便換用不區分大小寫的查詢。如果有多個名稱相同的專案(這是不區分大小寫的),則您會在該區分大小寫的查詢方式失敗時收到異常。
AcceptChangesRejectChanges 方法。這兩個方法從本地提交或回滾 DataSet 中的資料更改。這兩個方法不影響架構更改。
Locale 屬性。可以使用此屬性設定 CultureInfo 物件以控制排序和搜尋。
DefaultViewManager 屬性。此屬性返回 DataSet 所維護的 DataViewManager 物件。您可以使用此物件來控制排序和篩選,也可以建立您自己的一個或多個獨立的 DataViewManager 物件。
Microsoft 知識庫“如何”文章 單擊此處可檢視與 ADO.NET DataSet 物件及其他相關物件有關的“如何”文章的列表 (http://support.microsoft.com/common/canned.aspx?r=d&h=ado.net+dataset+how+to+articles&ll=kbadonet&sz=kbhowto+and+(dataset+or+datatable+or+datacolumn+or+datarow+or+datarelation+or+constraint+or+dataview+or+dataviewmanager+or+datarowview)) Visual Studio .NET 幫助文件 MSDN 文章

以下文章摘自 Diving Into Data Access(深入探討資料訪問)專欄。 Data Relations and Relatives(資料關係和相關性)
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndive/html/data07122001.asp)

Clonation and the Case of Table Dolly, Part 1(Table Dolly 的副本和事例,第一部分)
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndive/html/data05102001.asp)

Clonation and the Case of Table Dolly, Part 2(克隆和 Table Dolly 案例,第二部分)
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndive/html/data05242001.asp) 快速入門示例 How Do I...Save DataSet mappings to an XSD schema file?(如何將 DataSet 對映儲存到 XSD 架構檔案?)
(http://samples.gotdotnet.com/quickstart/howto/doc/Xml/SaveDataSetMapXSDSchema.aspx) SaveDataSetMapXSDSchema 示例演示瞭如何在程式碼中建立 DataTable 物件及如何新增 DataRow 物件,以及如何將 XML 架構定義 (XSD) 寫入流中。 How Do I...Save a DataSet as XML?(如何將 DataSet 另存為 XML?)
(http://samples.gotdotnet.com/quickstart/howto/doc/Xml/SaveDataSetXML.aspx) SaveDataSetXML 示例演示瞭如何在程式碼中建立 DataTable、如何在程式碼中新增 DataRow 物件、如何分析 XML 節點以及如何寫入控制檯。 注意:如果在計算機上安裝了快速入門示例,則這些示例位於 /QuickStart/Howto/Samples/Xml 資料夾中。

Microsoft 知識庫“如何”文章 305346 (http://support.microsoft.com/kb/305346/) 如何使用 Visual Basic .NET 在 DataTable 之間複製 DataRow 308909 (http://support.microsoft.com/kb/308909/) 如何使用 Visual C# .NET 在資料表之間複製資料行 308058 (http://support.microsoft.com/kb/308058/) 如何使用 Visual Basic .NET 在 DataSet 中獲取擴充套件訊息 要檢視包含用來在單個函式呼叫中處理常見 DataSet 操作(例如 CREATE TABLE 和 SELECT DISTINCT 等效命令、聯接以及分組)的 Helper 函式的文章列表,請單擊以下連結: 單擊此處可檢視 DataSetHelper 的文章的完整列表 (http://support.microsoft.com/common/canned.aspx?r=d&h=ado.net+datasethelper+articles&ll=kbadonet&sz=kbhowto+and+datasethelper+and+kbadonet)

DataTable

DataTable 是元資料和資料的集合,其中,元資料是通過 DataColumn 物件和 Constraint 物件的集合描述的,而資料則包含在 DataRow 物件的集合中。DataTable 可以獨立存在,也可以是 DataSet 的一部分。

與 ADO Recordset 物件(可操作 Provider)不同,DataTable 是一個被動物件。DataAdapter 物件、XmlDataDocument 物件和使用者程式碼可操作 DataTableDataTable 不知道自己的資料來自何處。這些資料可以來自多個源。

下面的列表介紹了 DataTable 的某些方法和屬性:
AcceptChanges 方法、RejectChanges 方法、Clone 方法、Copy 方法、GetChanges 方法以及 HasChanges 屬性。這些方法和 HasChanges 屬性在操作上與它們在 DataSet 中的等效方法和屬性類似,只是它們會影響單個 DataTable,而它們的等效方法和屬性則不會。
PrimaryKey 屬性。可以使用 PrimaryKey 屬性指示哪一列或哪些列構成主鍵。
ImportRow 方法。此方法可新增來自具有相同架構的其他 DataTable 中的 DataRow 的副本。可以將此方法與 Clone 方法結合使用來複制記錄,這比單獨使用 Copy 方法更便於進行選擇。
Select 方法。此方法返回根據您提供的引數進行排序和篩選的 DataRow 物件的陣列。您還可以按行狀態進行篩選。
Constraints 屬性。此屬性是 DataTable 中唯一約束和外來鍵約束的集合。
注意DataTable 不具有 Merge 方法的等效方法。不過,為產生相同的效果,DataSetMerge 方法可獲取 DataTable 或獲取 DataRow 物件的陣列。

DataColumn

可以使用 DataColumn 定義 DataTableDataRow 中列的屬性(主要是定義 ColumnNameDataType 屬性)。DataColumn 包含 AutoNumber 和 Null 支援。

下面的列表介紹了 DataColumn 的某些屬性:
ColumnMapping 屬性。在 XmlDataDocument 操作 DataColumn 時或在 DataSet 序列化 DataColumn 時,此屬性可控制 DataColumn 物件是對映到 XML 元素,還是對映到屬性。
Unique 屬性。此屬性允許您對非主鍵列設定唯一約束。
DataColumn 可以包含基於 DataTable 中其他 DataColumn 物件的表示式。此外,DataColumn 還可以使用 DataRelation 物件引用父 DataTable 中的欄位,或者聚合子 DataTable 中的欄位。但在引用不是當前 DataTable 中的欄位時,必須在填充這些表後新增表示式列。如果嘗試使用引用其他 DataTable 的表示式更新某個 DataTable,則會收到異常。

DataRow

儘管 DataRow 可以獨立存在,但 DataTableDataRowBuilder 必須建立 DataRow。例如,可以使用 DataTableNewRow 方法建立 DataRow,也可以將 DataTable 用於 DataRowBuilder 的架構來建立 DataRow

DataRow 可以具有下列多種狀態:
未修改
已修改
已新增
已刪除
如果 DataRow 不屬於 DataTable,則其 RowState 屬性的值為 Detached,在 DataTable 中合併 DataRow 時,該值會更改為 Added

DataRow 可以具有下列多種版本:
原始
當前
建議(在編輯時)
下列方法可控制行版本:
BeginEdit
EndEdit
CancelEdit
AcceptChanges
RejectChanges
Item 集合具有允許您指定 DataRowVersion 以及要訪問的列的過載。如果您試圖引用不存在的版本,則會收到一個異常。

下面的列表介紹了 DataRow 的某些方法和屬性:
HasVersion 方法。可以使用 HasVersion 方法來測試是否有特定的 DataRowVersion 值。
已刪除的行不具有“當前”版本。
已新增的行和已分離的行不具有“原始”版本。
如果不在 BeginEditEndEditCancelEdit 塊內,則所在的行不具有“建議”版本。
GetParentRowGetParentRowsGetChildRowGetChildRows 方法。這些方法基於指定的 DataRelation 返回包含父行或子行的 DataRow 物件或 DataRow 物件的陣列。這些方法允許在各表間進行分層訪問。

注意DataRelation 物件允許在各層之間存在多種關係(即,DataRelation 不必使用唯一列)。因此,DataRow 包括 GetParentRows 方法。
HasErrorsRowError 屬性。這些屬性指示 DataRow 是否有錯。儘管 DataAdapter 通常在更新失敗後設置這些屬性,但您也可以手動設定這些屬性。

DataRelation

DataRelation 物件定義兩個 DataTable 物件之間的父/子關係。

下面的列表介紹了 DataRelation 的某些屬性:
ParentKeyConstraintChildKeyConstraint 屬性。這兩個屬性確定是否強制執行引用完整性。
Nested 屬性。此屬性確定在 DataSet 序列化為 XML 時,子表元素是否巢狀在父表內。

ExtendedProperties

DataSetDataTableDataRelationConstraint 物件均支援 ExtendedProperties 集合,可以在該集合中為物件儲存使用者定義的屬性。

回到頂端 回到頂端

DataView

可以使用 DataView 對要檢視的記錄進行排序和篩選。每個 DataTable 都具有可以訪問和設定其屬性的 DefaultView 物件。此外,還可以在 DataTable 中建立許多獨立的 DataView 物件。DataView 可建立基於已排序的列的索引,該索引通過 Find 方法提供快速搜尋功能。只能使用此 Find 方法搜尋當前已排序的列。如果按多個列對 DataView 進行排序,則必須在 Find 方法中提供一組值。

可以通過簡單的賦值,編輯 DataTable 行中各欄位的“當前”值。更改將立即進行。或者,也可以使用 BeginEdit 方法更改“建議”行版本,使用 EndEditCancelEdit 方法提交或回滾所做的更改。

不能直接在 DataView 中編輯資料行。而必須使用 BeginEditEndEditCancelEdit 方法。呼叫 EndEdit 方法後,更改將寫入 DataTable 中且可以立即使用。並通知同一 DataTable 中的其他 DataView 物件所做的更改。

預設情況下,DataView 繫結到“當前”行。可以將 DataViewRowState 傳遞到建構函式以繫結到其他行版本(例如,訪問“已刪除”記錄)。

注意:只能將 DataView 繫結到單個 DataTable。建立 DataView 後,不能讓該 DataView 篩選其他 DataTable

只要更改了篩選或排序的基礎資料,就會引發 ListChanged 事件。

Visual Studio .NET 幫助文件 MSDN 文章

以下文章摘自 Diving into Data Access(深入探討資料訪問)專欄。 Views and Filters(檢視和篩選器)
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndive/html/data06142001.asp) 本文介紹 DataViewDataViewManager 物件以及結構資訊。本文還將這些物件與 Recordset 副本做了比較。 快速入門示例 (http://samples.gotdotnet.com/quickstart/howto/doc/adoplus/FilterData.aspx) FilterData 示例使用 SqlDataAdapter 物件填充 DataSet,然後使用 DataView 篩選 DataTable注意:如果在計算機上安裝了這些快速入門示例,則這些示例位於 /QuickStart/Howto/Samples/Adoplus 資料夾中。

Microsoft 知識庫文章 325682 (http://support.microsoft.com/kb/325682/) 如何在 Visual Basic .NET 中實現自定義的 DataView 類
回到頂端 回到頂端

DataViewManager

如果通過 DataViewDataTable 導航到子記錄,則這些子記錄未經過篩選(除非與父記錄有關)。可以使用 DataViewManager 指定在執行分層導航時應用的 RowFilterSort 屬性。

例如,如果將一個 Windows 窗體 DataGrid 控制元件繫結到包含客戶和訂單列表的 DataSet,則在導航到特定客戶的訂單時,將顯示所有訂單。但是,如果將 DataGrid 繫結到 DataViewManager,並將 DataViewSetting 物件新增到 DataViewManager.DataViewSettings 集合,則可以篩選訂單列表以便只顯示超過某一金額的訂單。此外,您還可以篩選訂單列表並根據訂單金額以降序對它們進行排序。

Visual Studio .NET 幫助文件 Setting Default Table Views Using a DataViewManager(使用 DataViewManager 設定預設表檢視)
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconsettingdefaulttableviewsusingdataviewmanager.asp) MSDN 文章

本文摘自 Diving into Data Access(深入探討資料訪問)專欄。 Views and Filters(檢視和篩選器)
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndive/html/data06142001.asp) 本文介紹 DataViewDataViewManager 物件以及結構資訊。本文還將這些物件與 Recordset 副本做了比較。
回到頂端 回到頂端

疑難解答

如果遇到問題並且需要問題的答案,可以訪問 MSDN 新聞組或 Microsoft 知識庫。在 MSDN 新聞組中,可以分享同行的經驗。