類型化數(shù)據(jù)集與非類型化數(shù)據(jù)集
類型化數(shù)據(jù)集先是從基類 DataSet 派生,然后使用“數(shù)據(jù)集設計器”中的信息(存儲在 .xsd 文件中)生成一個新的強類型數(shù)據(jù)集類。架構中的信息(表、列等)被作為一組第一類對象和屬性生成并編譯為此新數(shù)據(jù)集類。由于類型化數(shù)據(jù)集繼承自基 DataSet 類,因此類型化類具有 DataSet 類的所有功能,可以與采用 DataSet 類的實例作為參數(shù)的方法一起使用。
相形之下,非類型化數(shù)據(jù)集沒有相應的內(nèi)置架構。與類型化數(shù)據(jù)集一樣,非類型化數(shù)據(jù)集也包含表、列等,但它們只作為集合公開。(不過,在手動創(chuàng)建了非類型化數(shù)據(jù)集中的表和其他數(shù)據(jù)元素后,可以使用數(shù)據(jù)集的 WriteXmlSchema 方法將數(shù)據(jù)集的結構導出為一個架構。)
對比類型化和非類型化數(shù)據(jù)集中的數(shù)據(jù)訪問
類型化數(shù)據(jù)集的類有一個對象模型,在此對象模型中該類的屬性采用表和列的實際名稱。例如,如果使用的是類型化數(shù)據(jù)集,可以使用如下代碼引用列:
// This accesses the CustomerID column in the first row of the Customers table.
string customerIDValue = northwindDataSet.Customers[0].CustomerID;
相比較而言,如果使用的是非類型化數(shù)據(jù)集,等效的代碼為:
string customerIDValue = (string)
dataset1.Tables["Customers"].Rows[0]["CustomerID"];
類型化訪問不但更易于讀取,而且完全受 Visual Studio“代碼編輯器”中 IntelliSense 的支持。除了更易于使用外,類型化數(shù)據(jù)集的語法還在編譯時提供類型檢查,從而大大降低了為數(shù)據(jù)集成員賦值時發(fā)生錯誤的可能性。如果更改 DataSet 中的列名并編譯應用程序,則會收到生成錯誤。通過雙擊“任務列表”中的生成錯誤,可以直接轉到引用舊列名的代碼行。在運行時對類型化數(shù)據(jù)集中的表和列的訪問也略為快一些,因為訪問是在編譯時確定的,而不是在運行時通過集合確定。
盡管類型化數(shù)據(jù)集有許多優(yōu)點,但在許多情況下需要使用非類型化數(shù)據(jù)集。最顯而易見的情形是數(shù)據(jù)集無架構可用。例如,當應用程序正在與返回數(shù)據(jù)集的組件交互而您事先不知道其結構是哪種時,便會出現(xiàn)這種情況。同樣,有些時候使用的數(shù)據(jù)不具有靜態(tài)的可預知結構,這種情況下使用類型化數(shù)據(jù)集是不切實際的做法,因為對于數(shù)據(jù)結構中的每個更改,您都必須重新生成類型化數(shù)據(jù)集類。
更常見的是,許多時候可能需要動態(tài)創(chuàng)建無可用架構的數(shù)據(jù)集。這種情況下,數(shù)據(jù)集只是一種方便的、可用來保留信息的結構(只要數(shù)據(jù)可以用關系方法表示)。同時,您還可以利用數(shù)據(jù)集的功能,如序列化傳遞到另一進程的信息或寫出 XML 文件的能力。
----來自MSDN