DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> SQL Server 2005 中的 XML 選項詳解
SQL Server 2005 中的 XML 選項詳解
編輯:XML詳解     
RONG>【導讀】本文介紹 Visual Studio 2005/SQL Server 2005 環境中用於處理 XML 數據的三個選項,包括使用方案以及指導用戶在各選項之間進行選擇的指南。

一、System.Xml、SQLXML 和 XML 數據類型簡介

本節簡要介紹 Microsoft SQL Server 2000 中提供的 XML 支持的發展歷史,並概要介紹 Microsoft Visual Studio 2005/SQL Server 2005 環境中提供的用於處理 XML 和關系數據的三個選項。這三個選項是:1) System.Xml 命名空間中的類,2) SQLXML 類,3) SQL Server 2005 中提供的 XML 數據類型。

XML 支持最早添加到 Microsoft SQL Server 2000 中,為用戶提供以下功能:

• 將關系數據作為 XML 公開

• 將 XML 文檔拆分到行集合

• 通過使用 XML 數據精簡 (XDR) 方案,將 XML 方案映射到數據庫方案,從而創建 XML 視圖

• 使用 XPath 在 XML 視圖上創建查詢

• 在 SQL Server 中通過 HTTP 公開數據

此支持在 SQLXML Web 的後續版本中得到了進一步增強。增強功能包括:

• 更新程序和 XML 海量加載可以保留對 XML 視圖的更改

• 支持帶批注的 XML 方案定義語言 (XSD),以便描述映射(仍然支持 XDR,但不建議使用)

• 客戶端的 FOR XML

• SQLXML 托管類

• 支持 Web 服務

Microsoft .NET Framework 1.0 對讀取、寫入和處理 XML 文檔提供了廣泛的支持。這種支持在 .NET Framework 2.0 中得到了進一步增強,提高了各種 XML 類的性能和可用性。.Net Framework 在 System.Xml 命名空間中提供的新類可用於在 XML 數據與關系數據之間進行相互映射。

SQLXML 是一組使 SQL Server 數據庫中的關系數據能夠與 XML 無縫集成的庫和技術。它是一個中間層組件,不包括由 FOR XML 和 OPENXML 提供的服務器端 XML 支持。SQLXML 提供了一個方案驅動的映射方法,能夠從關系源數據生成 XML 並將表示關系信息的 XML 加載回關系表中。SQLXML 類對 SQL Server 2000(及更高版本)的數據庫提供了 XML 支持。

Microsoft SQL Server 2005 以 XML 數據類型的形式添加了內置的 XML 支持。XML 數據可以存儲在 XML 數據類型列內部。另外,通過將一個 XML 方案集合與此 XML 數據類型列關聯,還可以對其進行進一步的限制。存儲在 XML 數據類型列中的 XML 值可以借助 XQuery 和 XML 數據修改語言 (DML) 進行處理。可以在 XML 數據上建立索引,以增強查詢性能。此外,FOR XML 和 OPENXML 也已得到增強,能夠支持新的 XML 數據類型。

SQL Server 2005 中引入的存儲和處理 XML 數據的新功能與 SQL Server 早期版本中提供的 XML 功能結合在一起,為開發人員提供了多種在 XML 應用程序中存儲和處理 XML 數據的方法。由於使用 SQL Server 2005 提供的方法,有多種方法可以生成 XML 應用程序,因此,了解各種不同技術的方案,以及如何在各種技術之間進行權衡和配合對於作出正確的選擇是至關重要的。本文提供了如何選擇適當的方法,使用 SQL Server 2005 開發 XML 應用程序的指南。

二、XML 使用方案

XML 的應用領域可大致劃分為:

• 用於商業集成的 XML:商業集成,也稱為企業應用集成 (EAI),包括 A2A(應用程序對應用程序)、B2B(企業對企業)以及 B2C(企業對用戶)應用程序。運行在不同系統上的應用程序使用基於 XML 的消息相互通訊。

• 用於內容管理的 XML:使用基於 XML 的內容管理系統,用戶可以存儲、檢索、修改和查詢 XML 文檔。這些系統以其原有格式存儲 XML 文檔。

下面介紹符合上述分類的幾種方案。這些方案的解決方案將在以下幾節中給出,並且會詳細介紹 SQL Server 2005/Visual Studio 2005 環境中提供的各種 XML 選項的處理情況。

方案 1:保險理賠

一家汽車保險公司在 Internet 上提供服務,允許其投保人或代理通過公司的網站進入保險理賠。理賠將由位於公司總部的中央系統進行處理。處理完畢後,系統會將與該理賠相關的信息以指定的 XML 格式存儲起來。系統中必須保留這些 XML 文檔的精確副本,以便用於法律用途。此方案展示了 XML 在內容管理中的應用。

方案 2:汽車制造商與零件供應商之間的數據交換 I

一家汽車制造商與多家零件供應商進行交互,以便獲得公司所需的零件。通常,該制造商要接收供應商的發票。然後,將與發票相關的數據手動輸入到老式的發票處理系統中。發票處理系統以關系格式存儲數據。而現在,該制造商希望將發票數據自動輸入到老式的發票處理系統中。此方案是 XML 用於商業集成的示例。

方案 3:汽車制造商與零件供應商之間的數據交換 II

此方案包含一家與多家零件供應商進行交互的汽車制造商,如前一方案中所述。該制造商目前使用的系統不能為供應商提供查詢發票狀態或者從制造商獲得付款說明的副本的功能。目前,供應商只能通過電話獲得這些信息。該汽車制造商需要通過 Web 公開這些信息,以使供應商能夠自動執行這些任務。此方案展示了 XML 在商業集成中的應用。

方案 4:內容管理系統

某公司通過 Web、書籍和 CD-ROM 等多種渠道向其客戶提供醫學、法律和技術等領域的信息。該公司要建立一套內容管理系統,以幫助其在較短的時間內向客戶提供高質量的內容。此方案展示了 XML 在內容管理中的應用。

方案 5:客戶調查

某公司在 Internet 上提供機票預訂業務,要對每個季節進行調查,以確定當前季節最受客戶喜愛的旅游地點。每個季節所用的調查表均不同,而且將來調查表也可能改變。該公司將對調查信息進行分析,並根據分析結果設計出滿足大多數客戶要求的旅游套餐。此方案可看作 XML 在內容管理中的應用。

三、.Net Framework 中的 XML 類

Microsoft .NET Framework 對開發基於 XML 的產品提供了卓越的支持。在 .Net Framework 中,XmlTextReader、XmlTextWriter、XmlDocument 和 XmlValidatingReader 等核心類可以在 System.Xml 命名空間中獲得,該命名空間是所有 XML 類的根命名空間。使用這些核心類,用戶可以使用基於數據流和基於 DOM(基於文檔對象模型)的兩種浏覽/訪問模型來讀取、寫入和驗證 XML 文檔。System.XML 命名空間包含以下子命名空間:

• System.Xml.Schema - 包含用於處理 XML 方案定義語言 (XSD) 方案的類。

• System.Xml.Serialization - 提供將對象序列化為 XML 格式的文檔或數據流的類。

• System.Xml.XPath - 包括使用 XPath 表達式浏覽 XML 文檔的類。

• System.XML.Xsl - 具有用於執行可擴展樣式表轉換 (XSLT) 的類。

System.XML 命名空間的增強功能

在 Visual Studio 2005 中,新類(如 XsltCommand)和對現有 XML 類(如 XmlDocument)的增強可用於對 XML 數據進行各種操作,包括修改 XML 文檔、應用 XSL 轉換等。

Visual Studio 2005 中與 System.Xml 命名空間中的 XML 類相關的一些增強功能如下:

• XmlDocument 類添加了 XML 方案驗證支持。

• XmlReader 和 XmlWriter 類的功能得到了增強,性能顯著提高,並支持 XML 方案類型。而且,還添加了靜態 Create 方法,提供了一種較為簡單的方法,可使用 XmlReaderSettings 和 XmlWriterSettings 類創建 XmlReader 和 XMLWriter 實例,以便配置所創建的類型。

有關 System.Xml 增強功能的詳細信息,請參見 What's New in System.XML for Visual Studio 2005 and the .Net Framework 2.0 Release 白皮書。

System.Xml 命名空間中的類可用於實現自定義的 XML 分析、處理和存儲邏輯。利用 SQL Server 2005 的公共語言運行庫 (CLR) 的宿主功能以及 Visual Studio 2005 中的 XML 類,可以在中間層或數據庫層處理 XML。

.NET Framework 中的 XML 類的使用包括將 XML 文檔作為類型 [n]varchar(max) 或 [n]varbinary(max) 的列保存在數據庫中,或者作為文件保存在文件系統中,以及使用 System.XML 命名空間中的類在中間層或數據庫層處理這些文檔。.Net Framework 中的 XML 類還可用於操作以 XML 數據類型存儲的數據。

.Net Framework 中的 XML 類適用於以下情況:

• 訪問 .Net Framework XML 的所有功能,如數據流分析、文檔類型定義 (DTD)、XSD 驗證、XSLT 處理等。

• 僅僅將 SQL Server 用作 XML 文檔的數據存儲區,不需要在數據庫內部進行深入訪問。

• 使用 .Net Framework 中的 XML 類進行 XML 文檔的大多數或全部處理並在文檔級進行更新。

可以使用 [n]varchar(max)、[n]varbinary(max) 或 XML 數據類型來存儲 XML。

如果使用 [n]varchar(max) 或 [n]varbinary(max),可以獲得以下好處:

• 可以保留 XML 文檔的高保真的副本,包括空格和格式。

• 應用程序在對整個文檔進行插入和檢索操作方面可以獲得可能實現的最高性能。

後面將介紹使用 XML 數據類型的好處。

在中間層進行 XML 處理

可以使用 .Net Framework 提供的各種 XML 類在中間層進行 XML 處理。如上所述,采用這種方法時,XML 文檔可以作為類型 [n]varchar(max) 的列或 XML 存儲在數據庫中,也可以作為文件存儲在文件系統中。在中間層,這些文檔是從數據庫中檢索並根據用戶的需要進行處理的,如下所述:

• 如果需要讀取 XML 文檔,可以使用通過 XmlReader.Create() 方法創建的 XMLReader 來加載從數據庫中獲得的文檔。使用 Read() 浏覽文檔。XmlReader 類提供對 XML 文檔的最快的只讀、只向前和非緩沖的訪問。

• 如果需要對 XML 文檔進行寫入訪問並需要對 XML 數據進行完全浏覽訪問,則可以使用 XmlDocument 類加載和訪問 XML 文檔。XMLDocument 是文檔對象模型 (DOM) 在 .Net Framework 中的一種實現,它是 XML 文檔在內存中的樹型表示,使用它可以浏覽和編輯此文檔。

• 如果需要根據 DTD/XSD 來驗證 XML 文檔,或者在運行時獲得 XSD 信息,則可以使用 XmlReader 類。在 XMLReaderSettings 類上,創建方法時將 XsdValidation 或 DTDValidation 設置為 True。還可以設置 ValidationEventHandle() 事件處理程序來處理讀取過程中出現的驗證錯誤。

• 如果需要對 XML 文檔應用 XSL 轉換,可以使用 XPathDocument 類加載 XML 文檔,然後使用 XslCommand 類應用轉換。XPathDocument 類使用 XSLT 為 XML 文檔處理提供了快速的高性能緩存。

• 如果需要使用 XPath 表達式來查詢 XML 文檔,則可以使用 XPathDocument(只讀)或 XmlDocument(讀/寫)來加載 XML 文檔。使用 CreateNavigator() 方法創建一個 XPathNavigator 實例,並將所需的 XPath 表達式作為參數傳遞給 XPathNavigator 的 Select() 方法。

在數據庫中進行 XML 處理

SQL Server 2005 與 CLR 的集成使開發人員也能夠使用 .NET Framework 提供的 XML 類在數據庫層進行處理。這種集成提供了以 .NET Framework 支持的任何語言編寫存儲過程、函數、觸發器以及用戶定義的類型的功能。此外,CLR 宿主還提供了訪問整個 .Net Framework 基類庫的功能。因此,上一節中介紹的各種 XML 處理選項也可以在數據庫中使用。

使用 CLR 集成的優點如下:

• 它提供了使用面向對象語言(如 C# 和 Visual Basic .Net)以托管代碼的形式編寫數據庫對象的能力。

• 托管的數據庫對象比 SQL Server 早期版本中提供的擴展存儲過程更安全。

• 它具有定義用戶定義的數據類型和用戶定義的合計的能力。

• 在某些情況下,編譯的托管數據庫對象比 Transact-SQL 具有更高的性能。

在 SQL Server 2005 中,數據庫開發人員可以選擇兩種方法來編寫存儲過程、觸發器和用戶定義的函數。這兩種方法是 Transact-SQL 和可在 .NET Framework 中使用的任何語言,如 C# 或 Visual Basic .Net。語言的選擇取決於對數據執行的操作類型。如果代碼在進行大多數數據訪問時只需要使用很少甚至不使用過程邏輯,選擇 Transact-SQL 最合適。托管類最適用於數學性較強的函數和過程,如字符串處理、日期操作、系統資源訪問、文件訪問、圖像處理等。

在數據庫層使用 .Net Framework 中的 XML 類的步驟如下:

• 開發托管程序集。使用可在 .Net Framework 中使用的任何語言,以程序集的形式實現處理功能,並將程序集打包為 DLL。程序集也可以引用其他程序集。

• 注冊程序集並授予權限。使用 .Net Framework 開發的程序集可以使用 CREATE ASSEMBLY T-SQL 語句注冊到 SQL Server 中。注冊程序集時,還可以指定要授予該程序集的代碼訪問權限。使用 DROP ASSEMBLY T-SQL 語句可以取消程序集的注冊。

• 向 T-SQL 公開托管類型。程序集提供的處理功能可以通過用戶定義的標量函數、用戶定義的表函數、用戶定義的過程 (UDP) 或者用戶定義的觸發器向 T-SQL 公開。用戶定義的標量函數可在任何標量表達式中使用;用戶定義的表函數可在任何 FROM 子句中使用;UDP 可在 EXEC 語句中調用。

分析方案

保險理賠包含以數據為主的信息(如理賠 ID、政策編號、理賠結算數據等)和以文檔為主的信息(如事故損傷說明等)。XML 文檔在匯集以數據為主和以文檔為主的信息時功能非常強大。當前方案的主要要求是需要以 XML 格式保留一份保險理賠的精確副本。使用 SQL Server,通過將保險理賠作為類型 [n]varchar(max) 或 [n]varbinary(max) 的列存儲在數據庫中的方法,很容易滿足這項要求。值得注意的是,如果需要保留無關緊要的空格、屬性順序、命名空間前綴以及 XML 聲明等信息,則不應使用 XML 數據類型存儲文檔。

優點

使用 [n]varchar(max) 或 [n]varbinary(max) 作為存儲媒介,使用 System.Xml 命名空間中的類處理 XML 文檔的優點如下:

• 可以靈活地對 XML 文檔的方案進行更改。在同一列中使用不同的方案存儲 XML 文檔時非常有用。

• 當使用 [n]varchar(max) 或 [n]varbinary(max) 存儲 XML 時,能提供高保真的 XML 文檔。此功能對於處理法律文檔(如保險理賠)的應用程序可能是必不可少的。

• 與將 XML 實例作為文件存儲在文件系統中相比,還可以利用數據庫的功能,如事務更新、並發訪問、備份、復制等。

• 由於這種方法不依賴於數據庫提供的 XML 支持,因此很容易對應用程序進行擴展,以支持多種數據庫服務器,如 SQL Server、Oracle 等。

• 可以使用客戶端系統的處理能力,從而減輕了服務器的負載。通過在中間層進行 CPU 密集的 XML 處理,減輕了服務器的負載,使其能夠用於其他重要的任務。

• 在文檔級進行插入和檢索操作方面提供了可能實現的最佳性能。

• 復雜的操作(如 XSL 轉換)可以作為存儲過程、觸發器或函數在數據庫中完成。

限制

使用 [n]varchar(max) 或 [n]varbinary(max) 進行存儲,使用 System.Xml 命名空間中的類處理 XML 實例的限制總結如下:

• 與 XML 數據類型(請參見 SQL Server 2005 中的 XML 數據類型一節)或 SQLXML 選項(請參見 SQLXML 一節)相比,編碼的復雜性較高。即使數據庫邏輯非常簡單,在中間層或數據庫層用代碼來實現 XML 的分析和處理也很復雜。

• 實現此解決方案的代碼量很大。因此,與 SQLXML 選項相比,維護成本也較高。

• 由於 XML 文檔作為 [n]varchar(max) 存儲在數據庫中,因此不能對 XML 文檔進行深入地更新、插入或刪除操作。查詢能力也有限。

• 以 [n]varchar (max) 數據類型存儲的 XML 文檔最大不能超過 2GB。

• 根據 XML 內容搜索以這種方法存儲的文檔列的代價非常高。

使用 .Net Framework 中的 XML 類的示例

考慮本文前面介紹的保險理賠方案。一旦理賠獲得批准,保險公司將存儲理賠信息,以便用於法律用途。理賠信息可以作為 [n]varchar(max) 數據類型存儲在數據庫中。

應用程序的流程如下:

1. 處理理賠後,應用程序批准或拒絕理賠。

2. 使用 System.Xml 命名空間中的類,為理賠生成 XML 文檔。

3. 將生成的 XML 文檔發送到存儲過程。

4. 存儲過程將 XML 文檔插入到表中。

以下代碼示例使用系統獲得的理賠詳細信息生成一個 XML 文檔並將該 XML 文檔插入到數據庫中。

using System;

using System.XML;

using System.IO;

using System.Text;

using System.Data;

using System.Data.SqlClIEnt;

namespace InsuranceClaim

{

class Insurance

{

static void Main(string[] args)

{

Insurance.InsertInsuranceClaim();

}

static void InsertInsuranceClaim()

{

StringWriter strWriter = null;

XMLWriter writer = null;

XMLWriterSettings settings = null;

SqlConnection connection = null;

SqlCommand command = null;

try

{

strWriter = new StringWriter();

settings = new XMLWriterSettings();

//使用縮進功能以增強可讀性。

settings.Indent = true;

settings.Encoding = System.Text.Encoding.UTF8;

writer = XMLWriter.Create(strWriter, settings);

//編寫 XML 聲明。

writer.WriteStartDocument();

writer.WriteStartElement("InsuranceClaim");

writer.WriteStartElement("ClaimInfo");

writer.WriteElementString("ClaimID", "C1234");

writer.WriteElementString("ClaimType", "3");

writer.WriteStartElement("SettlementDetails");

writer.WriteStartElement("PaymentDetails");

writer.WriteElementString("PaidTo","Jeff");

writer.WriteElementString("Amount", "2000");

writer.WriteElementString("Date", "05/12/2002");

writer.WriteElementString("ApprovedBy", "Mike");

writer.WriteEndElement();//PaymentDetails 結束

writer.WriteEndElement();//SettlementDetails 結束

writer.WriteEndElement();//ClaimInfo 結束

writer.WriteStartElement("DamageReport");

writer.WriteString("Minor accident occured on ");

writer.WriteElementString("Address", "ABC Street,

Sample City,

Sample State");

writer.WriteString(" due to ");

writer.WriteElementString("Cause", "bad weather");

writer.WriteString(" resulted in damage to ");

writer.WriteElementString("DamagedItem", "Head Lights");

writer.WriteElementString("DamagedItem", "Engine");

writer.WriteEndElement();//DamageReport 結束

writer.WriteEndElement();//InsuranceClaim 結束

writer.WriteEndDocument();

//將 XML 寫入文件並關閉寫入程序。

writer.Flush();

connection = new SqlConnection();

connection.ConnectionString = @"server=localhost;

database=AdventureWorks;Integrated Security=SSPI;";

command = connection.CreateCommand();

command.CommandText = "InsertInsuranceClaim";

command.CommandType = System.Data.CommandType.StoredProcedure;

command.Parameters.Add("@CustomerID",

System.Data.SqlDbType.Char);

command.Parameters.Add("@Claim",

System.Data.SqlDbType.VarChar);

String XML = strWriter.ToString();

string strCustomerID = "1001";

command.Parameters[0].Value = strCustomerID;

command.Parameters[0].Size = strCustomerID.Length;

command.Parameters[1].Value = XML;

command.Parameters[1].Size = XML.Length;

connection.Open();

command.ExecuteNonQuery();

connection.Close();

}

finally

{

if (connection.State == ConnectionState.Open)

connection.Close();

if (writer != null)

writer.Close();

if (strWriter != null)

strWriter.Close();

}

}

}

}

下面是用於創建數據庫表的腳本:

CREATE TABLE [InsuranceClaim](

[CustomerID] [char](4) NOT NULL,

[Claim] [varchar](max) NOT NULL,

[ModifIEdDate] [datetime] NOT NULL DEFAULT (getdate())

)

以下存儲過程用於將 XML 文檔插入到數據庫中。

CREATE PROCEDURE [dbo].[InsertInsuranceClaim]

@CustomerID [char](4),

@Claim [varchar](max)

AS

BEGIN

SET NOCOUNT ON;

INSERT INTO [InsuranceClaim] ( CustomerID, Claim )

VALUES ( @CustomerID, @Claim )

END;

四、SQLXML

SQLXML 是與 SQL Server 2000 一起引入的,它包含在客戶端處理

XML 所需的全部功能。它是一組使 SQL Server 數據庫中的關系數

據能夠與 XML 描述的關系結構數據無縫集成的庫和技術。

在 SQL 2000 問世之前,開發人員必須為關系數據與 XML 格式的數據之

間的交互提供代碼層。SQLXML 的出現使這種操作變得很簡單,因為它在關

系數據與 XML 之間提供了鏈接。本文只討論 SQLXML 托管類。有關該庫其

他功能的適用性的詳細信息,請參見 MSDN 網站上的 SQLXML 頁。

SQLXML 包含很多在 SQL Server 中引入的支持 XML 的功能。包括:

• 在客戶端將查詢結果轉換為 XML • 使用帶批注的 XSD 映射方案文件創建關系數據的 XML 視圖,使您能夠: • 針對該 XML 視圖定義 XPath 查詢 • 使用被稱為“更新程序”的 XML 模板,對數據庫中的數據進行插入、更新或刪除 • 進行 XML 海量加載操作 • 使用 HTTP 訪問 SQL Server,使您能夠: • 在 URL 中指定 SQL 語句 • 在 URL 中指定模板查詢 • 在 URL 中指定模板文件 • 在 URL 中指定針對帶批注的 XSD 映射方案文件編寫的 XPath 查詢 • 以基於 SOAP 的 Web 服務形式公開存儲過程、用戶定義的函數以及模板查詢所提供的功能。 • 在 .Net Framework 中編寫代碼,以便利用 SQLXML 通過 SQLXML 托管類所提供的 XML 功能

客戶端 XML 格式化。在客戶端指定 FOR XML 子句,可以使中間層在由服

務器返回的行集合上進行 FOR XML 轉換,以響應查詢。要在客戶端進行

XML 格式化:

• 如果使用 SQLXML 托管類,則將 SqlXmlCommand 對象的 ClientSideXml 屬性設置為 True。 • 如果使用 SQLXMLOLEDB 提供程序,則將 ClientSideXML 提供程序特有的屬性設置為 True。 • 如果使用模板查詢,則在模板中指定 client-side-xml="1"。 • 如果使用 HTTP 訪問 SQL Server,則在 Settings(設置)選項卡中的虛擬目錄下選擇 Run on the ClIEnt(在客戶端運行)選項。 • 在客戶端上,FOR XML 提供的有效 XML 格式化模式為 RAW、NESTED 和 EXPLICIT。使用 RAW 模式時,所得到的 XML 文檔在查詢結果的每一行中都包含一個 XML 元素,而與行對應的每一列中都包含一個屬性。當指定 NESTED 模式時,基表名將作為所得到的 XML 文檔的元素名返回。EXPLICIT 模式允許在查詢中指定所需的 XML 格式,因此能夠生成任何格式的 XML 文檔。 • XML 視圖。XML 視圖是使用帶批注的 XSD 方案創建的,該方案定義了關系數據與 XML 數據之間的映射。可以使用 XPath 查詢對這些 XML 視圖進行查詢。通過 XML 視圖公開的關系數據也可以被修改,然後使用更新程序將所進行的修改提交到數據庫。此外,XML 視圖還可借助基於 COM 的 XML Bulk Load(XML 海量加載)對象將大量 XML 文檔插入到數據庫中。 • 使用 HTTP 訪問 SQL Server。SQLXML 提供了一個名為“IIS 虛擬目錄管理”的工具,該工具可用於設置一個 IIS 虛擬目錄,通過 HTTP 公開 SQL Server 的 XML 功能。借助 SQL ISAPI 擴展的功能,它支持在 URL 中直接指定 SQL 語句、存儲過程、模板查詢、模板文件以及 XPath 查詢。 • SQLXML 中的 Web 服務支持。SQLXML 3.0 中增加了一項功能,即支持以基於 SOAP 的 Web 服務形式公開 SQL Server 的功能。此功能使 SQL Server 能夠從客戶端接收 SOAP HTTP 請求,以便執行存儲過程、用戶定義的函數和模板。 • SQLXML 托管類。使用 SQLXML 托管類,可以在 .NET Framework 中訪問 SQLXML 功能。SQLXML 中有三種托管類: • SqlXMLCommand - 處理數據庫連接和查詢執行 • SqlXmlParameter - 幫助指定查詢中的參數 • SqlXMLAdapter - 便於與 .Net Framework 中的數據集進行交互

使用 SQLXML 托管類,您可以:

• 使用 FOR XML 子句執行 SQL 查詢 • 針對映射方案執行 XPath 查詢 • 執行模板查詢 • 執行模板查詢文件 • 執行更新程序 • 執行區分程序

使用 SQLXML 將關系數據作為 XML 文檔公開非常適用於以下情況:

• 應用程序接收結構良好且能較好地映射到關系表中的 XML 數據。 • 應用程序必須將來自外部應用程序的大量 XML 文檔加載到數據庫中,並保持其關系格式。 • 應用程序不需要保留文檔的順序。 • 應用程序需要以不同的格式向多個數據使用者提供相同的數據。 • DML 操作的性能對於應用程序至關重要。 • 應用程序需要充分利用優化程序進行查詢優化。 • 應用程序需要進行深入的數據操作。 • 應用程序需要以 XML 的形式公開現有的關系數據。

分析方案

在 XML 使用方案中介紹的第一個數據交換方案(請參見方案 2:汽車制造商

與零件供應商之間的數據交換 I 一節),一個汽車制造商與多個零件供應商

之間的交互是使用 SQLXML 的典型案例。制造商必須與不同的供應商進行通

訊以便交換發票數據。建議的解決方案使用 Web 服務和 SQLXML 來解決此

問題。制造商公開一個 Web 服務,供應商可使用該服務將發票發送給制造商。

Web 服務使用了一個針對客戶的 XSLT,將發票由供應商的格式轉換為制造商

使用的通用格式。然後,Web 服務使用 XML 視圖來分解 XML 文檔,將發票

文檔的內容映射到關系表中的列。老式的發票處理系統將能夠從關系表中選取

數據並進行處理。在此方案中使用 XML 視圖的優點如下:

• 降低了維護成本。通過修改針對供應商的 XSLT 文件,很容易適應供應商對發票方案所進行的任何更改。 • 與 FOR XML 相比,編碼的復雜程度降低了(請參見關系/XML 集成的服務器端支持 (FOR XML/OPENXML) 一節)。 • 通過創建針對供應商的 XSLT 文件,很容易支持新的供應商。

優點

使用 SQLXML 的優點總結如下:

• 與服務器端的 FOR XML EXPLICIT 相比,創建帶批注的映射方案將關系數據映射到 XML 數據是一種相對簡單、易於維護的解決方案。 • SQLXML 能夠創建可更新的雙向 XML 視圖,而使用 FOR XML 只能創建關系數據的只讀 XML 表示形式。 • 映射 XSD 便於適應 XML 格式的更改請求,而不必進行主代碼的更改。這會使維護簡單易行。 • SQLXML 允許用戶通過將 SqlXMLCommand 類的 ClIEntSideXML 屬性設置為 True,在客戶端進行 XML 格式化,從而減輕服務器的負載。

限制

從不利的方面來看,從客戶端使用 SQLXML 有一些限制:

• XML 視圖不適用於 XML 文檔的層次結構過多或者遞歸深度未知的情況。 • SQLXML 不適用於包含混合內容標記和有序數據的說明性文檔,例如產品目錄、新聞報告等。 • 由於不能保留文檔順序,很難重新構造出原始的 XML 文檔。 • 雖然將 XML 文檔分解到關系表中提供了卓越的搜索性能,但是在關系數據與 XML 之間進行相互轉換的代價非常昂貴。 • 當在 XSD 映射方案中使用默認映射時,可能會公開數據庫表名和列信息,這可能無意中造成信息洩漏。這種風險可以通過為表和列指定明確的映射加以避免。 • URL 中的 SQL 語句只能用於可信的局域網中。在 Internet 上使用這種查詢可能導致潛在的安全問題。

使用 SQLXML 的示例 以上概要介紹了 SQLXML 的功能,下面將詳細分析一個可以應用 SQLXML 托管類的示例。考慮一個簡單的示例 - 為特定客戶導出銷售訂單的詳細信息。該示例所用的表可以在 AdventureWorks 數據庫中獲得。數據庫中的數據必須能夠在客戶端以 XML 格式獲得,並能被表示層顯示。下面您將看到,如何使用 SQLXML 類將 SQL 數據庫中的關系數據作為 XML 數據進行處理。該示例使用映射 XML 方案進行處理,並將 XML 節點名映射到表字段。有關使用 SQLXML 托管庫處理關系數據的詳細信息,請參見 MSDN 網站上的SQLXML頁。以下帶批注的 XSD 方案定義了關系表 [Sales.Customer]、[Sales.SalesOrderHeader] 和 [Sales.SalesOrderDetail] 與客戶銷售訂單詳細信息的目標 XML 表示之間的映射。還可以使用 XSD 映射方案來定義 XML 中的父子關系,如以下 XSD 方案所示。XMLns:sql="urn:schemas-microsoft-com:mapping-schema">

parent="Sales.Customer"

parent-key="CustomerID"

child="Sales.SalesOrderHeader"

child-key="CustomerID" />

parent="Sales.SalesOrderHeader"

parent-key="SalesOrderID"

child="Sales.SalesOrderDetail"

child-key="SalesOrderID" />

sql:relationship="CustomerOrderHeader" maxOccurs="unbounded" >

sql:relation="Sales.SalesOrderDetail"

sql:relationship="OrderHeaderOrderDetail"

maxOccurs="unbounded" >

type="xsd:integer" />

class ExportOrders

{

/// <摘要>

/// 此方法使用 SqlXMLCommand 類從

/// Sales.Customer、Sales.SalesOrderHeader 和 Sales.SalesOrderDetail

/// 表中選擇記錄。數據是從服務器獲取並在客戶端

/// 格式化為 xml 的。請注意,ClIEntSideXML 設置為 True。

/// <摘要>

static void Main(string[] args)

{

if (args.Length < 1)

{

Console.WriteLine("Usage");

Console.WriteLine("CustomerOrders [OrderID]");

return;

}

try

{

StringBuilder strBuilder = new StringBuilder();

strBuilder.Append("/Customer[@CustomerID='");

strBuilder.Append(args[0]);

strBuilder.Append("']");

if (args.Length > 1)

{

strBuilder.Append("/Order[@SalesOrderID='");

strBuilder.Append(args[1]);

strBuilder.Append("']");

}

SqlXmlCommand xmlCommand = new SqlXMLCommand(@"Provider=

SQLOLEDB; Server=localhost; database=AdventureWorks;

Integrated Security=SSPI;");

xmlCommand.ClIEntSideXML = true;

XMLCommand.RootTag = "CustomerOrders";

XMLCommand.SchemaPath = @"CustomerOrderDetails.xsd";

xmlCommand.CommandType = SqlXMLCommandType.XPath;

XMLCommand.CommandText = strBuilder.ToString();

Stream reader = XMLCommand.ExecuteStream( );

FileStream fsOut = File.Create("CustomerOrder.XML");

StreamWriter sw = new StreamWriter(fsOut);

using (StreamReader sr = new StreamReader(reader))

{

sw.Write(sr.ReadToEnd());

}

sw.Flush();

sw.Close();

fsOut.Close();

}

catch (Exception exception)

{

Console.WriteLine( exception.ToString() );

}

}

}

上述方法為作為應用程序命令行參數指定的客戶 ID 導出了銷售訂單的詳細信息。數據在客戶端轉換為 XML 格式,從而避免了服務器端的性能問題。請注意,上述帶批注的 XSD 方案映射必須保存為 CustomerOrderDetails.xsd,才能使上述代碼片段正常運行。 注意:從此示例中可以看出,用於從數據庫中檢索 XML 數據的代碼非常少。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved