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

IBM DB2 9 pureXML 技術深度解析:.NET 應用開發實戰與驗證機制

     編輯:DB2 教學

前言

DB2 9 引入革命性的 pureXML 技術,原生支援 XML 階層式儲存、索引、查詢與驗證,免去「撕裂/組裝」XML 與關聯表的開銷。本文針對 .NET 開發人員,透過完整範例示範如何使用 ADO.NET 操作 DB2 XML 資料,重點闡述 XML Schema 驗證機制 如何在資料庫層面強制資料完整性。

DB2 9 XML 核心能力

  • XML 資料型別: 原生階層式儲存,保留文件結構與型別資訊
  • 混合查詢語言: SQL/XML (SQL 擴充) + XQuery,無縫整合關聯與 XML 查詢
  • Schema 驗證: XMLVALIDATE 函數依註冊 Schema 驗證輸入文件,失敗即拒絕寫入
  • XML 索引: 對 XML 路徑建立索引,大幅加速 XPath/XQuery 查詢

環境建置需求

  • Visual Studio 2005 + DB2 9 (建議先裝 VS 再裝 DB2)
  • DB2 安裝時啟用 TCP/IP 通訊協定 (DB2COMM=TCPIP)
  • 建立 SAMPLE 資料庫時勾選 「XML and SQL objects and data」 選項
  • DB2 Visual Studio 2005 Add-in (整合 Server Explorer、專案範本)

驗證 TCP/IP 啟用狀態

db2set
# 應包含 DB2COMM=TCPIP
# 若無,執行:
db2set DB2COMM=TCPIP
db2 update dbm cfg using SVCENAME 50000
db2stop
db2start

範例場景:拼車資訊系統 (CARPOOL 表)

CREATE TABLE CARPOOL (
  ID        INTEGER NOT NULL PRIMARY KEY,
  ROUTE     XML,           -- 原生 XML 欄位
  CREATED   TIMESTAMP DEFAULT CURRENT TIMESTAMP
);

XML 文件結構範例:

<route>
  <origin>San Francisco</origin>
  <destination>San Jose</destination>
  <departure>2024-01-15T07:30:00</departure>
  <seats>3</seats>
  <driver id="D123" name="John Chen" />
</route>

XML Schema 註冊與驗證流程

1. 註冊 Schema 至 DB2 目錄

-- 使用 DB2 命令列處理器 (CLP) 或 .NET 程式碼
REGISTER XMLSCHEMA 'https://example.com/carpool'
FROM 'file:///c:/schemas/carpool.xsd'
AS user1.carpool_schema COMPLETE;

2. .NET 程式碼:插入並驗證 XML 文件

using IBM.Data.DB2;
using System.Xml;

string connStr = "Server=localhost:50000;Database=SAMPLE;UID=db2admin;PWD=pass;";
string xmlDoc = @"<route><origin>San Francisco</origin>...</route>";

using (DB2Connection conn = new DB2Connection(connStr)) {
    conn.Open();
    
    // 使用 XMLVALIDATE 在伺服器端驗證
    string sql = @"INSERT INTO CARPOOL (ID, ROUTE) 
                   VALUES (?, XMLVALIDATE(? ACCORDING TO XMLSCHEMA ID user1.carpool_schema))";
    
    using (DB2Command cmd = new DB2Command(sql, conn)) {
        cmd.Parameters.Add("@id", DB2Type.Integer).Value = 1;
        cmd.Parameters.Add("@xml", DB2Type.Xml).Value = xmlDoc;
        cmd.ExecuteNonQuery();
    }
}

關鍵點: 驗證發生在資料庫伺服器端,不合規文件直接拋錯 (SQLCODE=-16141),保證資料完整性不依賴用戶端邏輯。

3. 查詢與擷取 XML 資料

-- SQL/XML 查詢:擷取特定路徑值
SELECT XMLQUERY('$r/route/origin' PASSING ROUTE AS "r") 
FROM CARPOOL WHERE ID = 1;

-- XQuery 查詢:尋找 2024 年 1 月出發且座位 >= 2 的路線
XQUERY for $r in db2-fn:xmlcolumn('CARPOOL.ROUTE')/route
       where $r/departure gt '2024-01-01' and $r/seats ge 2
       return $r;

4. .NET 擷取 XML 並還原為物件

string sql = "SELECT ROUTE FROM CARPOOL WHERE ID = 1";
using (DB2Command cmd = new DB2Command(sql, conn)) {
    using (DB2DataReader dr = cmd.ExecuteReader()) {
        if (dr.Read()) {
            // 取得 XML 為字串
            string xml = dr.GetString(0);
            // 或直接載入 XmlDocument
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            // 進一步反序列化為強型別物件...
        }
    }
}

更新與刪除 XML 資料

-- 使用 XMLMODIFY 部分更新 (需 XQuery Update Facility)
UPDATE CARPOOL
SET ROUTE = XMLMODIFY('replace value of node $r/route/seats with 4'
                      PASSING ROUTE AS "r")
WHERE ID = 1;

-- 刪除整列
DELETE FROM CARPOOL WHERE ID = 1;

效能最佳實務

  1. XML 索引: 對高頻查詢路徑建立索引 CREATE INDEX idx_route_origin ON CARPOOL(ROUTE) GENERATE KEY USING XMLPATTERN '/route/origin' AS SQL VARCHAR(50)
  2. 選擇性驗證: 大量載入時可先載入再批次驗證,平衡效能與完整性
  3. 混合建模: 將常用查詢欄位 (如 origin, destination) 同步冗余至關聯欄位,建立一般索引,XML 保留完整文件

結語

DB2 pureXML 讓 XML 成為資料庫的一等公民,.NET 開發人員可沿用熟悉的 ADO.NET 模式,無痛整合 XML 儲存與關聯查詢。伺服器端 Schema 驗證 是確保資料品質的關鍵防線,建議於所有 XML 寫入路徑強制啟用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved