|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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数据库的公司。 |
|