淺析.NET下XML資料訪問新機制

來源:互聯網
上載者:User
xml|訪問|資料 一.前言:

  XML作為Web服務的基石,其重要性自然是不言而喻的,它正日益被開發人員所重視。同時隨著各類新興開發工具的推出,XML資料的訪問機制也變得越來越靈活多樣。.Net架構為開發人員提供了幾種新的XML資料訪問機制,每種機制都提供了不同的XML資料訪問支援。所以對於開發人員而言,選擇正確合適的XML資料訪問機制變得相當重要,它會影響到項目開發的複雜度以及應用程式的整體效率。

  大體來講,.Net架構為開發人員提供了ADO.Net中的資料集XML資料訪問機制和SqlDataReader XML資料訪問機制這兩種新的機制。為方便起見,我們不妨將前一種機制稱為ADO.Net機制,而後一種為SqlDataReader機制。本文我就主要向大家介紹這兩種機制,同時我還會介紹SQLXML和ADO 2.6這兩種比較傳統的XML資料訪問機制,並在最後將它們的效能做一個比較,以使讀者更清楚在具體的應用中應選擇哪種機制。本文的執行個體程式將用到SQL Server中的Northwind資料庫,通過訪問該資料庫我們可以擷取相應的XML資料並據此對不同的訪問機制進行效能比較和分析。

二.各種機制介紹:

  ADO.Net是ADO升級版本,它為我們提供了全新的資料訪問機制,在提高資料訪問效率的同時它也大大簡化了開發人員的工作量,所以熟練掌握和運用ADO.Net進行開發是.Net開發人員不可或缺的基本能力。

  ADO.Net為開發人員提供了兩種資料訪問模式:一種為串連模式(Connected),另一種為非串連模式(Disconnected)。前一種模式和傳統的ADO模式是一樣的,而後一種模式則為.Net所專屬也是為.Net所推薦的,該模式的核心部分為ADO.Net中的資料集對象(DataSet)。資料集對象的類位於System.Data命名空間中,它對XML有相當完善的支援。在非串連模式下工作時,資料集對象能以XML的形式將資料存放區在主存中並提供使用者操作使用,因此通過一個簡單的方法它就能將關係型的資料轉化為層次化的具有良好模式的XML資料,這就是前面提到的ADO.Net機制。

  下面,我就通過建立一個執行個體程式向大家介紹該機制下的XML資料訪問的具體方法。首先建立一個控制台應用程式的C#項目,該執行個體程式主要顯示了不同的XML資料訪問機制的運行效率。同時添加一個新的類,檔案名稱不妨命名為DBXml.cs,該類包含了幾種XML資料訪問機制的不同實現方法,它們分別是:ExecuteADONetSelect、ExecuteSqlDataReaderSelect以及ExecuteSqlXmlSelect,分別代表了ADO.Net機制、SqlDataReader機制和SQLXML機制,而ADO 2.6這種機制則會在後面介紹。接著,為該類添加必要的命名空間。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Xml;
using Microsoft.Data.SqlXml;



其中對於Microsoft.Data.SqlXml命名空間需要先添加對Microsoft.Data.SqlXml組件的引用,而該組件是在安裝了SQLXML 3.0以後就會有的,添加的方法如圖1所示:




圖1


現在為該類添加ExecuteADONetSelect()方法,該方法執行了對資料庫的SELECT查詢操作,具體實現如下:

public string ExecuteADONetSelect(string CustomerID,
string ConnectionString)
{
// 建立一個資料庫連接對象
SqlConnection myConnection = new SqlConnection(ConnectionString);
// 建立一個資料配接器對象
SqlDataAdapter mySqlDataAdapter1 = new SqlDataAdapter("SELECT *
FROM customers WHERE CustomerID = @CustomerID", myConnection);
// 為其參數集添加參數
mySqlDataAdapter1.SelectCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
mySqlDataAdapter1.SelectCommand.Parameters["@CustomerID"].
Value = CustomerID;
// 建立一個資料集對象
DataSet myDataSet = new DataSet();
// 運用資料集對象的Fill方法來填充資料集對象
mySqlDataAdapter1.Fill(myDataSet,"Customers");
// 關閉資料庫連接
myConnection.Close();
// 返回資料集對象中的資料的XML形式
return myDataSet.GetXml();
}



以上ExecuteADONetSelect()方法首先根據傳入的資料庫連接字串建立一個SqlConnection對象,然後建立一個SqlDataAdapter對象,並傳遞一條SELECT語句和上面的SqlConnection對象到其建構函式中。其中的SELECT語句中包含了一個使用者ID參數,所以你必須將該參數添加到SqlDataAdapter對象的SelectCommand參數集中並為該參數賦值。接下來的兩步建立了一個新的DataSet對象並用上面的SqlDataAdapter對象填充了該DataSet對象,這兩步雖然簡單,但它們卻完成了大部分的工作。最後,關閉資料庫連接並以XML的形式返回資料集對象中的資料。

接下來為該類添加ExecuteSqlDataReaderSelect()方法,該方法如下:

public string ExecuteSqlDataReaderSelect(string CustomerID,
string ConnectionString)
{
SqlDataReader myDataReader = null;
// 建立一個資料庫連接對象
SqlConnection mySqlConnection = new SqlConnection
(ConnectionString);
// 建立一個資料庫命令對象,並在SQL語句中運用FOR XML子句
SqlCommand mySqlCommand = new SqlCommand("SELECT * FROM Customers
WHERE CustomerID = @CustomerID FOR XML RAW", mySqlConnection);
mySqlCommand.CommandType = CommandType.Text;
// 為其參數集添加參數
mySqlCommand.Parameters.Add("@CustomerID", SqlDbType.Char, 5,
"CustomerID");
mySqlCommand.Parameters["@CustomerID"].Value = CustomerID;
mySqlConnection.Open();
// 執行資料庫命令對象的ExecuteReader操作以取得一個資料閱讀器對象
myDataReader = mySqlCommand.ExecuteReader(CommandBehavior.
CloseConnection);
// 建立一個StringBuilder對象以構造XML字串
StringBuilder xml = new StringBuilder(8192);
// 不斷從資料閱讀器中擷取XML資料並添加到StringBuilder對象中
while (myDataReader.Read())
{
if (!myDataReader.IsDBNull(0))
xml.Append(myDataReader.GetString(0));
}
myDataReader.Close();
mySqlConnection.Close();
// 返回XML資料的字串形式
return xml.ToString();
}



SqlDataReader類為我們提供了一種唯讀、向前的資料訪問方式,該特性使得它成為訪問SQL Server資料庫速度最快的一種方法。然而SqlDataReader類並不直接支援XML類型的資料,你必須手動編寫代碼將資料轉換成XML資料或者通過運行FOR XML查詢子句來返回XML類型的資料。這裡,我們將使用FOR XML RAW子句來擷取XML資料。

上面的ExecuteSqlDataReaderSelect()方法首先聲明一個SqlDataReader對象,然後通過函數的資料庫連接字串參數建立一個SqlConnection對象,並根據帶有FOR XML RAW子句的SELECT語句和上面的SqlConnection對象建立一個SqlCommand對象。之後,該方法為SqlCommand的參數集添加參數並為使用者ID參數賦值。開啟SqlConnection串連後,該方法將SqlCommand對象的ExecuteReader()方法的傳回值賦給SqlDataReader對象,並通過一個StringBuilder對象讀取SqlDataReader對象中的XML資料。最後,該方法關閉SqlDataReader對象和SqlConnection對象並以字串的形式返回XML資料。

最後,為該類添加ExecuteSqlXmlSelect()方法,該方法如下:

public string ExecuteSqlXmlSelect(string CustomerID, string
ConnectionString, bool ClientSide)
{
// 建立一個SqlXmlCommand對象
SqlXmlCommand cmd = new SqlXmlCommand(ConnectionString);
cmd.RootTag = "Customers";
cmd.ClientSideXml = ClientSide;
cmd.CommandText = "SELECT * FROM Customers WHERE CustomerID =
'" + CustomerID + "' FOR XML RAW";
// 執行SqlXmlCommand對象的ExecuteXmlReader操作以取得一個XmlReader對象
XmlReader xr = cmd.ExecuteXmlReader();
// 建立一個XmlDocument對象
XmlDocument xd = new XmlDocument();
// 運用其Load方法將擷取的XML資料載入到一個DOM中並返回XML資料的字串形式
xd.Load(xr);
return xd.OuterXml
}



  SQLXML託管類是SQLXML 3.0包的一部分,SQLXML 3.0包擴充了SQL Server 2000的XML功能。SQLXML託管類是原生的.NET類,它提供了通過編程方法訪問XML資料的功能。上面的ExecuteSqlXmlSelect()方法首先運用資料庫連接字串建立一個SqlXmlCommand對象。同時,由FOR XML子句擷取的XML資料往往只是一個XML片段,並不是結構良好(Well-Formed)的XML資料,要使得XML成為結構良好的,你必須設定SqlXmlCommand對象的RootTag屬性。在本執行個體中,我們將該屬性設定為"Customers"。

  以前版本的SQLXML包是在伺服器端產生XML資料,然後傳遞給用戶端的。這樣,因為伺服器端返回的XML資料流遠遠大於原來的二進位格式資料流,所以就產生了一個可擴充性問題。而3.0版本的SQLXML包允許伺服器將資料以二進位的格式傳遞給用戶端,然後在用戶端將資料進一步轉變為XML格式,這樣就解決了原來版本中存在的可擴充性問題了。在3.0版本的SQLXML包中實現這個特性的方法很簡單,只要將SqlXmlCommand對象的ClientSideXml屬性設定為True即可。這樣,程式會繼續使用帶有FOR XML子句的SELECT語句,但是託管類會在發送SQL語句到SQL Server之前將FOR XML子句先剝離掉。資料庫就不會發現FOR XML子句,因此從伺服器返回給用戶端的資料也就是二進位格式的了。用戶端擷取從伺服器返回的資料後,託管類會進而將資料轉化為XML格式。

  上面的程式中,我們通過執行SqlXmlCommand對象的ExecuteXmlReader()方法來擷取一個XmlReader對象,並用它來填充一個XmlDocument對象,最後返回XmlDocument對象的OuterXml屬性給調用者。

  上面,我給大家介紹了ADO.Net機制、SqlDataReader機制和SQLXML機制這三種不同的方法,下面是運用這三種不同方法所得到的一個結果示意圖,從圖中的結果讀者可以看出那種方法的效率最高。




圖2


  最後要介紹的是ADO 2.6機制,該機制是在VB 6.0中實現的。我們先建立一個名為DBXMLVS6的ActiveX DLL項目,然後把Class1修改為ADO26,接著添加一個到ActiveX Data Objects 2.6的引用。一旦完畢,為該類添加一個ExecuteSelect()方法如下:

Public Function ExecuteSelect(
CustomerID As String,
ConnectionString As String)
As String
Set conn = New ADODB.Connection
conn.ConnectionString = ConnectionString
conn.Open

Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.CommandText = "select * from customers
where CustomerID = '" & CustomerID & "'"
Set rs = cmd.Execute

Set adoStream = New ADODB.Stream
adoStream.Type = adTypeText
adoStream.Open
rs.Save adoStream, adPersistXML

'返回XML字串
ExecuteSelect = adoStream.ReadText()
End Function



  和其他執行個體一樣,上面的程式建立並開啟一個資料庫連接。然後建立一個Command對象,並將它的ActiveConnection屬性設定為上面的Connection對象,而程式中用到的SELECT語句和前面執行個體中的是一樣的。接著,程式將Command對象的Execute()方法的傳回值傳遞給一個RecordSet對象。然後,程式建立一個ADO Stream對象,並將其Type屬性設定為adTypeText同時開啟它。一旦該流對象被開啟,調用RecordSet對象的Save()方法就能將資料以XML的格式儲存。最後,程式通過Stream對象的ReadText()方法返回XML資料給調用者。

  結合以上介紹的四種不同的XML資料訪問機制,我用ASP和ASP.Net頁面以調用組件的方式對其XML資料訪問的效能和可擴充性進行了測試,結果得出如下圖所示的效能分析結果,以供讀者參考。




圖3


三.總結:

  本文我向大家介紹了.Net架構下XML資料訪問的四種不同機制,隨著微軟不斷的添加新功能並提高效能,XML資料訪問會繼續不停的向前發展。同時,鑒於新版本的SQL Server資料庫伺服器會添加不少對XML的原生支援,我們可以期盼不久的將來XML資料訪問將得到極大的發展。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.