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

首頁 > 編程 > .NET > 正文

.Net開發采用DB2 XML的應用程序示例

2024-07-10 13:13:12
字體:
來源:轉載
供稿:網友

  一個存儲庫,例如關系數據庫,可以為授權用戶安全地共享 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 數據庫(具體步驟請參閱 “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 表定義

  這里有兩個 xml 模式,carpoolinfo.xsd 和 usaddresstype.xsd,其中 carpoolinfo.xsd 引用了 usaddresstype。

  清單 2. 用于驗證 carpool 表中的 xml 文檔的 xml 模式(carpoolinfo.xsd)

  注冊 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 模式

|||

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
热久久视久久精品18亚洲精品| 成人免费网站在线| 国内精品美女av在线播放| 亚洲色图激情小说| 久久这里只有精品视频首页| 国内精久久久久久久久久人| 欧美日韩国产中文精品字幕自在自线| 少妇高潮久久久久久潘金莲| 亚洲国产精品成人精品| 国产一区二区三区日韩欧美| 日韩亚洲欧美成人| 午夜精品久久久久久99热| 国产欧美精品在线播放| 97免费在线视频| 精品激情国产视频| 成人午夜高潮视频| 国产国语刺激对白av不卡| 国产精品jvid在线观看蜜臀| 91精品视频在线免费观看| 国产精品v片在线观看不卡| 中文字幕9999| 国产亚洲精品久久久优势| 亚洲欧美一区二区三区在线| 国产激情久久久| 久久精品男人天堂| 亚洲日本成人女熟在线观看| 日本成人黄色片| 日韩精品在线视频| 51色欧美片视频在线观看| 国产精品视频精品| 亚洲视频综合网| 亚洲人a成www在线影院| 欧美成人免费视频| 久久久久国产一区二区三区| 日本国产一区二区三区| 国产精品久久久av| 最新69国产成人精品视频免费| 精品亚洲一区二区| 亚洲福利视频二区| 欧美专区福利在线| 欧美激情一级欧美精品| 国产精品黄页免费高清在线观看| 久久久久久久久久婷婷| 丁香五六月婷婷久久激情| 国产精品成av人在线视午夜片| 亚洲精品av在线播放| 精品国产一区二区三区久久狼5月| 国产精品十八以下禁看| 日本sm极度另类视频| 国产精品99久久久久久久久久久久| 91午夜理伦私人影院| 国产精品久久久久高潮| 91亚洲一区精品| 在线成人中文字幕| 国产亚洲精品va在线观看| 中文字幕国产精品久久| 成人久久久久久久| 国产精品视频一区二区高潮| 91中文在线观看| 日韩av电影中文字幕| 久久久精品在线观看| 一二美女精品欧洲| 播播国产欧美激情| 91在线国产电影| 97精品国产91久久久久久| 国产一区二区三区在线观看网站| 不卡av在线网站| 日韩欧美中文第一页| 亚洲精品视频二区| 国产91网红主播在线观看| 在线观看日韩www视频免费| 亚洲一区国产精品| 亚洲色在线视频| 精品欧美国产一区二区三区| 国产精品99久久99久久久二8| 国产亚洲精品激情久久| 国产精品午夜一区二区欲梦| 国产日韩欧美综合| 日韩精品免费电影| 热久久美女精品天天吊色| 欧美大片免费看| 国产乱人伦真实精品视频| 国产不卡一区二区在线播放| 亚洲娇小xxxx欧美娇小| 国产噜噜噜噜噜久久久久久久久| 欧美日韩国产精品一区二区不卡中文| 亚洲性猛交xxxxwww| 欧美激情免费视频| 最新日韩中文字幕| 亚洲直播在线一区| 国产精品中文在线| 欧美性极品xxxx娇小| 国产精品无av码在线观看| 亚洲国产91精品在线观看| 欧美午夜美女看片| 美女久久久久久久| 国产一区二区三区在线观看网站| 亚洲精品第一国产综合精品| 国产原创欧美精品| 欧美自拍视频在线观看| 91wwwcom在线观看| 少妇高潮 亚洲精品| 欧美一区视频在线| 亚洲精品视频免费在线观看| 亚洲国产成人在线视频| 精品久久久久久久中文字幕| 91网站在线看| 日韩视频中文字幕| 97激碰免费视频| 日本免费久久高清视频| 欧美床上激情在线观看| 韩剧1988在线观看免费完整版| 亚洲97在线观看| 九九九久久久久久| 国产精品久久久久久久美男| 爱福利视频一区| 国内外成人免费激情在线视频| 久久久久日韩精品久久久男男| 91亚洲精品在线观看| 韩国三级日本三级少妇99| 亚洲人成亚洲人成在线观看| 欧美日韩xxx| 日韩美女视频在线观看| 色偷偷噜噜噜亚洲男人的天堂| 亚洲第一视频网站| 亚洲品质视频自拍网| 久久久久国产精品www| 国产精品第一第二| 91色视频在线观看| 日韩女优人人人人射在线视频| 久久噜噜噜精品国产亚洲综合| 红桃视频成人在线观看| 亚洲97在线观看| 最近2019年中文视频免费在线观看| 欧美在线视频免费观看| 亚洲国产一区二区三区在线观看| 亚洲一区国产精品| 91深夜福利视频| 伊人久久久久久久久久久久久| 精品国产精品三级精品av网址| 三级精品视频久久久久| 欧美性猛交xxxx免费看| 欧美成人三级视频网站| 在线观看久久av| 中文字幕国产精品久久| 国产精品96久久久久久又黄又硬| 亚洲xxx视频| 中文字幕久热精品在线视频| 91久久久国产精品| 日韩在线视频观看正片免费网站| 日韩一区视频在线| 色悠悠久久久久| 久久久亚洲国产| 在线视频一区二区| 久久久91精品国产| 91av视频在线观看| 久久久久亚洲精品| 国产一区二区三区在线视频| 91香蕉国产在线观看| 高清日韩电视剧大全免费播放在线观看| 亚洲激情在线观看视频免费| 国产在线观看一区二区三区| 国产精品免费小视频| 久久久国产成人精品|