首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
TechnoFantasy (52)
feifei1018 (19)
coofucoo (108)
qingrun (67)
btbtd (83)
longrujun (64)
cyz1980 (101)
ssll2826 (10)
EmilMatthew (73)
goodboy1881 (15)
CSDN - 文档中心 - 数据库开发 阅读:6335   评论: 4    参与评论
标题   SQL Server2000的OpenXML特性     选择自 younther 的 Blog
关键字   OpenXML,存储过程,SQL Server2000
出处  

SQL Server2000OpenXML特性

 

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 @MsgID=@@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,相关方面的内容,在后续的文章中会逐渐介绍,在文中有不详尽及不妥之处,还请各位网友批评指正。

 


相关文章
对该文的评论
brotherq ( 2004-04-18)
我也用这种方法解决的,但是用变量传递XML文档,其长度有限,能传递的数据记录不多。
accesine960 ( 2003-08-05)
又看了一遍,太好了
accesine960 ( 2003-08-05)
你太聪明了
你为了解决了困扰我3个月的问题

你是协力商霸的吗?
我希望和你交流
accesine@163.com
accesine@hotmail.com
www.accesine.com
kingecg ( 2003-07-30)
定义xml文件?
这个文件是作为变量传到sp中的?