亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 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久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久在线播放| 欧美亚洲第一页| 日韩网站免费观看高清| 国产狼人综合免费视频| 麻豆一区二区在线观看| 91超碰中文字幕久久精品| 欧美综合一区第一页| 91美女福利视频高清| 欧美一区二粉嫩精品国产一线天| 亚洲激情免费观看| 欧美在线一级va免费观看| 国产成人中文字幕| 欧美大片网站在线观看| 日本一区二区在线免费播放| 日韩美女免费视频| 亚洲欧美国产精品久久久久久久| 国产啪精品视频网站| 久久久亚洲成人| 97色在线观看免费视频| 日韩一区二区三区在线播放| 一区二区国产精品视频| 国产精品手机播放| 亚洲一区二区久久久| 高清欧美性猛交xxxx黑人猛交| 91免费精品国偷自产在线| 92版电视剧仙鹤神针在线观看| 中文字幕av一区二区三区谷原希美| 日韩欧美国产视频| 91久久在线视频| 国产日韩综合一区二区性色av| 欧美日韩免费看| 欧美激情精品久久久| 国产精品十八以下禁看| 色偷偷88888欧美精品久久久| 日韩免费精品视频| 亚洲一区中文字幕在线观看| 2019中文字幕全在线观看| 国产成人aa精品一区在线播放| 成人国产在线激情| 91在线观看免费| 亚洲美女在线观看| 久久综合电影一区| 91视频国产精品| 久久久亚洲精品视频| 国产精品吹潮在线观看| 欧美一级视频一区二区| 狠狠躁夜夜躁久久躁别揉| 91情侣偷在线精品国产| 97久久精品视频| 91久久国产婷婷一区二区| 久久久噜噜噜久久中文字免| 日韩中文字幕不卡视频| 久久精品一偷一偷国产| 91色琪琪电影亚洲精品久久| 91av视频在线| 日韩av电影在线网| 91免费观看网站| 欧美最近摘花xxxx摘花| 国产视频欧美视频| 国产精品99导航| 国模吧一区二区| 久久久中精品2020中文| 久久艳片www.17c.com| 欧美精品国产精品日韩精品| 欧美激情a∨在线视频播放| 日韩av大片在线| 欧美色另类天堂2015| 国产精品久久久久aaaa九色| 97视频在线观看免费| 国产日韩欧美自拍| 亚洲成人网在线观看| 成人字幕网zmw| 亚洲免费视频一区二区| 久久亚洲精品一区二区| 热久久这里只有精品| 亚洲一区二区久久久久久久| 欧美性视频精品| 国产视频在线观看一区二区| 日韩精品久久久久久久玫瑰园| 久久精品国产亚洲一区二区| www.日韩系列| 欧美电影在线播放| 久久久久久久久亚洲| 亚洲欧洲在线视频| 日本久久久a级免费| 久久久久久国产精品久久| 亚洲视频在线观看免费| 国产视频精品一区二区三区| 久久69精品久久久久久久电影好| 91亚洲精品在线观看| 欧美日韩在线影院| 中文字幕不卡av| 欧美性猛交xxxx乱大交蜜桃| 亚洲国产精彩中文乱码av| 久久精品久久久久久国产 免费| 国产成人综合久久| 亚洲性生活视频在线观看| 亚洲自拍中文字幕| 一个人看的www欧美| 宅男66日本亚洲欧美视频| 国产精品成人观看视频国产奇米| 亚洲美女精品久久| 亚洲第一区第二区| 欧美性极品xxxx做受| 中文字幕亚洲情99在线| 91精品国产一区| 亚洲人成电影在线观看天堂色| 一区二区国产精品视频| 日本国产高清不卡| 91日本在线观看| 日韩av免费在线看| 97久久精品人搡人人玩| 日韩一区二区三区在线播放| 欧美福利视频在线| 久久伊人免费视频| 亚洲国产精品字幕| 欧美性xxxx在线播放| 久久久久久18| 亚洲成色999久久网站| 九九热99久久久国产盗摄| 国产女精品视频网站免费| 国产成人亚洲综合青青| 69久久夜色精品国产7777| 久久精品电影网| 亚洲在线视频观看| 国产精品99久久久久久www| 国产精品久久久久久一区二区| 亚洲qvod图片区电影| 成人激情视频免费在线| 精品亚洲一区二区三区四区五区| 中文字幕日韩在线播放| 亚洲电影天堂av| 日韩激情视频在线| 91网站在线看| 亚洲**2019国产| 国产欧美精品一区二区三区介绍| 国产精自产拍久久久久久蜜| 亚洲欧美综合区自拍另类| 97国产精品视频| 日韩精品中文字幕在线观看| 成人乱人伦精品视频在线观看| 欧美中文在线视频| 国产91色在线|| 亚洲黄在线观看| 在线视频日韩精品| 亚洲精选一区二区| 欧美丰满少妇xxxxx做受| 国产国语videosex另类| 欧美网站在线观看| 国产精品美女免费视频| 欧美小视频在线观看| 国产精品自拍偷拍视频| 欧美日韩在线观看视频| 日本a级片电影一区二区| 上原亚衣av一区二区三区| 粉嫩老牛aⅴ一区二区三区| 亚洲精品久久久久中文字幕二区| 97超级碰碰碰久久久| 欧美午夜女人视频在线| 日韩少妇与小伙激情| 国产成人鲁鲁免费视频a| 亚洲欧美国产一区二区三区| 国产精品十八以下禁看| 最新国产精品拍自在线播放|