共用方式為


資料集簡介

資料集將資料儲存在中斷連接的快取區中。資料集的結構和關聯式資料庫類似;其中顯露出資料表、資料列及資料行的階層式物件模型 (Object Model)。除此之外,它還包含為資料集所定義的條件約束 (Constraint) 和關聯性。

**注意   **如果您要在與資料來源中斷連接時使用一組資料表和資料列,就請使用資料集。使用資料集並不一定都是設計資料存取的最佳化方案。如需詳細資訊,請參閱資料存取策略的建議事項

您可以使用以下 .NET Framework 命名空間 (Namespace) 的部份來建立並操作資料集。

資料集命名空間

資料集的主要部份,是透過標準的程式設計建構 (例如屬性和集合) 而顯露出來。例如:

資料集、結構描述及 XML

每個 ADO.NET Datasets 都是一個檢視,也就是以 XML 表示資料的關聯式檢視。在 Visual Studio 和 .NET Framework 中,XML 是儲存和傳輸各種資料的格式。因此,資料集和 XML 即為相似。資料集和 XML 之間的關聯性讓您可利用資料集的下列功能:

  • 資料集的結構,包括資料表、資料行、關聯性和條件約束,都可以在 XML 結構描述中定義。XML 結構描述是 W3C (全球資訊網協會) 定義 XML 資料結構的標準格式。資料集可讀取和寫入使用 ReadXmlSchemaWriteXmlSchema 方法儲存結構化資訊的結構描述。如果沒有可用的結構描述,資料集可從關聯式方式所結構化 XML 文件中的資料推論結構描述 (透過其 InferXmlSchema 方法)。如需資料集和結構描述的詳細資訊,請參閱 XML 結構描述簡介
  • 您可以產生加入結構描述資訊的資料集類別,以便能夠將其資料結構 (例如資料表和資料行) 定義為類別成員 (請參閱以下的「型別與不具型別的資料集」)。
  • 您可使用資料集的 ReadXML 方法來將 XML 文件或資料流讀入資料集,也可以使用資料集的 WriteXML 方法來將資料集讀出為 XML。因為 XML 是不同應用程式之間資料的標準交換格式,這表示您可載入其他應用程式傳送的 XML 格式資料集。同樣地,資料集也可將其資料寫出為 XML 資料流或文件,以便與其他應用程式共用,或只是將其以標準格式儲存。
  • 您可以建立資料集內容的 XML 檢視 (XMLDataDocument 物件),然後使用關聯式方法 (透過資料集) 或 XML 方法來檢視並操作資料。這兩種檢視都會在變更時自動同步 (Synchronize)。

型別與不具型別

資料集可以是型別或不具型別。型別資料集是先從基底 (Base) DataSet 類別衍生,然後使用 XML 結構描述檔 (.xsd 檔) 中的資訊來產生新類別的一種資料集。接著會產生來自於結構描述的資訊 (資料表、資料行等等) 並將其編譯至這個新的資料集類別,成為一組最高級的物件和屬性。

**注意   **如需資料集結構描述的詳細資訊,請參閱 XML 結構描述和資料

由於型別 DataSet 類別是繼承自基底 DataSet 類別,因此型別類別會採用 DataSet 類別的所有功能,而且也可與使用 DataSet 類別執行個體為參數的方法一起使用。

相反地,不具型別的資料集並沒有對應的內建結構描述。就像型別資料集一樣,不具型別的資料集也包含資料表、資料行等等,但這些都只顯露為集合 (不過,在不具型別的資料集當中手動建立資料表和其他資料項目之後,您可使用資料集的 WriteXmlSchema 方法來將資料集的結構以結構描述匯出)。

您可在應用程式中使用任一種資料集。但 Visual Studio 對型別資料集有較多的工具支援,而且這種資料集讓使用資料集程式設計更為容易且較不會出現錯誤。

對照型別與不具型別資料集的資料存取

型別資料集的類別具有物件模型,其中的資料表和資料行會成為物件模型中最高級的物件。例如,如果您使用型別資料集,您可使用下列程式碼來參考資料行:

' Visual Basic
' This accesses the CustomerID column in the first row of 
' the Customers table.
Dim s As String
s = dsCustomersOrders1.Customers(0).CustomerID

// C#
// This accesses the CustomerID column in the first row of 
// the Customers table.
string s;
s = dsCustomersOrders1.Customers[0].CustomerID;

相反地,如果您使用不具型別的資料集,對等的程式碼則如下:

' Visual Basic
Dim s As String
s = CType(dsCustomersOrders1.Tables("Customers").Rows(0).Item("CustomerID"), String)

// C#
string s = (string) dsCustomersOrders1.Tables["Customers"].Rows[0]["CustomerID"];

型別存取不但較容易讀取,而且 Visual Studio 程式碼編輯器中的 IntelliSense 也完全支援。除了較容易使用之外,型別資料集的語法還提供編譯時間的型別檢查 (Type Checking),對於指派值給資料集成員的方面能夠大幅減少出現錯誤的可能性。存取型別資料集當中的資料表和資料行在 Run Time 時也稍快些,這是因為存取是在編譯時間決定,而非透過 Run Time 時的集合來決定。

雖然型別資料集有許多優點,不過在多種情況下,不具型別的資料集還是相當有用的。最明顯的案例就是資料集沒有可用的結構描述。例如,如果您的應用程式與傳回資料集的元件互動,但您事前並不知道其結構為何,這很可能就會發生上述情況。同樣地,有時您會使用結構為靜態 (Static) 且無法預期的資料,在這種情況下,使用型別資料集就沒有用,因為您可能需要在資料結構一變更時就要重新產生型別資料類別。

更常見的情況是,您可能要動態建立不用結構描述的資料集。在這種情況下,只要資料可以關聯式方法表示,資料集只不過是可儲存資訊的方便結構而已。同時,您也可利用資料集的功能,例如將資料序列化以傳遞至其他處理序或寫出 XML 檔案的能力。

資料集大小寫區分性

資料集內的資料表和資料行名稱依預設是不區分大小寫的。也就是說,資料集當中名為「Customers」的資料表也代表「customers」。這符合許多資料集當中的命名規格,包括 SQL Server,其中資料項目的名稱無法只由大小寫來分別。

**注意   **與資料集不同的是,XML 文件需區分大小寫,因此在結構描述中定義的資料項目名稱也必須區分大小寫。例如,結構描述通訊協定 (Protocol) 允許結構描述包含和定義名為「Customers」的資料表和另一個名為「customers」的不同資料表。使用結構描述來產生資料集類別時,就會發生名稱衝突。如需詳細資訊,請參閱 XML 項目、屬性 (Attribute) 和型別

不過,大小寫區分性可以是資料集當中解譯資料的要素之一。例如,如果您要篩選資料集資料表當中的資料,則搜尋準則會因是否比較大小寫而可能傳回不同的結果。您可以控制篩選、搜尋及排序的大小寫區分性,方式是設定資料集的 CaseSensitive 屬性。資料集當中所有資料表都會依預設繼承這個屬性的值 (您可以為個別資料表覆寫這個屬性)。

填入資料集

資料集是一種容器,因此,您需要以資料來填滿它。當您填入 (Populate) 資料集時,會引發各種事件並會套用條件約束檢查等等。如需更新資料集和有關更新問題的詳細資訊,請參閱 Visual Studio .NET 中的資料集更新

您可利用下列幾種方式來填入資料集:

  • 呼叫資料配接器的 Fill 方法。這會讓配接器執行 SQL 陳述式或預存程序 (Stored Procedure),並將結果填滿資料集當中的資料表。如果資料集包含多個資料表,則每個資料表就可能有個別的資料配接器,因此您就必須個別呼叫每個配接器的 Fill 方法。

    如需如何填滿資料集的詳細資訊,請參閱資料配接器簡介建立資料配接器。如需如何使用資料配接器填入資料集的詳細資訊,請參閱從 DataAdapter 填入 DataSet

  • 手動填入資料集當中的資料表,方式是建立 DataRow 物件,並將其加入至資料表的 Rows 集合。(您只能在 Run Time 這麼做;您無法在設計階段設定 Rows 集合)。如需詳細資訊,請參閱將資料加入資料表

  • 將 XML 文件或資料流讀入資料集。如需詳細資訊,請參閱 ReadXml 方法。

  • 合併 (複製) 其他資料集的內容。如果您的應用程式從不同來源 (例如不同 XML Web Service) 取得資料集,這種案例會很有用,但需要將這些資料集合併至單一資料集。如需詳細資訊,請參閱 DataSet.Merge 方法。

資料集當中的資料錄位置和巡覽

由於資料集對資料來說是完全中斷連接的容器,因此資料集 (不同於 ADO 資料錄集 (Recordset)) 並不需要或不支援目前資料錄的概念。反而是資料集當中的所有資料錄都是可用的。

由於沒有目前資料錄,因此並沒有特定的屬性來指向目前資料錄,也沒有方法或屬性來從一個資料錄移動至另一個。(相較之下,ADO 資料錄集支援絕對資料錄位置以及從一資料錄移動至下一資料錄的方法)。您可將資料集當中的個別資料表當作物件存取;每個資料表都會顯露資料列的集合。您可以將這個集合視為任一個集合來處理,透過集合的索引或使用程式語言中特定集合的陳述式來存取資料列。

**注意   **如果您將 Windows Form 中的控制項 (Control) 繫結至資料集,您可使用表單的繫結架構來簡化個別資料錄的存取。如需詳細資訊,請參閱在 Windows Form 中巡覽資料

關聯資料表和 DataRelation 物件

如果您在資料集當中有多個資料表,資料表中的資訊可能相關連。資料集本身並不知道這種關聯性;因此,若要使用關聯資料表中的資料,您可建立 DataRelation 物件來說明資料集當中資料表之間的關聯。DataRelation 物件可用來以程式為父資料錄擷取相關子資料錄,也可從子資料錄擷取父資料錄。

例如,假設在 Northwind 資料庫中包含客戶和訂單資料。Customers 資料表可能包含的資料錄如下:

CustomerID   CompanyName               City
ALFKI        Alfreds Futterkiste       Berlin
ANTON        Antonio Moreno Taquerias  Mexico D.F.
AROUT        Around the Horn           London

資料集也可能包含另一個具有訂單資訊的資料表。Orders 資料表包含某客戶 ID,可作為外部索引鍵資料行。僅選取 Orders 資料表中的某些資料行,看起來會像這樣:

OrderId    CustomerID    OrderDate
10692      ALFKI         10/03/1997
10702      ALFKI         10/13/1997
10365      ANTON         11/27/1996
10507      ANTON         4/15/1997

由於每位客戶可能有多個訂單,因此客戶和訂單之間為一對多關聯性 (One-To-Many Relationship)。例如,在上述資料表中,客戶 ALFKI 有兩個訂單。

您可使用 DataRelation 物件來從子或父資料表取得關聯資料錄。例如,在您使用說明客戶 ANTON 的資料錄時,可取得說明這位客戶所下訂單的資料錄集合。同樣地,如果您使用說明訂單編號 10507 的資料錄,可使用 DataRelation 物件來取得說明訂單客戶 (ANTON) 的資料錄。

條件約束

就像多數資料庫,資料集也支援條件約束以確保資料的完整性。條件約束是在資料表中插入、更新或刪除資料列時所套用的規則 (Rule)。您可定義兩種條件約束:

  • 唯一的條件約束 (Unique Constraint),檢查資料行當中的新值是否在資料表中是唯一的。
  • 外部索引鍵的條件約束,用來定義當更新或刪除主要資料表中的資料錄時,關聯子資料錄應如何更新的規則。

在資料集中,條件約束與個別資料表 (外部索引鍵的條件約束) 或資料行 (唯一的條件約束,保證資料行值是唯一的) 相關聯。條件約束是實作為 UniqueConstraintForeignKeyConstraint 型別的物件。接下來將這些物件加入至資料表的 Constraints 集合。另外,只要將資料行的 Unique 屬性設定為 true,也可指定唯一的條件約束。

資料集本身支援布林 (Boolean) EnforceConstraints 屬性,可指定是否要使用條件約束。在預設情況下,這個屬性應設定為 true。不過在某些情況下,暫時關閉條件約束卻十分有效。這通常是在變更資料錄的方式會暫時導致無效狀態時使用。當完成變更 (並因此回到有效狀態) 之後,您可重新啟用條件約束。

在 Visual Studio 中,您可在定義資料集時隱含建立條件約束。藉由將主索引鍵加入至資料集,您可為主索引鍵資料行隱含建立唯一的條件約束。您可以將其他資料行的 Unique 屬性設定為 true,以便為其指定唯一的條件約束。

您可以在資料集當中建立 DataRelation 物件來建立外部索引鍵的條件約束。除了允許您利用程式取得關聯資料錄的資訊之外,DataRelation 物件還允許您定義外部索引鍵的條件約束規則。

如需將 DataRelation 物件當作外部索引鍵條件約束使用,請參閱 DataRelation 物件簡介。如需以程式設計的方式建立條件約束的詳細資訊,請參閱將條件約束加入至資料表

更新資料集和資料儲存

在變更資料集當中的資料錄時,必須將變更寫回資料庫。若要將變更從資料集寫入資料庫,您必須呼叫資料配接器 (在資料集與其對應資料來源之間通訊) 的 Update 方法。

用來操作個別資料錄的 DataRow 類別包含 RowState 屬性,其值是用來指示第一次從資料庫載入資料資料表之後是否已變更以及如何變更資料列。可能的值包括 DeletedModifiedNewUnchangedUpdate 方法會檢查 RowState 屬性的值來判斷哪些資料錄需要寫入資料庫,以及應叫用 (Invoke) 哪個特定資料庫命令 (加入、編輯、刪除)。

如需更新資料的詳細資訊,請參閱 Visual Studio .NET 中的資料集更新

請參閱

使用 ADO.NET 存取資料簡介 | 資料配接器簡介 | 建立資料集的 Visual Studio 工具 | 利用元件設計工具建立型別資料集 | 建立 XML 結構描述和資料集 | 將現有型別資料集加入至表單或元件 | 將不具型別的資料集加入至表單或元件 | 資料逐步解說