DataSet 為離線資料容器,原生支援與 XML 雙向轉換,是異質系統資料交換、離線快取、設定檔儲存的核心機制。
| 功能 | 方法/屬性 | 說明 |
|---|---|---|
| 載入 XML 資料 | ReadXml(), ReadXmlSchema() | 從檔案/Stream/Reader 載入資料與/或結構描述 |
| 寫入 XML 資料 | WriteXml(), WriteXmlSchema() | 輸出至檔案/Stream/Writer,可指定 XmlWriteMode |
| DiffGram 格式 | WriteXml(..., XmlWriteMode.DiffGram) | 包含原始值與目前值,適用離線更新衝突偵測 |
| 推斷 Schema | InferXmlSchema() | 從 XML 實例推斷 XSD,自動建立 DataTable/Relation/Constraint |
| XSD 生成 DataSet | ReadXmlSchema() 或 xsd.exe 工具 | 依 XSD 建立強型別 DataSet,包含關聯、約束、唯一鍵 |
| XmlDataDocument 同步 | new XmlDataDocument(dataSet) | DataSet 與 XML DOM 雙向同步,同一資料兩種視圖 |
// 用戶端:離線編輯後產生 DiffGram
string diffGram;
using (var ms = new MemoryStream()) {
dataSet.WriteXml(ms, XmlWriteMode.DiffGram);
diffGram = Encoding.UTF8.GetString(ms.ToArray());
}
// 傳送 diffGram 至伺服器,伺服器端:
var serverDs = new DataSet();
serverDs.ReadXml(new StringReader(diffGram)); // 自動解析原始/目前值
// 透過 DataAdapter.Update 合併衝突
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Orders" xmlns:xs="https://www.w3.org/2001/XMLSchema">
<xs:element name="Order">
<xs:complexType>
<xs:sequence>
<xs:element name="OrderID" type="xs:int" />
<xs:element name="CustomerID" type="xs:string" />
<xs:element name="OrderDate" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
用 xsd.exe /d /l:CS Orders.xsd 產生強型別 OrdersDataSet,編譯期即享有 IntelliSense 與型別安全。
var doc = new XmlDataDocument(dataSet); // 建立同步關係
// 透過 DOM 操作
XmlElement newRow = doc.CreateElement("Order");
newRow.SetAttribute("OrderID", "1001");
doc.DocumentElement.AppendChild(newRow);
// DataSet 立即反映新行,RowState = Added
// 反之,DataSet 新增行,DOM 樹即時更新
xs:unique / xs:key → UniqueConstraintxs:keyref → ForeignKeyConstraint + DataRelationxs:element (內含 xs:complexType/xs:sequence) → 巢狀 DataRelation,影響 XML 輸出階層。WriteXml 至記憶體,改用 XmlWriter 串流輸出。InferXmlSchema。XmlDataDocument 雙向同步雖方便,但雙重維護有效能成本,僅在需同時操作 DOM 與關聯資料時使用。