SQL Server2000的OpenXML特性 (轉)
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=" 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【轉帖】認識SQL Server2000 中的CheckPointSQLServer
- 【Openxml】將Openxml的橢圓弧線arcTo轉為Svg的橢圓弧線XMLSVG
- 修改Delphi使之適應SQL Server2000 (轉)SQLServer
- 生成sql server2000物件建立指令碼的儲存過程(轉)SQLServer物件指令碼儲存過程
- dotnet OpenXML 轉換 PathFillModeValues 為顏色特效XMLdev特效
- l有Sql Server2000 的JDBC映絛?,SQLServerJDBC
- SELECT * FROM OPENXML在sql2000、sql2005中使用的不同XMLSQL
- SQL Server2000 重溫筆記SQLServer筆記
- SQL Server2000表複製的原理問題SQLServer
- 實戰JBuilder7+WebLogic7存取MS SQL Server2000(一) (轉)UIWebSQLServer
- SQL Server2000 許可權問題SQLServer
- Hibernate配置連線SQL SERVER2000SQLServer
- 配置jsp+jdk1.4+tomcat4.0+servlet+sql server2000(jdbc driver) (轉)JSJDKTomcatServletSQLServerJDBC
- dotnet OpenXML SDK 新增 CoreFilePropertiesPart 的方法XML
- 認識SQL Server2000 master資料庫SQLServerAST資料庫
- 認識SQL Server2000 tempdb資料庫SQLServer資料庫
- 認識SQL Server2000 msdb資料庫SQLServer資料庫
- 認識SQL Server2000 Log Shipping 【zt】SQLServer
- 認識SQL Server2000 model資料庫SQLServer資料庫
- Sql server2000獲取系統時間SQLServer
- [zt] 怎樣解除安裝SQL Server2000SQLServer
- sql server2000忘記sa密碼的解決方法SQLServer密碼
- 如何處理SQL Server2000 中的suspect 置疑的資料庫SQLServer資料庫
- ----------------SQL Server2000中死鎖經驗總結 ---------------SQLServer
- 認識SQL Server2000 幾種恢復模式SQLServer模式
- 認識SQL Server2000 Server Role 和 Database RoleSQLServerDatabase
- 認識SQL Server2000 三種恢復模式SQLServer模式
- XML文件插入SQL Server2000資料庫(2)XMLSQLServer資料庫
- XML文件插入SQL Server2000資料庫(1)XMLSQLServer資料庫
- 用Java連線SQL Server2000資料庫JavaSQLServer資料庫
- Excel資料匯入SQL Server2000的儲存過程ExcelSQLServer儲存過程
- 請推薦一個SQL Server2000的2類驅動SQLServer
- SQL Server2000 如何恢復系統資料庫?SQLServer資料庫
- 安裝與ms sql server2000連線問題?SQLServer
- 認識SQL Server2000 資料庫備份的型別[ZT]SQLServer資料庫型別
- pl/sql功能特性SQL
- 十步搞定tomcat4.1.18 Servlet中的SQL SERVER2000資料庫連線池 (轉)TomcatServletSQLServer資料庫
- 在安裝有sql server2000的基礎上裝sql server 2005遇到的問題SQLServer