首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

ADO.NET 與 XML 深度整合:DataSet 載入/儲存 XML、DiffGram、XSD Schema、XmlDataDocument 同步

     編輯:更多程式設計知識

DataSet 與 XML 互操作總覽

DataSet 為離線資料容器,原生支援與 XML 雙向轉換,是異質系統資料交換、離線快取、設定檔儲存的核心機制。

核心功能對照

功能方法/屬性說明
載入 XML 資料ReadXml(), ReadXmlSchema()從檔案/Stream/Reader 載入資料與/或結構描述
寫入 XML 資料WriteXml(), WriteXmlSchema()輸出至檔案/Stream/Writer,可指定 XmlWriteMode
DiffGram 格式WriteXml(..., XmlWriteMode.DiffGram)包含原始值與目前值,適用離線更新衝突偵測
推斷 SchemaInferXmlSchema()從 XML 實例推斷 XSD,自動建立 DataTable/Relation/Constraint
XSD 生成 DataSetReadXmlSchema() 或 xsd.exe 工具依 XSD 建立強型別 DataSet,包含關聯、約束、唯一鍵
XmlDataDocument 同步new XmlDataDocument(dataSet)DataSet 與 XML DOM 雙向同步,同一資料兩種視圖

關鍵場景實作

1. 離線編輯 → DiffGram → 伺服器合併

// 用戶端:離線編輯後產生 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 合併衝突

2. XSD 定義強型別 DataSet 結構

<?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 與型別安全。

3. DataSet 與 XmlDataDocument 雙向同步

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 → UniqueConstraint
  • xs:keyref → ForeignKeyConstraint + DataRelation
  • 巢狀 xs:element (內含 xs:complexType/xs:sequence) → 巢狀 DataRelation,影響 XML 輸出階層。

最佳實務

  1. 資料交換優先使用 DiffGram,保留行狀態資訊。
  2. 大量資料避免一次性 WriteXml 至記憶體,改用 XmlWriter 串流輸出。
  3. 強型別 DataSet 適合固定結構業務;動態結構用無型別 DataSet + InferXmlSchema。
  4. XmlDataDocument 雙向同步雖方便,但雙重維護有效能成本,僅在需同時操作 DOM 與關聯資料時使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved