WCF分布式開發步步為贏(8):使用數據集、數據表、集合傳遞數據
[2] 集合(Collection)
[3] 示例代碼分析
數據集(DataSet)、數據表(DataTable)、集合(Collection)概念是.NET FrameWork里提供數據類型,在應用程序編程過程中會經常使用其來作為數據的載體,屬于ADO.NET的一部分。今天我們WCF分布式開發步步為贏第8節的內容:使用數據集(DataSet)、數據表(DataTable)、集合(Collection)傳遞數據。本節內容除了介紹幾個類型概念外的,同樣會詳細給出代碼的實現過程。此外我們會分析這幾種數據類型的優勢和缺點,以及在面向對象的服務開發過程中如何解決這些問題。
【1】數據集(DataSet)、數據表(DataTable):
我們首先來介紹這兩個類型的相關概念,然后在介紹其在WCF應用程序開發中的使用方式。
【1.1】基本概念:
數據集(DataSet)、數據表(DataTable),相信大家都不回陌生,只要做過ADO.NET進行數據庫編程的開發人員來說,都會使用到這兩個類。DataSet 是 ADO.NET 結構的主要組件,它是從數據源中檢索到的數據在內存中的緩存。DataSet 由一組 DataTable 對象組成,您可使這些對象與 DataRelation 對象互相關聯。您還可通過使用 UniqueConstraint 和 ForeignKeyConstraint 對象在 DataSet 中實施數據完整性。有關使用 DataSet 對象的詳細信息,請參見 在 ADO.NET 中使用 DataSet。
盡管 DataTable 對象中包含數據,但是 DataRelationCollection 允許您遍覽表的層次結構。這些表包含在通過 Tables 屬性訪問的 DataTableCollection 中。當訪問 DataTable 對象時,請注意它們是按條件區分大小寫的。例如,如果一個 DataTable 被命名為“mydatatable”,另一個被命名為“Mydatatable”,則用于搜索其中一個表的字符串被認為是區分大小寫的。但是,如果“mydatatable”存在而“Mydatatable”不存在,則認為該搜索字符串不區分大小寫。有關使用 DataTable 對象的更多信息,請參見 創建 DataTable。
DataSet 可將數據和架構作為 XML 文檔進行讀寫。數據和架構可通過 HTTP 傳輸,并在支持 XML 的任何平臺上被任何應用程序使用。可使用 WriteXmlSchema 方法將架構保存為 XML 架構,并且可以使用 WriteXml 方法保存架構和數據。若要讀取既包含架構也包含數據的 XML 文檔,請使用 ReadXml 方法。
在典型的多層實現中,用于創建和刷新 DataSet 并依次更新原始數據的步驟包括:
- 通過 DataAdapter 使用數據源中的數據生成和填充 DataSet 中的每個 DataTable。
- 通過添加、更新或刪除 DataRow 對象更改單個 DataTable 對象中的數據。
- 調用 GetChanges 方法以創建只反映對數據進行的更改的第二個 DataSet。
- 調用 DataAdapter 的 Update 方法,并將第二個 DataSet 作為參數傳遞。
- 調用 Merge 方法將第二個 DataSet 中的更改合并到第一個中。
- 針對 DataSet 調用 AcceptChanges。或者,調用 RejectChanges 以取消更改。
【1.2】
DataSet 和 DataTable 對象從 MarshalByValueComponent 繼承而來,并支持用于遠程處理的 ISerializable 接口。這些是僅有的可以遠程處理的 ADO.NET 對象。 我們先來看一下DataSet的定義,使用Reflector工具查看,部分代碼如下:
Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7
f11d50a3a"), DefaultProperty("DataSetName"), XmlSchemaProvider("GetDataSetSc
hema"), ResDescription("DataSetDescr"), XmlRoot("DataSet"), Designer("Microsoft.
VSDesigner.Data.VS.DataSetDesigner, Microsoft.VSDesigner, Version=8.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public class DataSet : MarshalByValueComponent, IListSource, IXmlSerializable,
ISupportInitializeNotification, ISupportInitialize, ISerializable
{
// Fields
private bool _caseSensitive;
private CultureInfo _culture;
private bool _cultureUserSet;
private string _datasetPrefix;
private object _defaultViewManagerLock;
private readonly int _objectID;
private static int _objectTypeCount;
private SerializationFormat _remotingFormat;
private string dataSetName;
private DataViewManager defaultViewManager;
private bool enforceConstraints;
internal PropertyCollection extendedProperties;
private bool fBoundToDocument;
internal bool fEnableCascading;
internal bool fInitInProgress;

}
DataTable的部分實現代碼如下:
VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
"System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=
neutral, PublicKeyToken=b03f5f7f11d50a3a"), DefaultProperty("TableName"),
DesignTimeVisible(false), ToolboxItem(false), XmlSchemaProvider("GetDataTableS
chema"), DefaultEvent("RowChanging")]
public class DataTable : MarshalByValueComponent, IListSource, ISupportInitialize
Notification, ISupportInitialize, ISerializable, IXmlSerializable
{
// Fields
private bool _caseSensitive;
private bool _caseSensitiveUserSet;
internal DataColumn _colUnique;
private CompareOptions _compareFlags;
private CompareInfo _compareInfo;

}
在WCF分布式應用程序開發過程中,可以使用來作為數據契約類型,在服務和客戶端傳遞。兩者在定義之初都包含了[Serializable]聲明,因此兩者的對象都是可以序列化的。可以使用在客戶端和服務端傳遞數據。