国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL Server2000的OpenXML特性

2024-08-31 00:48:24
字體:
來源:轉載
供稿:網友
  • 網站運營seo文章大全
  • 提供全面的站長運營經驗及seo技術!

  • sql server2000的openxml特性

     

    sql server2000提供了openxml特性,我們可以很方便的用openxml特性來代替傳統的行集結果,同樣我們也可以使用定義好的xml文檔作為輸入的數據,這樣也為我們的數據移植帶來的巨大的便利。

    同時,sql server2000中也提供了存儲過程,用微軟的話說,只有設計成存儲過程,才算是”cleaner separation of code from the middle-tier”,這樣做是很好的。應用程序訪問數據庫的數據并不是直接的與數據庫表打交道,而是通過存儲過程的運行來獲取所需要的數據。這樣的設計有一個好處就是,避免了頻繁的表操作,而通過運行在服務器端的存儲過程可以極大的提高運作效率和提升訪問數據的速度,同時也很好的屏蔽了數據庫表的邏輯,使得數據庫訪問變成了數據庫提供的服務訪問。

    既然openxml和存儲過程都可以提高sql server2000的性能,那么能否把這種技術結合起來了?答案是肯定的,下面我們就來看看怎么在存儲過程中使用openxml.

    以下是一個使用了openxml特性的存儲過程:

    *******************************************************************************

     

    -------------------------------------------------------------------------------

    -- uparchivemsginsertmsg

    -------------------------------------------------------------------------------

    /******************************************************************************

         這是一個公文消息xml文檔的實例

        

         declare @xml varchar(8000)

         set @xml='<?xml version="1.0" encoding="gb2312" ?>

             <archivemsg

             title="jiangsuer" userid="admin" author="湖北"

             sendtime="1/1/2001" department="mse"

             attachfile="hust"

             receivelist="younther" body="hustwelcome">

                  <msglist userid="admin"/>

               <msglist userid="anime"/>

                  <msglist userid="tiger"/>

               </archivemsg>'

     

         exec uparchivemsginsertmsg @xml

        

    *******************************************************************************/

    //這個運行存儲過程先在archivemsg表中插入一條公文信息,并根據該條公文信息的msgid和接受者列表,再在msglist表插入每個接受者的userid和msgid,這些信息從xml中獲取。

     

    alter procedure uparchivemsginsertmsg

         (

             @xml         varchar(8000)

         )

    as

          declare @idoc int      -- xml doc

         declare @msgid int     -- new order

         declare @sendtime datetime

            -- 解析xml文檔

         exec sp_xml_preparedocument @idoc output, @xml

          set nocount on

          declare @currenterror int

          begin transaction

            -- 開始更新數據的事務

        

          select @sendtime=sendtime

          from openxml(@idoc, '/archivemsg')

          with archivemsg

          

    insert into archivemsg(title,userid,author,sendtime,department,receivelist,body,attachfile)

          select title,userid,author,sendtime,department,receivelist,body,attachfile

          from openxml(@idoc, '/archivemsg')

          with archivemsg

        

              -- 錯誤檢查

          select @currenterror = @@error

        if @currenterror != 0

            begin

                 goto error_handler

            end

               

          select @[email protected]@identity

          

          insert into msglist(msgid,userid,sendtime)

          select @msgid,userid,@sendtime

          from openxml(@idoc, '/archivemsg/msglist')

             with  (

                     msgid   int,

                    userid  varchar(80),

                    sendtime datetime

             )

       -- 錯誤檢查    

           select @currenterror = @@error

     

        if @currenterror != 0

            begin

                 goto error_handler

            end

          

         -- 事務結束

          commit transaction

          set nocount off

             -- 從內存中移除定義的xml文檔

        exec sp_xml_removedocument @idoc

     

         return 0

        

          error_handler:

              rollback transaction

              set nocount off   

               -- 從內存中移除定義的xml文檔

              exec sp_xml_removedocument @idoc

              return  @currenterror  

    *******************************************************************************

    好了,存儲過程就是這樣了,我們得測試這個存儲過程,測試函數代碼如下:

    首先我們得生成這個xml文檔,為了簡便起見,我們就用一個string變量來摸擬xml文檔:

             public string getxmlstring(archivedetail mymsg,string[] useridlist)

             {

                  string xml="<?xml version=/"1.0/" encoding=/"gb2312/" ?>";

                  xml+="<archivemsg ";

                  xml+="title=/""+mymsg.title+"/" ";

                  xml+="userid=/""+mymsg.userid+"/" ";

                  xml+="author=/""+mymsg.author+"/" ";

                  xml+="sendtime=/""+mymsg.sendtime.tostring()+"/" ";

                  xml+="department=/""+mymsg.department+"/" ";

                  xml+="attachfile=/""+mymsg.attachfilepath+"/" ";

                  xml+="receivelist=/""+mymsg.receivelist+"/" ";

                  xml+="body=/""+mymsg.body+"/">";

                  foreach(string i in useridlist)

                  {

                       xml+="<msglist userid=/""+i+"/"/>";

                  }

                  xml+="</archivemsg>";

                  return xml;

             }

    然后就是調用這個存儲過程的函數:

             public bool sendarchivemsg(archivedetail mymsg,string[] useridlist)

             {

                  string xml=this.getxmlstring(mymsg,useridlist);

                  try

                  {

                       sqlparameter[] prams={                                           data.makeinparam("@xml",sqldbtype.varchar,8000,xml)                              

                                };

    sqlconnection con = new

     sqlconnection("server=127.0.0.1;uid=sa;pwd=sa;database=mydatabase");

                  con.open();

     

                  sqlcommand cmd = new sqlcommand("uparchivemsginsertmsg", con);

                  cmd.commandtype = commandtype.storedprocedure;

                  foreach (sqlparameter parameter in prams)

                           cmd.parameters.add(parameter);

     

                  cmd.parameters.add(

                  new sqlparameter("returnvalue", sqldbtype.int, 4,

                  parameterdirection.returnvalue, false, 0, 0,

                  string.empty, datarowversion.default, null));

     

                  cmd.executenonquery();

                  con.close();

                  int retval = (int)cmd.parameters["returnvalue"].value;

                  if(retval==0)

                       return true;

                  else

                       return false;

                  }

                  catch(exception ex)

                  {

                       error.log(ex.tostring());

                       return false;

                  }

             }

     

     

    在上述的代碼中,代碼量比較多,但是實際的處理過程其實比較簡單,大致如下:

      定義xml文

      在存儲過程中引入xml,利用sql server的open xml對之處理(具體就是幾個與xml相關的函數)

      在程序中調用存儲過程

      結束。

    通過這樣的方式我們就可以很方便的把xml及sql server結合起來應用。

    當然sql server對xml的支持不僅在此,如果有留心的可以看到在iis中也可以配置sqlxml,相關方面的內容,在后續的文章中會逐漸介紹,在文中有不詳盡及不妥之處,還請各位網友批評指正。

     
    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 大悟县| 平度市| 涿鹿县| 鄱阳县| 太保市| 清水河县| 雷州市| 灵璧县| 洱源县| 桓台县| 台江县| 阿尔山市| 定边县| 卢龙县| 屯留县| 常山县| 安义县| 昆山市| 沽源县| 龙胜| 洛阳市| 乳山市| 云龙县| 资溪县| 吴旗县| 远安县| 侯马市| 克拉玛依市| 邵阳市| 康乐县| 永和县| 广德县| 磐安县| 景德镇市| 唐河县| 井陉县| 凤凰县| 西林县| 乐平市| 保靖县| 蒲江县|