WEB开发网
开发学院数据库MSSQL Server 从 SQL Server 2005 中处理 XML 阅读

从 SQL Server 2005 中处理 XML

 2007-11-11 05:14:20 来源:WEB开发网   
核心提示:一、简介 Microsoft sql server(WINDOWS平台上强大的数据库平台) 2005 中的重大更改之一是包含了 xml(标准化越来越近了) 数据类型,此数据类型是第一类类型,从 SQL Server 2005 中处理 XML,就像 INT 或 VARCHAR 一样,而且 sql server(WINDO

一、简介

Microsoft sql server(WINDOWS平台上强大的数据库平台) 2005 中的重大更改之一是包含了 xml(标准化越来越近了) 数据类型。此数据类型是第一类类型,就像 INTVARCHAR 一样,而且 sql server(WINDOWS平台上强大的数据库平台) 2005 允许使用一系列 xml(标准化越来越近了) 特定的函数对此数据类型进行就地查询和处理。它还支持存储数据库中的 xml(标准化越来越近了) 架构的集合,从而启用基于数据库的架构验证。另外,sql server(WINDOWS平台上强大的数据库平台) 2005 大大地扩展了 xml(标准化越来越近了) 组合(SELECT ... FOR xml(标准化越来越近了) 语句)的功能,扩展了 Openxml(标准化越来越近了)() xml(标准化越来越近了) 分解函数,并针对 xml(标准化越来越近了) 数据类型提供了一个新的 nodes() 函数以进行更轻量级的分解。

既然对数据库服务器增强了此新的 xml(标准化越来越近了) 功能,那么对 Microsoft ADO.NET 2.0 中的 SqlClient 数据提供程序也进行增强就不会令人感到惊奇了。对 ADO.NET DataSet 也有更改,以便支持类型 xml(标准化越来越近了)DataColumn,而且 System.DataSystem.xml(标准化越来越近了) 之间的“集成点”得到了拓宽。在本文中,我将探究在客户端上使用 sql server(WINDOWS平台上强大的数据库平台) 2005 xml(标准化越来越近了) 数据类型。

sql server(WINDOWS平台上强大的数据库平台) 2005 可以产生两类 xml(标准化越来越近了) 输出。语句 SELECT * FROM AUTHORS FOR xml(标准化越来越近了) AUTO 产生 xml(标准化越来越近了) 流,而不是一列一行的行集。该输出类型与 sql server(WINDOWS平台上强大的数据库平台) 2000 中的输出类型相比没有改变。只是因为查询分析器工具中的限制,xml(标准化越来越近了) 流输出在 sql server(WINDOWS平台上强大的数据库平台) 查询分析器中才显示为一列一行的行集。您可以通过其特定的唯一标识符名称“xml(标准化越来越近了)_F52E2B61-18A1-11d1-B105-000805F49916B”来将这种流与“普通”列区分开来。此名称实际上是底层 TDS(这是一种表格式的数据流,sql server(WINDOWS平台上强大的数据库平台) 网络格式)分析器的指示器,在这种分析器中,列应该流至客户端,而不是像普通行集那样发送。有一种特殊的方法 SqlCommand.Executexml(标准化越来越近了)Reader 用来在客户端上检索此特殊的流。在 sql server(WINDOWS平台上强大的数据库平台) 2005 中,SELECT ... FOR xml(标准化越来越近了) 语句通过许多方式得到了增强。这里仅提少数几种:

1.

在大多数情况下,当您需要 sql server(WINDOWS平台上强大的数据库平台) 2000 中的 FOR xml(标准化越来越近了) EXPLICIT 模式时,有一种新的、便于使用的 FOR xml(标准化越来越近了) PATH 模式。

2.

使用 TYPE 指令,除了生成流之外,您还可以生成 xml(标准化越来越近了) 数据类型列。

3.

可以嵌套 FOR xml(标准化越来越近了) 表达式。

4.

SELECT ... FOR xml(标准化越来越近了) 可以使用 ROOT 指令生成 xml(标准化越来越近了) 文档以及 xml(标准化越来越近了) 片段。

5.

您可以将标准的 XSD 架构预先挂起到流。

通过引用 ADO.NET 2.0 中的关系 datatype 枚举,您可以初步了解到 xml(标准化越来越近了) 是一种一流的关系数据库类型。System.Data.DbTypeSystem.Data.SqlDbType 分别包含 DbType.xml(标准化越来越近了)SqlDbType.xml(标准化越来越近了) 的附加值。在 System.Data.SqlTypes 命名空间中也有一个新的类,它是 Sqlxml(标准化越来越近了)。这个类充当 xml(标准化越来越近了) 类型值的 xml(标准化越来越近了)Reader 实例工厂。我将通过一些简单的代码进行展示。假设我有一份 sql server(WINDOWS平台上强大的数据库平台) 表,如下所示:

CREATE TABLE xml(标准化越来越近了)tab (  id INT IDENTITY Prima(最完善的虚拟主机管理系统)RY KEY,  xml(标准化越来越近了)col xml(标准化越来越近了))

我可以使用以下 ADO.NET 2.0 代码在客户端上访问此表。

using System;using System.Data;using System.Data.SqlClient;using System.Data.SqlTypes;using System.xml(标准化越来越近了);void Getxml(标准化越来越近了)Column {// "Generic Coding..." article for shows how to// get a connection string from a config filestring s = GetConnectStringFromConfigFile("xml(标准化越来越近了)db");using (SqlConnection conn = new SqlConnection(s))using (SqlCommand cmd = new SqlCommand(       "select * from xml(标准化越来越近了)tab", conn)) {  conn.Open();  SqlDataReader rdr = cmd.ExecuteReader();  DataTable t = rdr.GetSchemaTable();  while (rdr.Read())    {      Sqlxml(标准化越来越近了) sx = rdr.GetSqlxml(标准化越来越近了)(1);      xml(标准化越来越近了)Reader xr = sx.CreateReader();      xr.Read();       Console.WriteLine(xr.ReadOuterxml(标准化越来越近了)());    } }}

我浏览 GetSchemaTable 产生的 DataTable 时返回的列元数据正确地标识了列:

ProviderType: 25 (25 = xml(标准化越来越近了))ProviderSpecificDataType: System.Data.SqlTypes.Sqlxml(标准化越来越近了)DataType: System.xml(标准化越来越近了).xml(标准化越来越近了)ReaderDataTypeName:

正如任何其他构建到 sql server(WINDOWS平台上强大的数据库平台) 中的类型一样。请注意,此列的“.NET 类型”是 xml(标准化越来越近了)Reader,对于 .NET 而言,它就像任何从文件加载或用 xml(标准化越来越近了)Document 类产生的 xml(标准化越来越近了) 一样。在 ADO.NET 2.0 中的存储过程或参数化语句中将 xml(标准化越来越近了) 数据类型列用作参数同样简单:

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 filestring s = GetConnectStringFromConfigFile("xml(标准化越来越近了)db");using (SqlConnection conn = new SqlConnection(s))using (SqlCommand cmd = new SqlCommand(       "insert xml(标准化越来越近了)tab(xml(标准化越来越近了)col) VALUES(@x)", conn)) {  conn.Open();  cmd.Parameters.Add("@x", SqlDbType.xml(标准化越来越近了));  // connect the parameter value to a file  xml(标准化越来越近了)Reader xr = xml(标准化越来越近了)Reader.Create("somexml(标准化越来越近了).xml(标准化越来越近了)");  cmd.Parameters[0].Value = new Sqlxml(标准化越来越近了)(xr);  int i = cmd.ExecuteNonQuery(); }}

1 2 3 4 5  下一页

Tags:SQL Server 处理

编辑录入:coldstar [复制链接] [打 印]
赞助商链接