DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 使用 IBM DB2 Visual Studio 2005 .Net 插件進行 XML 數據驗證
使用 IBM DB2 Visual Studio 2005 .Net 插件進行 XML 數據驗證
編輯:XML詳解     

一個存儲庫,例如關系數據庫,可以為授權用戶安全地共享 XML 文檔和 XML 模式提供一個環境。授權用戶可以在任何時候、任何地方安全地訪問重要的 XML 文檔和 XML 模式。通過使用可包含一個或多個關系數據庫系統的存儲庫系統,用戶可以找到並檢索最新版本的 XML 文檔和 XML 模式文檔。DB2® 9 為 XML 提供了新的支持,對於這種新支持,.Net 應用程序開發人員可以很快地上手。這是因為 DB2 9 讓程序員可以像對待關系數據那樣查詢、插入、更新和刪除 XML 數據 —— 使用熟悉的 ADO .Net 語句和標准的查詢語言。

  DB2 中的 XML 支持

  DB2 9 為管理、存儲和查詢 XML 數據引入了一些新的特性和機制:

  XML 數據類型使 DB2 可以以 XML 本身的分層格式來存儲 XML 文檔。

  XML 查詢語言支持基於業界標准,並包括新的對 SQL 的 XML 擴展(也稱 SQL/XML)。

  支持基於用戶提供的模式驗證 XML 數據,這使得應用程序開發人員和數據庫管理員可以對 DB2 中存儲的 XML 數據實施數據完整性約束。本文中的例子使用 DB2 Visual Studio 2005 Add-in。

  本文中的代碼示例引用了 CARPOOL 表,該表記錄舊金山和聖何塞兩地關於合伙用車的信息。清單 1 展示了該表的定義。另外,還需確保數據庫啟用了 XML。

  環境設置

  注意:應確保 SAMPLE 數據庫在創建時啟用了 XML(見後面的定義)。

  本文需要使用 Visual Studio .NET 2005 和 DB2 9。這兩個產品的安裝很簡單。建議先安裝 Visual Studio .Net,然後再安裝 DB2 9。請記住在安裝 DB2 時所輸入的用戶 ID 和密碼,因為在連接 DB2 時要使用它們。

  在 DB2 安裝期間,應確保啟用了 TCP/IP。如果在安裝 DB2 之後不確定 TCP/IP 是否被啟用,可以執行以下步驟進行檢查:

 從 Windows Start 菜單中,選擇 Programs > IBM DB2 > DB2(默認)[或者為 DB2 實例名稱] > Command Line Tools > Command Window。

  在 DB2 命令窗口中,應該可以看到命令提示符 C:\Program Files\IBM\SQLLIB\BIN>(如果使用默認安裝路徑的話)。輸入 db2set。在返回的結果中,應該可以看到這一行: DB2COMM=tcpip。

  如果還沒有為 DB2 啟用 TCP/IP,那麼可以輸入以下命令來啟用 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 數據庫(具體步驟請參閱 “Develop proof-of-concept .NET applications, Part 1: Create database objects in DB2 Viper using .Net”(developerWorks,2006 年 5 月))。確認在 Server Explorer 中可以看到 XML Schema Repository 樹節點。如果沒有看到,那麼可能需要重新創建 SAMPLE 數據庫,以啟用 XML 特性。


清單 1. CARPOOL 表定義

CREATE TABLE CARPOOL ( 
 ID INTEGER NOT NULL, 
 FIRSTNAME VARCHAR ( 256 ) , 
 LASTNAME VARCHAR ( 256 ) , 
 TITLE VARCHAR ( 15 ) , 
 PHONE VARCHAR ( 20 ) , 
 CARPOOLINFO XML , 
 CONSTRAINT CARPOOL_PK PRIMARY KEY (ID)) 

這裡有兩個 XML 模式,CarpoolInfo.xsd 和 USAddressType.xsd,其中 CarpoolInfo.xsd 引用了 USAddressType。


清單 2. 用於驗證 CARPOOL 表中的 XML 文檔的 XML 模式(CarpoolInfo.xsd)

<?XML version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
elementFormDefault="qualifIEd" xmlns="http://tempuri.org/XMLSchema.xsd" 
xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
 <xs:include id="USAddress.xsd" schemaLocation="USAddress.xsd" /> 
 <xs:element name="CARPOOLINFO"> 
  <xs:complexType> 
   <xs:sequence> 
    <xs:element name="StartTime" type="xs:string" /> 
    <xs:element name="Address" type="USAddress" /> 
   </xs:sequence> 
  </xs:complexType> 
 </xs:element> 
</xs:schema> 



清單 3. CarpoolInfo 依賴的 XML 模式(USAddress.xsd)

<?XML version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
elementFormDefault="qualifIEd" xmlns="http://tempuri.org/XMLSchema.xsd" 
xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
 <xs:complexType name="USAddress"> 
  <xs:sequence> 
   <xs:element name="Add1" type="xs:string"> 
   </xs:element> 
   <xs:element name="Add2" type="xs:string"> 
   </xs:element> 
   <xs:element name="City" type="xs:string"> 
   </xs:element> 
   <xs:element name="State" type="xs:string"> 
   </xs:element> 
   <xs:element name="Zip" type="xs:string"> 
   </xs:element> 
  </xs:sequence> 
 </xs:complexType> 
</xs:schema> 

CARPOOL 表既包含基於 SQL 數據類型的列,又包含一個基於新的 DB2 XML 數據類型的列。後一個列,即 CARPOOLINFO,存儲包括合伙用車者的地址和開始時間等信息的 XML 文檔。圖 1 展示了示例 carpoolnfo XML 文檔。


圖 1. 存儲在 CARPOOL 表中的示例 XML 文檔 
使用 IBM DB2 Visual Studio 2005 .Net 插件進行 XML 數據驗證

  查看原圖(大圖)

  現在來看看如何插入、更新和驗證 CARPOOLINFO 列中的 XML 文檔。清單 2 展示了一個 XML 模式,在將一個 XML 文檔插入 CARPOOLINFO 列之前,需要使用這個 XML 模式對該 XML 文檔進行驗證。

  為了編譯和運行 .Net 應用程序,需要創建一個新的 Visual Studio .Net 項目。如果之前沒有使用過 Visual Studio .Net,那麼可以看看下面關於如何完成這些任務的概述:

  啟動 Visual Studio 2005。

  創建一個新項目。選擇 File > New > Project。選擇 Visual C# > Windows Application。

  創建對 DB2 .Net 數據提供程序 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(); 

  注冊 XML 模式

  DB2 9 允許用戶注冊 XML 模式,並在插入輸入文檔之前,根據這些模式對輸入文檔進行驗證。XML 模式是 World Wide Web Consortium(W3C)業界標准的一部分。用戶可以通過 XML 模式指定 XML 文檔應遵從的結構,例如可接受的 XML 元素的順序和數據類型,以及特定 XML 名稱空間的使用。 DB2 Visual Studio 2005 Add-in 工具提供了一種使用簡單的注冊設計器來注冊 XML 模式的簡單方法,不過本文將展示如何使用 .Net 代碼注冊 XML 模式。一旦在 DB2 XML 模式庫中注冊了一個 XML 模式,便可以用該模式來驗證 XML 文檔。清單 5 展示了使用 .Net 代碼注冊 XML 模式的一種方法。


清單 5. 注冊 XML 模式

    //We have two xsds, CarpoolInfo.xsd and USAddress.xsd, 
    //where CarpoolInfo.xsd is dependent on USAddress.xsd. 
    //This XML Schema is identifIEd as schema.xsdname. 
 
   String[] xsdFiles = new String[2] 
   { 
     "CarpoolInfo.xsd", 
     "USAddress.xsd"         
       
   }; 
 
   String[] schemaLocs = new String[2] 
   {  
    "http://tempuri.org/CarpoolInfo.xsd", 
    "USAddress.xsd"         
       
   }; 
      
 
   // Register XML schema using DB2 .Net provider connection’s 
   // RegisterXMLSchema API 
   m_conn.RegisterXMLSchema(schema, 
             xsdname, 
             schemaLocs, 
             xsdFiles, 
             null, 
             null, 
             false); 

插入和驗證 XML 數據

  至此,已經建立了 DB2 連接並注冊了 XML 模式,現在可以編寫 SQL INSERT 或 UPDATE 語句,以便將新的 XML 數據插入到包含 XML 列的表中,並在插入 XML 數據之前,讓 DB2 驗證 XML 數據。DB2 可以存儲最大為 2GB 的格式良好的任何 XML 文檔。清單 6 展示了將一行插入到 CARPOOL 表中的一種方法。在這個例子中,插入到 CARPOOLINFO 列的 XML 文檔是從字符串讀取的。


清單 6. 插入和更新 XML 數據的方法

   // Update the database based on the user's action in the dataGrid. 
   // Performs INSERT, UPDATE and DELETE. 
   private void update() 
    { 
      mydataSourceDT = carpoolInfo.DataSource as DataTable; 
      dtChanges = mydataSourceDT.GetChanges(); 
      if (dtChanges == null) 
        return; 
 
      // Need to generate insert/update/delete commands to //validate against 
      // carpoolinfo.xsd 
      DB2Command insert = new DB2Command 
        ("INSERT INTO CARPOOL" + 
        "(FIRSTNAME,LASTNAME,TITLE,PHONE,CARPOOLINFO)" + 
        " VALUES(?,?,?,?," + 
        "XMLVALIDATE(XMLparse (DOCUMENT CAST" + 
        " ( ? as CLOB) PRESERVE WHITESPACE )" + 
        "ACCORDING TO XMLSCHEMA ID " + schema + ".CARPOOLINFO ))"); 
 
      DB2Command update = new DB2Command 
       ("UPDATE CARPOOL SET FIRSTNAME=?,LASTNAME=?,TITLE=?,PHONE=?," + 
       "CARPOOLINFO=XMLVALIDATE(XMLparse (DOCUMENT CAST " + 
       "( ? as CLOB) PRESERVE WHITESPACE ) " + 
       "ACCORDING TO XMLSCHEMA ID " + schema + ".CARPOOLINFO ) WHERE ID=?"); 
 
      DB2Command delete = new DB2Command 
        ("DELETE FROM CARPOOL WHERE ID=?"); 
 
      //Add the Parameters and bind them to the DataTable's //corresponding columns. 
      DB2Parameter fn1 = new DB2Parameter("fn1", DB2Type.VarChar); 
      DB2Parameter fn2 = new DB2Parameter("fn2", DB2Type.VarChar);       
      fn1.SourceColumn = "FIRSTNAME"; 
      fn2.SourceColumn = "FIRSTNAME";       
      insert.Parameters.Add(fn1); 
      update.Parameters.Add(fn2); 
 
      DB2Parameter ln1 = new DB2Parameter("ln1", DB2Type.VarChar); 
      DB2Parameter ln2 = new DB2Parameter("ln2", DB2Type.VarChar);       
      ln1.SourceColumn = "LASTNAME"; 
      ln2.SourceColumn = "LASTNAME"; 
      insert.Parameters.Add(ln1); 
      update.Parameters.Add(ln2); 
 
      DB2Parameter tl1 = new DB2Parameter("tl1", DB2Type.VarChar); 
      DB2Parameter tl2 = new DB2Parameter("tl2", DB2Type.VarChar);       
      tl1.SourceColumn = "TITLE"; 
      tl2.SourceColumn = "TITLE";       
      insert.Parameters.Add(tl1); 
      update.Parameters.Add(tl2); 
 
      DB2Parameter ph1 = new DB2Parameter("ph1", DB2Type.VarChar); 
      DB2Parameter ph2 = new DB2Parameter("ph2", DB2Type.VarChar);      
      ph1.SourceColumn = "PHONE"; 
      ph2.SourceColumn = "PHONE";       
      insert.Parameters.Add(ph1); 
      update.Parameters.Add(ph2); 
 
      DB2Parameter info1 = new DB2Parameter("info1", DB2Type.Clob); 
      DB2Parameter info2 = new DB2Parameter("info2", DB2Type.Clob); 
      info1.SourceColumn = "CARPOOLINFO"; 
      info2.SourceColumn = "CARPOOLINFO";       
      insert.Parameters.Add(info1); 
      update.Parameters.Add(info2); 
 
      DB2Parameter i1 = new DB2Parameter("i1", DB2Type.Integer); 
      i1.SourceColumn = "ID";     
      update.Parameters.Add(i1); 
      DB2Parameter i2 = new DB2Parameter("i2", DB2Type.Integer); 
      i2.SourceColumn = "ID";  
      delete.Parameters.Add(i2);        
 
      da.InsertCommand = insert; 
      da.UpdateCommand = update; 
      da.DeleteCommand = delete; 
     
      // Perform the update. 
      da.Update(dtChanges); 
      mydataSourceDT.AcceptChanges(); 
 
      // Refill the dataset, refresh the dataGridVIEw. 
      ds.Clear(); 
      da.Fill(ds, xsdname); 
    } 


 

現在來看看這段代碼。在建立數據庫連接之後,該方法創建三個 DB2Command;一個用於插入,一個用於更新,還有一個用於刪除。插入和更新命令包含 4 個用於常規列值的參數占位符,而第 5 個參數占位符則用於 XML 列,該方法還使用 DB2 XMLVALIDATE 函數,並將 Carpoolinfo XML 模式傳遞給它以便進行驗證。

  查詢 XML 數據

  至此,已經將數據存儲在 CARPOOLINFO 表中,現在可以查詢這個表。DB2 允許編寫不同類型的查詢來提取關系數據和 XML 數據。例如可以編寫一個簡單的查詢來檢索整個 XML 文檔,或者編寫一個基於 XML 和關系查詢謂詞檢索 XML 文檔某些部分的查詢。本文演示一個這樣的查詢:

  基於 XML 謂詞過濾數據

  檢索符合條件的 XML 文檔的某些部分,以及存儲在傳統 SQL 列中的數據

  本文使用 DB2 的 XMLExists() 函數。本文中的示例應用程序使用 XMLExists() 來演示一個常見的編程任務:檢索 XML 文檔的某些部分。清單 7 中顯示的例子返回居住在舊金山或聖何塞的合伙用車者的合伙用車信息。這個例子同時投影和限制傳統的 SQL 數據和 XML 數據。 
清單 7. 查詢 XML 數據

   // Populate the dataGrid. 
   // If "All" is selected, all data from the table will be displayed. 
   // if a city's name is selected, only rows whose CARPOOLINFO contain 
   // <City>cityName</City> will be displayed.     
 
   public void populate(String cityName) 
    { 
      if ( cityName.Equals("All")) 
      { 
        carpoolInfo.DataSource = ds.Tables[xsdname]; 
      } 
      else 
      { 
        xq = "select * from CARPOOL where " + 
         "XMLexists('declare namespace 
         def=\"http://tempuri.org/XMLSchema.xsd\";" + 
         
         "$c/def:CARPOOLINFO/def:Address[def:City=" + "\"" + cityName + 
         "\"]' passing CARPOOL.CARPOOLINFO as \"c\")" + 
         "order by ID"; 
        DB2DataAdapter da1 = new DB2DataAdapter(xq, m_conn); 
        DataSet ds1 = new DataSet(); 
        da1.Fill(ds1, xsdname); 
        carpoolInfo.DataSource = ds1.Tables[xsdname];         
      } 
    } 

  WHERE 子句使用 DB2 的 XMLExists() 函數限制查詢所返回的數據。它規定,返回的 XML 文檔只包括在 CARPOOLINFO 的 city 為某個值(San Francisco 或 San Jose)的行中的那些 XML 文檔。在這個示例查詢中,XMLExists() 指示 DB2 判斷一個給定的 XML 文檔是否包含一個包括指定城市的 CARPOOL 地址。PASSING 子句指定 XML 文檔所在的位置(在 carpoolinfo 列中)。

  結束語

  IBM DB2 使程序員可以用熟悉的 SQL 語句更新和刪除 XML 數據。為了更新和刪除存儲在 DB2 中的 XML 數據,可以使用 SQL UPDATE 和 DELETE 語句。這些語句可以包括 SQL/XML 函數,這種函數可根據 XML 列中存儲的 XML 元素的值來限制目標行和列。例如,可以刪除包含居住在特定城市的合伙用車者的相關信息的行,或者只更新合伙用車的開始時間在某個給定時間段內的合伙用車者的 XML(和非 XML 數據)。由於在 UPDATE 和 DELETE 語句中使用 SQL/XML 函數的語法與在 SELECT 語句中使用這些函數的語法相同,因此不再給出完整的代碼示例。





 

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved