帶注釋的 XML 模式分解特性是在 DB2® 9 中引入的,該特性可以將整個 XML 文檔或 XML 文檔的片段分解到關系表中。DB2 9 XML 分解技術使用 XML 模式中的注釋作為將 XML 文檔中的信息映射到關系表中的映射語言。DB2 XML 分解使用帶注釋的 XML 模式來獲得映射信息。由於添加到 XML 模式中的注釋並不參與 XML 文檔的驗證。因此,同一個 XML 模式既可以用於 XML 文檔的映射,又可以用於 XML 文檔的驗證。
DB2 中的 XML 分解支持
新的 DB2 9 XML 分解特性要求將帶注釋的 XML 模式注冊到 XML 模式庫中。XML 模式庫是在 DB2 9 中引入的一項新特性,它是 XML 模式的庫,由一個或多個 XML 模式文檔組成。注冊到 XML 模式庫中的 XML 模式可用於:
在將 XML 文檔插入到 XML 列或者將其分解到關系表中時,驗證該 XML 文檔
存放以注釋的形式存在的映射信息,這些注釋將用於將 XML 文檔分解到關系表中
本文使用 DB2 Visual Studio 2005 Add-in 作為例子。本文中的示例代碼使用了 SHIPTO 和 ITEM 表,這兩個表用於跟蹤客戶的訂單信息。清單 1 顯示了這兩個表的定義。
環境設置
注意:您需要正確地創建 SAMPLE 數據庫以便啟用 XML 支持(見下面的說明)。
需要 Visual Studio .NET 2005 和 DB2 9。這兩個產品的安裝應該很簡單。建議首先安裝 Visual Studio .Net,然後再安裝 DB2 9。可以記住安裝 DB2 時輸入的用戶 ID 和密碼,以後連接到 DB2 9 的時候也許用得著。
在 DB2 9 安裝期間,應確保啟用了 TCP/IP。如果在安裝 DB2 之後不確定是否啟用了 TCP/IP,可以執行以下命令進行檢查:
在 Windows Start 菜單中,導航到 Programs > IBM DB2 > DB2 (默認) [或您的 DB2 實例名稱] > Command Line Tools > Command Window。
在 DB2 9 命令窗口中,應該可以看到命令提示符 C:\Program Files\IBM\SQLLIB\BIN> (如果采用默認安裝路徑的話)。輸入 db2set。在返回的結果中,應該可以看到 DB2COMM=tcpip 這一行。
如果還沒有為 DB2 啟用 TCP/IP,那麼可以輸入以下命令啟用它:
db2set db2comm=tcpip
db2 update dbm cfg using svcename 50000
db2stop
db2start
在安裝 DB2 之後,可以選擇創建 DB2 SAMPLE 數據庫。這時可以接受默認設置,但是務必選擇 XML and SQL objects and data 選項。為了檢查系統設置是否成功,啟動 Visual Studio .NET 2005。從 Visual Studio .Net 的 File 菜單中,選擇 New > Project。在 New Project 對話框中,在左側面板中應該可以看到 IBM Projects。關閉此對話框。在 Server Explorer 中,連接到 DB2 SAMPLE 數據庫。確認在 Server Explorer 中是否可以看到 XML Schema Repository 樹節點。如果看不到,那麼可能需要重新創建 SAMPLE 數據庫,以啟用 XML 特性。
清單 1. SHIPTO 和 ITEM 表的定義
CREATE TABLE SHIPTO (
ORDERID VARCHAR ( 256 ) NOT NULL ,
NAME VARCHAR ( 256 ) ,
ADDRESS VARCHAR ( 256 ) ,
CITY VARCHAR ( 256 ) ,
COUNTRY VARCHAR ( 256 ) ,
CONSTRAINT TABLE1_PK PRIMARY KEY (ORDERID));
CREATE TABLE ITEM (
ITEMID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1, CACHE 20),
TITLE VARCHAR ( 256 ) ,
NOTE VARCHAR ( 256 ) ,
PRICE DECIMAL ,
QUANTITY INTEGER,
CONSTRAINT ITEM_PK PRIMARY KEY (ITEMID))
清單 2. 將被分解到 SHIPTO 和 ITEM 表中的示例 XML 文檔(sampleship.XML)
<shiporder xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
orderid='orderid1'>
<orderperson>orderperson1</orderperson>
<shipto>
<name>name1</name>
<address>address1</address>
<city>city1</city>
<country>country1</country>
</shipto>
<item>
<title>title1</title>
<note>note1</note>
<quantity>1</quantity>
<price>1</price>
</item>
<item>
<title>title2</title>
<note>note2</note>
<quantity>2</quantity>
<price>2</price>
</item>
</shiporder>
清單 3. 用於包含注釋和將 XML 文檔映射到 SHIPTO 和 ITEM 表中的 XML 模式(shipOrder.xsd)
<?XML version="1.0" encoding="utf-8"?>
<xs:schema xmlns:sql="http://www.ibm.com/XMLns/prod/db2/xdb1"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderdesc" type="xs:string" />
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="address" type="xs:string" />
<xs:element name="city" type="xs:string" />
<xs:element name="country" type="xs:string" />
<xs:element name="zip" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element maxOccurs="unbounded" name="item">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element minOccurs="0" name="note"
type="xs:string" />
<xs:element name="quantity"
type="xs:positiveInteger" />
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string"
use="required" />
</xs:complexType>
</xs:element>
</xs:schema>
創建帶注釋的 XML 模式
在 Visual Studio 2005 中開始一個新實例,並從 Server Explorer 中建立到 DB2 sample 數據庫的連接。圖 1 顯示了到 DB2 sample 數據庫的 Server Explorer 連接。建立連接之後,在 XML Schema Repository 節點上單擊右鍵,從上下文菜單中選擇 Add Annotated XML Schema。
圖 1. 創建帶注釋的 XML 模式
在顯示 DB2 Mapping Editor 之後,選擇 Use document from file 選項並找到 shiporder.xsd。
圖 2. 帶注釋的 XML 模式源對話框
在選擇源 XML 模式之後,右鍵單擊 DB2 Mapping Editor,選擇 Add Table。添加 ShipTo 和 Item 表。將 XML 模式中的元素拖放到目標表上。例如,可以將 name 元素從 ShipTo 拖放到 ShipTo 表的 SHIPNAME 列。一旦元素與列之間建立鏈接,就可以看到一條藍色的線,表明兩者之間的鏈接。將剩下的元素拖放到相關的表列上。圖 3 顯示了 ShipTo 和 Item 表與 ShipOrder.xsd 元素之間的映射。
圖 3. 帶注釋的 XML 模式映射編輯器
查看原圖(大圖)
映射編輯完成後,單擊 Visual Studio IDE Save 按鈕啟動注冊 XML 模式對話框,以便將帶注釋的 XML 模式保存到 DB2 XML 模式庫中。圖 4 顯示了注冊帶注釋 XML 的模式對話框。設置好此對話框之後,單擊 IDE Save 按鈕。
圖 4. 注冊帶注釋的 XML 模式
將帶注釋的 XML 模式保存到 DB2 XML 模式庫之後,通過 Mapping Editor 可以測試帶注釋的 XSD。右鍵單擊 DB2 Mapping Editor,然後選擇 Test。在 Test 對話框中,選擇測試中要分解的示例 XML 文檔,再從 validation 下拉菜單中選擇 DB2 是否驗證 XML 文檔,然後單擊 Test。如果注釋和映射無誤,那麼可以收到一條成功消息,再次查看 ShipTo 和 Item 表可以發現,示例 XML 文檔已經被分解,其中的數據被插入到這兩個表中。圖 5 顯示了 DB2 Mapping Editor Test 對話框。
圖 5. 測試帶注釋的 XML 模式
至此,已經創建了一個帶注釋的 XML 模式,並將其注冊到 DB2 XML 模式庫中,現在可以調用 XML 分解過程,開始填充關系表。為了編譯和運行 .Net 應用程序,需要創建一個新的 Visual Studio .Net 項目。如果之前沒有使用過 Visual Studio .Net,那麼請閱讀下面關於如何完成這些任務的一個概述:
啟動 Visual Studio 2005。
選擇 File > New > Project 創建一個新項目。然後選擇 Visual C# > Windows Application。
建立對 DB2 .Net data provider IBM.Data.DB2 的引用。在 Visual Studio .Net 項目浏覽器中右鍵單擊 References 節點,並選擇 Add Reference,接著選擇 Browse 選項卡,然後找到 IBM.Data.DB2.dll,該文件位於 DB2 安裝目錄 \SQLLIB\BIN\netf20\IBM.Data.DB2.dll 下。
連接到數據庫
首先需要建立到目標數據庫的連接。清單 4 顯示了一個用於建立 DB2 數據庫連接的方法的摘錄。
清單 4. 建立 DB2 數據庫連接:
private DB2Connection m_conn = null;
m_conn = new DB2Connection("database=sample");
m_conn.Open();
執行 DB2 XML 分解過程
DB2 9 允許用戶創建和注冊帶注釋的 XML 模式,用於分解 XML 文檔,以及在將文檔插入數據庫之前根據模式對輸入文檔進行驗證。通過 DB2 Visual Studio 2005 Add-in 工具,可以使用一個簡單的映射設計器很容易地創建和注冊帶注釋的 XML 模式,對此前面已做了描述。本文展示如何在 .Net 代碼中將帶注釋的 XML 模式與 XML 文檔分解結合起來使用。將帶注釋的 XML 模式注冊到 DB2 XML 模式庫之後,便可以使用它來分解和驗證 XML 文檔。清單 5 展示了使用 .Net 代碼調用 DB2 XML 分解過程的一種方法。
清單 5. 調用 DB2 XML 分解過程:
private void executeShredding()
{
DB2Transaction dbtrans = null;
///sysproc.xdbDecompXML10MB(IN rschema VARCHAR(128),
//IN XMLschemaname VARCHAR(128),
//IN XMLdoc BLOB(10M), IN documentid VARCHAR(1024),
//IN validation INTEGER, IN reserved for future use BLOB(64K),
//IN reserved for future use BLOB(64K), IN reserved INTEGER,
//out struct sqlca *ca)) // implicit output parameter
try{
if (m_conn == null) return;
DB2Command cmd = new DB2Command();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SYSPROC.XDBDECOMPXML";
cmd.Connection = m_conn;
IBM.Data.DB2.DB2Parameter p1 = new IBM.Data.DB2.DB2Parameter();
p1.DB2Type = DB2Type.VarChar;
p1.Direction = ParameterDirection.Input;
// Database owner or relational
// schema where XSD registered
p1.Value = “DB2Admin”;
IBM.Data.DB2.DB2Parameter p2 = new IBM.Data.DB2.DB2Parameter();
p2.DB2Type = DB2Type.VarChar;
p2.Direction = ParameterDirection.Input;
// Name of the registered annotated XML schema
p2.Value = xsrname;
IBM.Data.DB2.DB2Parameter p3 = new IBM.Data.DB2.DB2Parameter();
p3.DB2Type = DB2Type.Blob;
p3.Direction = ParameterDirection.Input;
// Convert the sample XML document to be shredded
//into byte array since this parameter is of type blob
byte[ ] b = getByteArrayFromFile(@”ShiporderSample.XML”);
if (b == null) return ;
p3.Value = b;
IBM.Data.DB2.DB2Parameter p4 = new IBM.Data.DB2.DB2Parameter();
p4.DB2Type = DB2Type.VarChar;
p4.Direction = ParameterDirection.Input;
p4.Value = xsrdocId;
// Tell DB2 whether use the same XML
// schema for validation before shredding
IBM.Data.DB2.DB2Parameter p5 = new IBM.Data.DB2.DB2Parameter();
p5.DB2Type = DB2Type.Integer;
p5.Direction = ParameterDirection.Input;
p5.Value = 0; //False
// p5.Value=1; //True
IBM.Data.DB2.DB2Parameter p6 = new IBM.Data.DB2.DB2Parameter();
p6.DB2Type = DB2Type.Blob;
p6.Direction = ParameterDirection.Input;
p6.Value = null;
IBM.Data.DB2.DB2Parameter p7 = new IBM.Data.DB2.DB2Parameter();
p7.DB2Type = DB2Type.Blob;
p7.Direction = ParameterDirection.Input;
p7.Value = null;
IBM.Data.DB2.DB2Parameter p8= new IBM.Data.DB2.DB2Parameter();
p8.DB2Type = DB2Type.Integer;
p8.Direction = ParameterDirection.Input;
p8.Value = null;
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p3);
cmd.Parameters.Add(p4);
cmd.Parameters.Add(p5);
cmd.Parameters.Add(p6);
cmd.Parameters.Add(p7);
cmd.Parameters.Add(p8);
//Begin a new transactionb
dbtrans = cmd.Connection.BeginTransaction();
cmd.Transaction = dbtrans as DB2Transaction ;
int i = cmd.ExecuteNonQuery();
if (dbtrans != null) dbtrans.Commit();
}
catch (Exception exp)
{
if (dbtrans != null) dbtrans.Rollback();
return;
}
}
清單 6. 將文件轉換成字節數組:
private Byte[ ] getByteArrayFromFile(string FileName)
{
byte[ ] b = null;
System.IO.FileStream fs = new System.IO.FileStream(FileName, Open,Read);
b = new byte[fs.Length];
fs.Read(b, 0, b.Length);
fs.Close();
return b;
}
現在來考查這段代碼。在建立一個數據庫連接之後,該方法創建一個 DB2Command,用於調用 “SYSPROC.XDBDECOMPXML” 存儲過程。DB2Command 包含 8 個參數標記符。第一個參數標記符用於存放注冊的帶注釋的 XML 模式的關系模式或 DB 所有者名稱。第二個參數標記符用於存放注冊的帶注釋的 XML 模式的名稱。第三個參數標記符用於存放將被分解為字節數組的 XML 文檔的源。第四個參數標記符是一個 0/1 標志,它告訴 DB2 在分解過程中使用的 XSD 是否也用於驗證源 XML 文檔。第六、七、八個參數標記符不使用。
結束語
任何注冊在 XML 模式庫中的 XML 模式,只要包含至少一個與分解相關的注釋,那麼它就可以用於 XML 分解。當將一個 XML 模式用於分解時,需要對其進行檢查,以確保注釋的正確性、XML 模式類型與 DB2 列類型的兼容性,並且注釋中指定的關系表和列是存在的。如果檢查後發現帶注釋的 XML 模式有效,那麼映射信息將被提取並以即用型(ready-to-use)二進制格式存儲在編目表中。憑借易用的 Mapping Editor 和帶注釋的 XML 模式測試實用程序,IBM DB2 Visual Studio 2005 .Net Add-in 為創建和維護帶注釋的 XML 模式提供了一種容易的方式。