麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > XML > 正文

DB2 VS2005.Net插件進行XML數據驗證

2024-09-05 20:56:02
字體:
來源:轉載
供稿:網友

  一個存儲庫,例如關系數據庫,可以為授權用戶安全地共享 xml 文檔和 xml 模式提供一個環境。授權用戶可以在任何時候、任何地方安全地訪問重要的 xml 文檔和 xml 模式。通過使用可包含一個或多個關系數據庫系統的存儲庫系統,用戶可以找到并檢索最新版本的 xml 文檔和 xml 模式文檔。db2® 9 為 xml 提供了新的支持,對于這種新支持,.net 應用程序開發人員可以很快地上手。這是因為 db2 9 讓程序員可以像對待關系數據那樣查詢、插入、更新和刪除 xml 數據 —— 使用熟悉的 ado .net 語句和標準的查詢語言。本文展示一些關于如何使用 .net 構建采用 db2 xml 技術的應用程序的詳細示例。db2 xml 技術允許以 xml 原有的分層格式來存儲、驗證和查詢 xml。

  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 數據庫。確認在 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 文檔

  示例 xml 文檔

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

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

  1.   啟動 visual studio 2005。
  2.   創建一個新項目。選擇 file > new > project。選擇 visual c# > windows application。
  3.   創建對 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 文檔某些部分的查詢。本文演示一個這樣的查詢:

  1.   基于 xml 謂詞過濾數據
  2.   檢索符合條件的 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

  // cityname 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 語句中使用這些函數的語法相同,因此不再給出完整的代碼示例。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 全黄毛片| 欧美一级成人一区二区三区 | 欧美成人精品一区二区三区 | 国产流白浆高潮在线观看 | 国产亚洲精彩视频 | 国产毛片毛片毛片 | 久久久久成人免费 | 亚洲第五色综合网 | 国产一级在线看 | 国产精品成人一区二区三区电影毛片 | 欧美亚成人 | 久久精品av | 亚洲一区二区三区91 | 亚洲小视频 | 欧美一级做a | 91九色视频观看 | 羞羞的视频免费在线观看 | 91精品国产乱码久久久久久久久 | 国产成人网| 日韩视频一区二区 | 九九热在线精品视频 | 最近免费观看高清韩国日本大全 | 久久久电影电视剧免费看 | 丁香天堂网 | 久久免费视频1 | 舌头伸进添的我好爽高潮网站 | 日韩欧美激情视频 | 精品xxxx户外露出视频 | 国产91亚洲精品一区二区三区 | 天天草天天色 | 欧美一级淫片免费视频1 | 国产精品免费麻豆入口 | 亚洲免费看片网站 | 男女羞羞视频在线免费观看 | 亚洲网站在线 | 中国a级黄色片 | 国产青草视频在线观看视频 | 亚洲精品动漫在线观看 | 成人h精品动漫一区二区三区 | 一级黄色影片在线观看 | 极品大长腿啪啪高潮露脸 |