DB2 9 引入革命性的 pureXML 技術,原生支援 XML 階層式儲存、索引、查詢與驗證,免去「撕裂/組裝」XML 與關聯表的開銷。本文針對 .NET 開發人員,透過完整範例示範如何使用 ADO.NET 操作 DB2 XML 資料,重點闡述 XML Schema 驗證機制 如何在資料庫層面強制資料完整性。
XMLVALIDATE 函數依註冊 Schema 驗證輸入文件,失敗即拒絕寫入DB2COMM=TCPIP)SAMPLE 資料庫時勾選 「XML and SQL objects and data」 選項db2set
# 應包含 DB2COMM=TCPIP
# 若無,執行:
db2set DB2COMM=TCPIP
db2 update dbm cfg using SVCENAME 50000
db2stop
db2start
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>
-- 使用 DB2 命令列處理器 (CLP) 或 .NET 程式碼
REGISTER XMLSCHEMA 'https://example.com/carpool'
FROM 'file:///c:/schemas/carpool.xsd'
AS user1.carpool_schema COMPLETE;
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),保證資料完整性不依賴用戶端邏輯。
-- 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;
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);
// 進一步反序列化為強型別物件...
}
}
}
-- 使用 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;
CREATE INDEX idx_route_origin ON CARPOOL(ROUTE) GENERATE KEY USING XMLPATTERN '/route/origin' AS SQL VARCHAR(50)DB2 pureXML 讓 XML 成為資料庫的一等公民,.NET 開發人員可沿用熟悉的 ADO.NET 模式,無痛整合 XML 儲存與關聯查詢。伺服器端 Schema 驗證 是確保資料品質的關鍵防線,建議於所有 XML 寫入路徑強制啟用。