使用 SQLXML 过滤、检索和呈现数据






4.38/5 (8投票s)
2003 年 12 月 5 日
2分钟阅读

51075

1428
关于 Microsoft SQLXML 的文章
引言
此应用程序使用 Microsoft SQLXML 从 Microsoft SQL Server 实例访问 XML 数据,在 .NET 环境中处理数据,并使用 XSL 样式表以所需的格式呈现数据。此应用程序的主要目的是展示如何使用命名空间Microsoft.Data.SqlXml
中的托管类从 Microsoft SQL Server™ 2000 获取 XML 格式的数据,并使用合适的 XSL 来呈现这些数据。
使用代码
SQL Server 2000 可以使用 FOR XML AUTO、RAW 和 EXPLICIT 功能以 XML 格式返回数据。我们使用 FOR XML 子句来演示该应用程序。检索 XML 数据最有效的方法是使用 SQLXML 的托管类。该应用程序使用SqlXmlCommand
对象的ExecuteStream
等方法,以流的形式从 SQL Server 2000 检索 XML 数据。该应用程序使用 Northwind 数据库来获取员工详细信息。假设我们需要获取在指定国家/地区“英国”工作的员工详细信息及其所属区域列表。因此,我们有一个 SQL 查询,可以使用 FOR XML 子句以 XML 格式获取员工详细信息。
配置文件 (App.config) 中指定的 SQL 查询如下所示
SELECT
[Emp].[EmployeeID] AS EmpID,
[Emp].[FirstName] AS FNAME,
[Emp].[LastName] AS LNAME,
[TerritoryDescription] AS TerDesc
FROM
[Employees] [Emp]
LEFT OUTER JOIN
[EmployeeTerritories] [EmpTer]
ON
[EmpTer].[EmployeeID] = [Emp].[EmployeeID]
LEFT OUTER JOIN
[Territories] [Ter]
ON
[EmpTer].[TerritoryID] = [Ter].[TerritoryID]
WHERE
[Emp].[Country] = ?
FOR XML AUTO
连接字符串、XSL 文件名、目标 HTML 文件名和 SQL 查询都包含在配置文件中。StreamReader
对象用于将从 SQL Server 2000 检索到的 XML 数据读取到字符串中。SqlXmlParameter
使用CreateParameter
方法创建一个参数,用于根据指定的国家/地区“英国”过滤数据。从数据库检索到的 XML 没有根元素。因此,根标签被显式地添加到检索到的字符串中。
检索 XML 数据作为流并将其转换为字符串的 C# 代码片段
#region Get the data using FOR XML CLAUSE
// Get the connection string
strConnString = ConfigurationSettings.AppSettings["DBConnString"];
// Create a new SqlXmlCommand object
xmlCmd = new SqlXmlCommand(strConnString);
// Set the text of the command
xmlCmd.CommandText = ConfigurationSettings.AppSettings["GetEmpDetails"];
// Create a new xmlParam object
xmlParam = xmlCmd.CreateParameter();
// Assign the value for the parameter defined
xmlParam.Value = "UK";
// Execute the command to retrieve the xml from sql in the form of stream
strmObject = xmlCmd.ExecuteStream();
// Set the position of the stream object to 0
strmObject.Position = 0;
strResult = "<ROOT>";
// Assign the stream to the StreamReader
using(StreamReader srdrObject = new StreamReader(strmObject))
{
strResult += srdrObject.ReadToEnd();
}
strResult += "</ROOT>";
#endregion
XSLT 引擎用于将数据转换为所需的输出。然后创建XslTransform
对象,并将样式表 XSL 文件加载到其中。XmlTextWriter
对象用于在 HTML 文件中输出结果。XslTransform
对象的 Transform 方法用于转换数据并将输出发送到指定 HTML 文件。创建输出文件后,会在EventLog
中进行记录。如果发生任何异常,则
将 XML 数据转换并输出到 HTML 文件的 C# 代码片段
#region Load the xml & xsl & Transform the same
// Create a new XmlDocument object
objXmlDoc = new XmlDocument();
// Load XML to the xml document
objXmlDoc.LoadXml(strResult);
// Get the XML file name
strXMLFileName = ConfigurationSettings.AppSettings["SourceXMLFileName"];
// Get the XSL file name
strXSLFileName = ConfigurationSettings.AppSettings["SourceXSLFileName"];
// Get the HTML file name
strHTMLFileName = ConfigurationSettings.AppSettings["TargetHTMLFileName"];
// Save the XML file
objXmlDoc.Save(strXMLFileName);
//
//Create a new XPathDocument and load the XML data to be transformed.
objPathDoc = new XPathDocument(strXMLFileName);
//
objTransform = new XslTransform();
objTransform.Load(strXSLFileName);
//
//Create an XmlTextWriter which outputs to a html file.
writer = new XmlTextWriter(strHTMLFileName,null);
//
//Transform the data and send the output to a html file.
objTransform.Transform(objPathDoc, null, writer);
//
// Make an entry in the Eventlog - Successful
EventLog.WriteEntry("ForXMLSupport", strHTMLFileName +
" file is created successfully", EventLogEntryType.Information);
#endregion
此处指定了用于设置数据样式的 XSL 代码
<xsl:for-each select="ROOT/Emp">
<xsl:variable name="EmpName"><xsl:value-of select="./@FNAME"/>
<xsl:value-of select="./@LNAME"/></xsl:variable>
<xsl:variable name="EmpFirstName">
<xsl:value-of select="./@FNAME"/></xsl:variable>
<table border="1" width="100%" bgcolor="chocalate">
<tr>
<td><b>Employee ID : </b><xsl:value-of select="./@EmpID"/></td>
<td><b>Name : </b><xsl:value-of select="$EmpName"/></td>
</tr>
<tr>
<tr>
<td colspan="2"><b>Territories managed by <i>
<xsl:value-of select="$EmpFirstName"/></i> : </b></td>
</tr>
<table border="1" width="100%" bgcolor="lightblue">
<xsl:for-each select="./Ter">
<tr>
<td><xsl:value-of select="./@TerDesc"/></td>
</tr>
</xsl:for-each>
</table>
</tr>
</table>
</xsl:for-each>
输出文件
总结
本文的目的是介绍如何使用 Microsoft SqlXml 托管类从 Microsoft SQL Server 2000 检索 XML 数据,并对其进行处理并以所需的格式呈现。