SQL Server2000的OpenXML特性 (轉)

gugu99發表於2007-08-16
SQL Server2000的OpenXML特性 (轉)[@more@]

SERVER2000的Open特性microsoft-com::office" />

2000提供了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='

 

  Title="jiangsuer" UserID="Admin" Author="湖北"

  SendTime="1/1/2001" Department="mse"

  AttachFile="hust"

  ReceiveList="younther" Body="hustwelcome">

 

   

 

   

'

  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

    -- 開始資料的事務

 

    @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 @MsgID=@@NTITY

   

   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+="

  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+="";

  }

  xml+="

";

  return xml;

  }

然後就是這個儲存過程的函式:

  public bool SendArchiveMsg(ArchiveDetail myMsg,string[] useridList)

  {

  string xml=this.GetXmlString(myMsg,useridList);

  try

  {

  SqlParameter[] prams={  data.MakeInParam("@xml",SqlType.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,相關方面的內容,在後續的文章中會逐漸介紹,在文中有不詳盡及不妥之處,還請各位網友批評指正。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-960891/,如需轉載,請註明出處,否則將追究法律責任。

相關文章