ADO.NET DataSet、DataView 和 DataViewManager 物件指南
阿新 • • 發佈:2019-02-18
本文提供學習和掌握 ADO.NET DataSet、DataView 和 DataViewManager 物件的指南。
指南文章提供指向有用資訊的連結,這些資訊包括聯機文件、Microsoft 知識庫文章和 Microsoft 白皮書,目的在於幫助您瞭解 Microsoft 產品或技術。Microsoft 知識庫“如何”文章和演練提供完成具體任務的分步說明。快速入門示例檔案是用來闡釋技術的現成的程式。
有關其他 ADO.NET 技術指南文章,請單擊下面的文章編號,以檢視 Microsoft 知識庫中相應的文章: 313590 (http://support.microsoft.com/kb/313590/) INFO:ADO.NET 指南
DataSet 類似於處於非連線狀態的 Recordset 物件的陣列,但 DataSet 可提供更強大的功能。DataSet 可以維護本地約束、級聯更新和刪除,並按照關係提供分層導航。與 Microsoft ActiveX 資料物件 (ADO) 相比,DataSet 還具有功能更強大的表示式計算器。這使您在搜尋和篩選記錄時更具靈活性。還可以使用 DataSet 對行版本和錯誤狀態進行低級別的控制。
DataView 可提供對單個 DataTable 進行排序和篩選的機制。DataViewManager 可在執行分層導航時,提供對多個 DataTable 物件進行排序和篩選的機制。
有關 ADO.NET DataSet 物件的更多資訊,請參考以下 Microsoft 網站:
DataSet 是 DataTable 物件的集合。DataSet 還包含允許使用引用完整性、級聯更新、分層導航和聚合表示式的 DataRelation 物件的集合。
DataSet 通過以下方法提供讀寫可擴充套件標記語言 (XML) 資料和架構的功能:
注意:DataTable 和 DataRow 物件無法單獨讀取或寫入 XML。Clone 方法返回與源 DataSet 具有相同架構的空 DataSet。Copy 方法返回包含資料的副本。
下面的列表介紹了 DataSet 的某些方法和屬性:
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)
與 ADO Recordset 物件(可操作 Provider)不同,DataTable 是一個被動物件。DataAdapter 物件、XmlDataDocument 物件和使用者程式碼可操作 DataTable。DataTable 不知道自己的資料來自何處。這些資料可以來自多個源。
下面的列表介紹了 DataTable 的某些方法和屬性:
注意:DataTable 不具有 Merge 方法的等效方法。不過,為產生相同的效果,DataSet 的 Merge 方法可獲取 DataTable 或獲取 DataRow 物件的陣列。
下面的列表介紹了 DataColumn 的某些屬性:
DataColumn 可以包含基於 DataTable 中其他 DataColumn 物件的表示式。此外,DataColumn 還可以使用 DataRelation 物件引用父 DataTable 中的欄位,或者聚合子 DataTable 中的欄位。但在引用不是當前 DataTable 中的欄位時,必須在填充這些表後新增表示式列。如果嘗試使用引用其他 DataTable 的表示式更新某個 DataTable,則會收到異常。
DataRow 可以具有下列多種狀態:
如果 DataRow 不屬於 DataTable,則其 RowState 屬性的值為 Detached,在 DataTable 中合併 DataRow 時,該值會更改為 Added。
DataRow 可以具有下列多種版本:
下列方法可控制行版本:
Item 集合具有允許您指定 DataRowVersion 以及要訪問的列的過載。如果您試圖引用不存在的版本,則會收到一個異常。
下面的列表介紹了 DataRow 的某些方法和屬性:
下面的列表介紹了 DataRelation 的某些屬性:
可以通過簡單的賦值,編輯 DataTable 行中各欄位的“當前”值。更改將立即進行。或者,也可以使用 BeginEdit 方法更改“建議”行版本,使用 EndEdit 或 CancelEdit 方法提交或回滾所做的更改。
不能直接在 DataView 中編輯資料行。而必須使用 BeginEdit、EndEdit 和 CancelEdit 方法。呼叫 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) 本文介紹 DataView 和 DataViewManager 物件以及結構資訊。本文還將這些物件與 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 類
例如,如果將一個 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) 本文介紹 DataView 和 DataViewManager 物件以及結構資訊。本文還將這些物件與 Recordset 副本做了比較。
指南文章提供指向有用資訊的連結,這些資訊包括聯機文件、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
有關 ADO.NET DataSet 物件的更多資訊,請參考以下 Microsoft 網站:
回到頂端 |
DataSet
DataSet 物件包括下列元素:• | DataTable 物件 |
• | DataColumn 物件 |
• | DataRow 物件 |
• | DataRelation |
• | ExtendedProperties 集合 |
DataSet 通過以下方法提供讀寫可擴充套件標記語言 (XML) 資料和架構的功能:
• | InferXmlSchema |
• | ReadXml |
• | ReadXmlSchema |
• | WriteXml |
• | WriteXmlSchema |
• | GetXml |
• | GetXmlSchema |
下面的列表介紹了 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 架構、是否忽略擴充套件的架構或者擴充套件的架構是否導致異常。
|
||||
• | CaseSensitive 屬性。此屬性確定資料是否區分大小寫;不過,也可以一個表一個表地進行此項設定。架構既可以區分大小寫,也可以不區分大小寫。當 ADO.NET 訪問某個專案時,ADO.NET 採用區分大小寫的查詢方式。如果此查詢方式失敗,ADO.NET 便換用不區分大小寫的查詢。如果有多個名稱相同的專案(這是不區分大小寫的),則您會在該區分大小寫的查詢方式失敗時收到異常。 | ||||
• | AcceptChanges 和 RejectChanges 方法。這兩個方法從本地提交或回滾 DataSet 中的資料更改。這兩個方法不影響架構更改。 | ||||
• | Locale 屬性。可以使用此屬性設定 CultureInfo 物件以控制排序和搜尋。 | ||||
• | DefaultViewManager 屬性。此屬性返回 DataSet 所維護的 DataViewManager 物件。您可以使用此物件來控制排序和篩選,也可以建立您自己的一個或多個獨立的 DataViewManager 物件。 |
以下文章摘自 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 物件和使用者程式碼可操作 DataTable。DataTable 不知道自己的資料來自何處。這些資料可以來自多個源。
下面的列表介紹了 DataTable 的某些方法和屬性:
• | AcceptChanges 方法、RejectChanges 方法、Clone 方法、Copy 方法、GetChanges 方法以及 HasChanges 屬性。這些方法和 HasChanges 屬性在操作上與它們在 DataSet 中的等效方法和屬性類似,只是它們會影響單個 DataTable,而它們的等效方法和屬性則不會。 |
• | PrimaryKey 屬性。可以使用 PrimaryKey 屬性指示哪一列或哪些列構成主鍵。 |
• | ImportRow 方法。此方法可新增來自具有相同架構的其他 DataTable 中的 DataRow 的副本。可以將此方法與 Clone 方法結合使用來複制記錄,這比單獨使用 Copy 方法更便於進行選擇。 |
• | Select 方法。此方法返回根據您提供的引數進行排序和篩選的 DataRow 物件的陣列。您還可以按行狀態進行篩選。 |
• | Constraints 屬性。此屬性是 DataTable 中唯一約束和外來鍵約束的集合。 |
DataColumn
可以使用 DataColumn 定義 DataTable 或 DataRow 中列的屬性(主要是定義 ColumnName 和 DataType 屬性)。DataColumn 包含 AutoNumber 和 Null 支援。下面的列表介紹了 DataColumn 的某些屬性:
• | ColumnMapping 屬性。在 XmlDataDocument 操作 DataColumn 時或在 DataSet 序列化 DataColumn 時,此屬性可控制 DataColumn 物件是對映到 XML 元素,還是對映到屬性。 |
• | Unique 屬性。此屬性允許您對非主鍵列設定唯一約束。 |
DataRow
儘管 DataRow 可以獨立存在,但 DataTable 或 DataRowBuilder 必須建立 DataRow。例如,可以使用 DataTable 的 NewRow 方法建立 DataRow,也可以將 DataTable 用於 DataRowBuilder 的架構來建立 DataRow。DataRow 可以具有下列多種狀態:
• | 未修改 |
• | 已修改 |
• | 已新增 |
• | 已刪除 |
DataRow 可以具有下列多種版本:
• | 原始 |
• | 當前 |
• | 建議(在編輯時) |
• | BeginEdit |
• | EndEdit |
• | CancelEdit |
• | AcceptChanges |
• | RejectChanges |
下面的列表介紹了 DataRow 的某些方法和屬性:
• | HasVersion 方法。可以使用 HasVersion 方法來測試是否有特定的 DataRowVersion 值。
|
||||||
• | GetParentRow、GetParentRows、GetChildRow 和 GetChildRows 方法。這些方法基於指定的 DataRelation 返回包含父行或子行的 DataRow 物件或 DataRow 物件的陣列。這些方法允許在各表間進行分層訪問。 注意:DataRelation 物件允許在各層之間存在多種關係(即,DataRelation 不必使用唯一列)。因此,DataRow 包括 GetParentRows 方法。 |
||||||
• | HasErrors 和 RowError 屬性。這些屬性指示 DataRow 是否有錯。儘管 DataAdapter 通常在更新失敗後設置這些屬性,但您也可以手動設定這些屬性。 |
DataRelation
DataRelation 物件定義兩個 DataTable 物件之間的父/子關係。下面的列表介紹了 DataRelation 的某些屬性:
• | ParentKeyConstraint 和 ChildKeyConstraint 屬性。這兩個屬性確定是否強制執行引用完整性。 |
• | Nested 屬性。此屬性確定在 DataSet 序列化為 XML 時,子表元素是否巢狀在父表內。 |
ExtendedProperties
DataSet、DataTable、DataRelation 和 Constraint 物件均支援 ExtendedProperties 集合,可以在該集合中為物件儲存使用者定義的屬性。回到頂端 |
DataView
可以使用 DataView 對要檢視的記錄進行排序和篩選。每個 DataTable 都具有可以訪問和設定其屬性的 DefaultView 物件。此外,還可以在 DataTable 中建立許多獨立的 DataView 物件。DataView 可建立基於已排序的列的索引,該索引通過 Find 方法提供快速搜尋功能。只能使用此 Find 方法搜尋當前已排序的列。如果按多個列對 DataView 進行排序,則必須在 Find 方法中提供一組值。可以通過簡單的賦值,編輯 DataTable 行中各欄位的“當前”值。更改將立即進行。或者,也可以使用 BeginEdit 方法更改“建議”行版本,使用 EndEdit 或 CancelEdit 方法提交或回滾所做的更改。
不能直接在 DataView 中編輯資料行。而必須使用 BeginEdit、EndEdit 和 CancelEdit 方法。呼叫 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) 本文介紹 DataView 和 DataViewManager 物件以及結構資訊。本文還將這些物件與 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
如果通過 DataView 或 DataTable 導航到子記錄,則這些子記錄未經過篩選(除非與父記錄有關)。可以使用 DataViewManager 指定在執行分層導航時應用的 RowFilter 和 Sort 屬性。例如,如果將一個 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) 本文介紹 DataView 和 DataViewManager 物件以及結構資訊。本文還將這些物件與 Recordset 副本做了比較。
回到頂端 |