網站運營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,相關方面的內容,在后續的文章中會逐漸介紹,在文中有不詳盡及不妥之處,還請各位網友批評指正。