萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> sql server教程 >> 從 SQL Server 2005 中處理 XML

從 SQL Server 2005 中處理 XML

簡介 簡介 是 XML 還是字符串? 是 XML 還是字符串? 文檔、片段和 FOR XML 支持 文檔、片段和 FOR XML 支持 在客戶端上使用 XML 架構支持 在客戶端上使用 XML 架構支持 小結 小結

簡介

Microsoft sql server 2005 中的重大更改之一是包含了 XML 數據類型。此數據類型是第一類類型,就像 INTVARCHAR 一樣,而且 SQL Server 2005 允許使用一系列 XML 特定的函數對此數據類型進行就地查詢和處理。它還支持存儲數據庫中的 XML 架構的集合,從而啟用基於數據庫的架構驗證。另外,SQL Server 2005 大大地擴展了 XML 組合(SELECT ... FOR XML 語句)的功能,擴展了 OpenXML() XML 分解函數,並針對 XML 數據類型提供了一個新的 nodes() 函數以進行更輕量級的分解。www.come on babyiTbulo.comlHAn2hv

既然對數據庫服務器增強了此新的 XML 功能,那麼對 Microsoft ADO.NET 2.0 中的 SqlClient 數據提供程序也進行增強就不會令人感到驚奇了。對 ADO.NET DataSet 也有更改,以便支持類型 XMLDataColumn,而且 System.DataSystem.Xml 之間的“集成點”得到了拓寬。在本文中,我將探究在客戶端上使用 SQL Server 2005 XML 數據類型。www.come on babyiTbulo.comlHAn2hv

SQL Server 2005 可以產生兩類 XML 輸出。語句 SELECT * FROM AUTHORS FOR XML AUTO 產生 XML 流,而不是一列一行的行集。該輸出類型與 SQL Server 2000 中的輸出類型相比沒有改變。只是因為查詢分析器工具中的限制,XML 流輸出在 SQL Server 查詢分析器中才顯示為一列一行的行集。您可以通過其特定的唯一標識符名稱“XML_F52E2B61-18A1-11d1-B105-000805F49916B”來將這種流與“普通”列區分開來。此名稱實際上是底層 TDS(這是一種表格式的數據流,SQL Server 網絡格式)分析器的指示器,在這種分析器中,列應該流至客戶端,而不是像普通行集那樣發送。有一種特殊的方法 SqlCommand.ExecuteXmlReader 用來在客戶端上檢索此特殊的流。在 SQL Server 2005 中,SELECT ... FOR XML 語句通過許多方式得到了增強。這裡僅提少數幾種: www.come on babyiTbulo.comlHAn2hv

1.www.come on babyiTbulo.comlHAn2hv

在大多數情況下,當您需要 SQL Server 2000 中的 FOR XML EXPLICIT 模式時,有一種新的、便於使用的 FOR XML PATH 模式。 www.come on babyiTbulo.comlHAn2hv

2.www.come on babyiTbulo.comlHAn2hv

使用 TYPE 指令,除了生成流之外,您還可以生成 XML 數據類型列。 www.come on babyiTbulo.comlHAn2hv

3.www.come on babyiTbulo.comlHAn2hv

可以嵌套 FOR XML 表達式。 www.come on babyiTbulo.comlHAn2hv

4.www.come on babyiTbulo.comlHAn2hv

SELECT ... FOR XML 可以使用 ROOT 指令生成 XML 文檔以及 XML 片段。 www.come on babyiTbulo.comlHAn2hv

5.www.come on babyiTbulo.comlHAn2hv

您可以將標准的 XSD 架構預先掛起到流。 www.come on babyiTbulo.comlHAn2hv

通過引用 ADO.NET 2.0 中的關系 datatype 枚舉,您可以初步了解到 XML 是一種一流的關系數據庫類型。System.Data.DbTypeSystem.Data.SqlDbType 分別包含 DbType.XmlSqlDbType.Xml 的附加值。在 System.Data.SqlTypes 命名空間中也有一個新的類,它是 SqlXml。這個類充當 XML 類型值的 XmlReader 實例工廠。我將通過一些簡單的代碼進行展示。假設我有一份 SQL Server 表,如下所示:www.come on babyiTbulo.comlHAn2hv

CREATE TABLE xmltab (

id INT IDENTITY PRIMARY KEY,

xmlcol XML)

我可以使用以下 ADO.NET 2.0 代碼在客戶端上訪問此表。www.come on babyiTbulo.comlHAn2hv

using System;

using System.Data;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using System.Xml;

void GetXMLColumn {

// "Generic Coding..." article for shows how to

// get a connection string from a config file

string s = GetConnectStringFromConfigFile("xmldb");

using (SqlConnection conn = new SqlConnection(s))

using (SqlCommand cmd = new SqlCommand(

"select * from xmltab", conn))

{

conn.Open();

SqlDataReader rdr = cmd.ExecuteReader();

DataTable t = rdr.GetSchemaTable();

while (rdr.Read())

{

SqlXml sx = rdr.GetSqlXml(1);

XmlReader xr = sx.CreateReader();

xr.Read();

Console.WriteLine(xr.ReadOuterXml());

}

}

}

我浏覽 GetSchemaTable 產生的 DataTable 時返回的列元數據正確地標識了列:www.come on babyiTbulo.comlHAn2hv

ProviderType: 25 (25 = XML)

ProviderSpecificDataType: System.Data.SqlTypes.SqlXml

DataType: System.Xml.XmlReader

DataTypeName:

正如任何其他構建到 SQL Server 中的類型一樣。請注意,此列的“.NET 類型”是 XmlReader,對於 .NET 而言,它就像任何從文件加載或用 XmlDocument 類產生的 XML 一樣。在 ADO.NET 2.0 中的存儲過程或參數化語句中將 XML 數據類型列用作參數同樣簡單:www.come on babyiTbulo.comlHAn2hv

using System;

using System.Data;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using System.Xml;

void AddARow {

// get a connection string from a config file

string s = GetConnectStringFromConfigFile("xmldb");

using (SqlConnection conn = new SqlConnection(s))

using (SqlCommand cmd = new SqlCommand(

"insert xmltab(xmlcol) VALUES(@x)", conn))

{

conn.Open();

cmd.Parameters.Add("@x", SqlDbType.Xml);

// connect the parameter value to a file

XmlReader xr = XmlReader.Create("somexml.xml");

cmd.Parameters[0].Value = new SqlXml(xr);

int i = cmd.ExecuteNonQuery();

}

}

返回頁首返回頁首

是 XML 還是字符串?

前面代碼中的兩種方法均使用 SqlTypes 中 SQL Server 特定的數據類型。當我使用 SqlRea

copyright © 萬盛學電腦網 all rights reserved