仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 623|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL编程:SQL Server2000的OpenXML特征

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:48:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
而且其固有的弹性使得它易于扩展以处理不断增长的需求,或当需求MySQL学习教程减弱时缩减规模。server|xml
SQLServer2000的OpenXML特征



SQLServer2000供应了OpenXML特征,我们能够很便利的用OpenXML特征来取代传统的行集了局,一样我们也能够利用界说好的XML文档作为输出的数据,如许也为我们的数据移植带来的伟大的便当。

同时,SQLServer2000中也供应了存储历程,用微软的话说,只要计划成存储历程,才算是”cleanerseparationofcodefromthemiddle-tier”,如许做是很好的。使用程序会见数据库的数据并非间接的与数据库表打交道,而是经由过程存储历程的运转来猎取所必要的数据。如许的计划有一个优点就是,制止了频仍的表操纵,而经由过程运转在服务器真个存储历程能够极年夜的进步运作效力和提拔会见数据的速率,同时也很好的屏障了数据库表的逻辑,使得数据库会见酿成了数据库供应的服务会见。

既然OpenXML和存储历程都能够进步SQLServer2000的功能,那末可否把这类手艺分离起来了?谜底是一定的,上面我们就来看看怎样在存储过程当中利用OpenXML.

以下是一个利用了OpenXML特征的存储历程:

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



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

--upArchiveMsgInsertMsg

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

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

这是一个公函动静xml文档的实例



declare@xmlvarchar(8000)

SET@xml=<?xmlversion="1.0"encoding="gb2312"?>

<ArchiveMsg

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

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

AttachFile="hust"

ReceiveList="younther"Body="hustwelcome">

<MsgListUserID="Admin"/>

<MsgListUserID="Anime"/>

<MsgListUserID="Tiger"/>

</ArchiveMsg>



execupArchiveMsgInsertMsg@xml



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

//这个运转存储历程先在ArchiveMsg表中拔出一条公函信息,并依据该条公函信息的MsgID和承受者列表,再在MsgList表拔出每一个承受者的UserID和MsgID,这些信息从xml中猎取。



ALTERPROCEDUREupArchiveMsgInsertMsg

(

@xmlvarchar(8000)

)

AS

DECLARE@idocint--xmldoc

DECLARE@MsgIDint--neworder

DECLARE@SendTimedatetime

--剖析XML文档

EXECsp_xml_preparedocument@idocoutput,@xml

SETNOCOUNTON

DECLARE@CurrentErrorint

BEGINTRANSACTION

--入手下手更新数据的事件



SELECT@SendTime=SendTime

FROMOpenXML(@idoc,/ArchiveMsg)

WITHArchiveMsg



INSERTINTOArchiveMsg(Title,UserID,Author,SendTime,Department,ReceiveList,Body,AttachFile)

SELECTTitle,UserID,Author,SendTime,Department,ReceiveList,Body,AttachFile

FROMOpenXML(@idoc,/ArchiveMsg)

WITHArchiveMsg



--毛病反省

SELECT@CurrentError=@@Error

IF@CurrentError!=0

BEGIN

GOTOERROR_HANDLER

END



SELECT@MsgID=@@IDENTITY



INSERTINTOMsgList(MsgID,UserID,SendTime)

SELECT@MsgID,UserID,@SendTime

FROMOpenXML(@idoc,/ArchiveMsg/MsgList)

WITH(

MsgIDint,

UserIDvarchar(80),

SendTimedatetime

)

--毛病反省

SELECT@CurrentError=@@Error



IF@CurrentError!=0

BEGIN

GOTOERROR_HANDLER

END



--事件停止

COMMITTRANSACTION

SETNOCOUNTOFF

--从内存中移除界说的XML文档

EXECsp_xml_removedocument@idoc



RETURN0



ERROR_HANDLER:

ROLLBACKTRANSACTION

SETNOCOUNTOFF

--从内存中移除界说的XML文档

EXECsp_xml_removedocument@idoc

RETURN@CurrentError

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

好了,存储历程就是如许了,我们得测试这个存储历程,测试函数代码以下:

起首我们得天生这个XML文档,为了烦琐起见,我们就用一个String变量来摸拟XML文档:

publicstringGetXmlString(ArchiveDetailmyMsg,string[]useridList)

{

stringxml="<?xmlversion="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(stringiinuseridList)

{

xml+="<MsgListUserID=""+i+""/>";

}

xml+="</ArchiveMsg>";

returnxml;

}

然后就是挪用这个存储历程的函数:

publicboolSendArchiveMsg(ArchiveDetailmyMsg,string[]useridList)

{

stringxml=this.GetXmlString(myMsg,useridList);

try

{

SqlParameter[]prams={data.MakeInParam("@xml",SqlDbType.VarChar,8000,xml)

};

SqlConnectioncon=new

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

con.Open();



SqlCommandcmd=newSqlCommand("upArchiveMsgInsertMsg",con);

cmd.CommandType=CommandType.StoredProcedure;

foreach(SqlParameterparameterinprams)

cmd.Parameters.Add(parameter);



cmd.Parameters.Add(

newSqlParameter("ReturnValue",SqlDbType.Int,4,

ParameterDirection.ReturnValue,false,0,0,

string.Empty,DataRowVersion.Default,null));



cmd.ExecuteNonQuery();

con.Close();

intretval=(int)cmd.Parameters["ReturnValue"].Value;

if(retval==0)

returntrue;

else

returnfalse;

}

catch(Exceptionex)

{

Error.Log(ex.ToString());

returnfalse;

}

}





在上述的代码中,代码量对照多,可是实践的处置历程实在对照复杂,大抵以下:

界说xml文

在存储过程当中引进xml,使用sqlserver的openxml对的地方理(详细就是几个与xml相干的函数)

在程序中挪用存储历程

停止。

经由过程如许的体例我们就能够很便利的把xml及sqlserver分离起来使用。

固然sqlserver对xml的撑持不但在此,假如有把稳的能够看到在IIS中也能够设置sqlxml,相干方面的内容,在后续的文章中会渐渐先容,在文中有不细致及不当的地方,还请列位网友品评斧正。


”由于MySQL已经是一个运行了众多知名Web2.0网站的数据,包括Craigslist、Digg、Wikipedia和Google等,或许我们可以说每一个Web2.0公司实质上是一个使用MySQL数据库的公司。
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-1-20 05:03:10 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
分手快乐 该用户已被删除
板凳
发表于 2015-1-25 21:51:45 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
admin 该用户已被删除
地板
发表于 2015-2-4 05:53:41 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
精灵巫婆 该用户已被删除
5#
发表于 2015-2-9 16:27:32 | 只看该作者
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
飘飘悠悠 该用户已被删除
6#
发表于 2015-2-27 10:38:40 | 只看该作者
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
谁可相欹 该用户已被删除
7#
发表于 2015-3-9 00:56:37 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
简单生活 该用户已被删除
8#
发表于 2015-3-16 19:31:39 | 只看该作者
然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
透明 该用户已被删除
9#
发表于 2015-3-23 00:08:18 | 只看该作者
比如日志传送、比如集群。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 02:07

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表