在应用程序中使用 XML 数据

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

本文介绍在应用程序中使用 xml 数据类型时可用的选项。 本文包括有关以下内容的信息:

  • 使用 ADO 和 SQL Server Native Client 处理 xml 类型列中的 XML

  • 使用 ADO.NET 处理 xml 类型列中的 XML

  • 使用 ADO.NET 处理参数中的 xml 类型

使用 ADO 和 SQL Server Native Client 处理 xml 类型列中的 XML

要使用 MDAC 组件访问 SQL Server 2005 (9.x) 中引入的类型和功能,必须在 ADO 连接字符串中设置 DataTypeCompatibility 初始化属性。

例如,下面的 Visual Basic Scripting Edition (VBScript) 示例显示了在 示例数据库的 表中查询 Demographicsxml Sales.Store 数据类型列 AdventureWorks2022 的结果。 具体来讲,查询将为 CustomerID 等于 3的行查找此列的实例值。

Const DS = "MyServer"
Const DB = "AdventureWorks2022"

Set objConn = CreateObject("ADODB.Connection")
Set objRs = CreateObject("ADODB.Recordset")

CommandText = "SELECT Demographics" & _
              " FROM Sales.Store" & _
              " INNER JOIN Sales.Customer" & _
              " ON Sales.Store.BusinessEntityID = sales.customer.StoreID" & _
              " WHERE Sales.Customer.CustomerID = 3" & _
              " OR Sales.Customer.CustomerID = 4"

ConnectionString = "Provider=MSOLEDBSQL" & _
                   ";Data Source=" & DS & _
                   ";Initial Catalog=" & DB & _
                   ";Integrated Security=SSPI;" & _
                   "DataTypeCompatibility=80"

'Connect to the data source.
objConn.Open ConnectionString

'Execute command through the connection and display
Set objRs = objConn.Execute(CommandText)

Dim rowcount
rowcount = 0
Do While Not objRs.EOF
   rowcount = rowcount + 1
   MsgBox "Row " & rowcount & _
           vbCrLf & vbCrLf & objRs(0)
   objRs.MoveNext
Loop

'Clean up.
objRs.Close
objConn.Close
Set objRs = Nothing
Set objConn = Nothing

此示例显示了如何设置数据类型兼容性属性。 默认情况下,使用 SQL Server Native Client Native Client 时该值设置为 0。 如果将该值设置为 80,SQL Server Native Client 提供程序将使 xml 和用户定义的类型列显示为 SQL Server 2000 (8.x) 数据类型。 结果将分别是 DBTYPE_WSTR 和 DBTYPE_BYTES。

注意

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中删除SQL Server Native Client(通常缩写为 SNAC)。 不建议在新应用程序开发工作中使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 请在此后切换为使用新版 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新版的 Microsoft OLE DB Driver for SQL Server。 对于作为 SQL Server 数据库引擎组件(版本 2012 到 2019)随附的 SQLNCLI,请参阅此支持生命周期特例

测试此示例

  1. 验证客户端计算机上是否安装了 SQL Server Native Client 以及是否有 MDAC 2.6.0 或更高版本可用。

    有关详细信息,请参阅 SQL Server Native Client 编程

  2. 验证是否安装了 SQL Server 中的 AdventureWorks2022 示例数据库。

    此示例需要 AdventureWorks2022 示例数据库。

  3. 复制本文前面显示的代码,并将代码粘贴到文本或代码编辑器中。 将文件另存为 HandlingXmlDataType.vbs。

  4. 根据需要修改脚本以安装 SQL Server 并保存更改。

    例如,如果指定了 MyServer,应将其替换为 (local) 或安装了 SQL Server 的服务器的实际名称。

  5. 运行 HandlingXmlDataType.vbs 并执行脚本。

结果应与以下示例输出相似:

Row 1

<StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey">
  <AnnualSales>1500000</AnnualSales>
  <AnnualRevenue>150000</AnnualRevenue>
  <BankName>Primary International</BankName>
  <BusinessType>OS</BusinessType>
  <YearOpened>1974</YearOpened>
  <Specialty>Road</Specialty>
  <SquareFeet>38000</SquareFeet>
  <Brands>3</Brands>
  <Internet>DSL</Internet>
  <NumberEmployees>40</NumberEmployees>
</StoreSurvey>

Row 2

<StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey">
  <AnnualSales>300000</AnnualSales>
  <AnnualRevenue>30000</AnnualRevenue>
  <BankName>United Security</BankName>
  <BusinessType>BM</BusinessType>
  <YearOpened>1976</YearOpened>
  <Specialty>Road</Specialty>
  <SquareFeet>6000</SquareFeet>
  <Brands>2</Brands>
  <Internet>DSL</Internet>
  <NumberEmployees>5</NumberEmployees>
</StoreSurvey>

使用 ADO.NET 处理 xml 类型列中的 XML

要使用 ADO.NET 和 Microsoft .NET Framework 处理 xml 数据类型列中的 XML,可以使用 SqlCommand 类的标准行为。 例如,可以按照使用 SqlDataReader 检索任何 SQL 列的相同方法检索xml 数据类型列及其值。但是,如果要将 xml 数据类型列的内容作为 XML 使用,必须先将这些内容指派给 XmlReader 类型。

有关详细信息和示例代码,请参阅 Microsoft .NET Framework 2.0 SDK 文档中的“数据读取器中的 XML 列值”。

使用 ADO.NET 处理参数中的 xml 类型列

要处理 ADO.NET 和 .NET Framework 中作为参数传递的 xml 数据类型,可以将参数值作为 SqlXml 数据类型的实例来提供。 这里不涉及任何特殊的处理,因为 SQL Server 中的 xml 数据类型列可按照与其他列和数据类型(如 stringinteger)相同的方式接受参数值。

有关详细信息和示例代码,请参阅 Microsoft .NET Framework 2.0 SDK 文档中的“作为命令参数的 XML 值”。

另请参阅