Microsoft SQL Server 2005 中的 XML 支持(9)

四、SQL Server 2005 中的客户端 XML 处理

XML 数据类型的客户端支持

.NET 框架 V2.0 中的 ADO.NET XML 支持

SqlDataReader.GetSqlXml() 方法的 System.Data.SqlTypes 命名空间中,XML 数据类型是作为类 SqlXml 公开的。可以使用 SqlXml.CreateReader() 函数从 SqlXml 对象获得 XmlReader。

类型化 XML 列的 XML 架构集合的名称由三部分组成,可以从 XML 列的元数据中获得(通过使用 SqlDataReader 对象中的 GetSchemaTable() 或 GetSqlMetaData (int)),其三个部分作为三个属性,分别表示数据库 (XmlSchemaCollectionDatabase)、关系架构 (XmlSchemaCollectionOwingSchema) 和 XML 架构集合 (XmlSchemaCollectionName) 的名称。

客户端可以使用新的架构行集 XMLSCHEMA 从服务器检索 XML 架构。XMLSCHEMA 行集包含 XML 架构集合、目标命名空间和 XML 架构内容本身这样三列。

下面的示例显示了用于对 XML 数据类型进行托管访问的主干代码。

例:对 XML 数据类型进行进程内访问

下面的 C# 代码演示了如何从进程内提供程序访问 XML 数据类型。用于 SQL 客户端访问的代码需要适当地改变进程内访问。

using System;
using System.Xml;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlServer;

class xmldtADONETReadAccessInProc
{
   static void ReadXmlDataType () {
      // in-proc connection to server
      SqlConnection conn = SqlContext.GetConnection();

      // prepare query to select xml data
      SqlCommand cmd = conn.CreateCommand();
      cmd.CommandText = "SELECT xCol FROM docs";

      // execute query and retrieve incoming data
      SqlDataReader r = cmd.ExecuteReader();
      r.Read();

      // access XML data type field in rowset
      SqlXml xml = r.GetSqlXml(0);
      new XmlTextWriter(Console.Out).WriteNode( 
xml.CreateReader(), true);
   }
}

例:使用 SQL 客户端提供程序更新 XML 数据类型列

下面的代码所显示的 WriteXmlDaraType() 方法使用 SQL 客户端程序提供程序来替换 XML 列中的值。用于进程内提供程序的代码是相似的。

using System;
using System.Xml;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;

class xmldtADONETUpdateAccess
{
   static void WriteXmlDataType () {
      // connection to server
      SqlConnection conn = new SqlConnection("server=server1;" +
" database=XMLtest; Integrated Security=SSPI");
      conn.Open();

   // update XML column at the server
   SqlCommand cmd = conn.CreateCommand();
   cmd.CommandText = "UPDATE docs SET xCol=@x WHERE id=1";

// set value of XML parameter
   SqlParameter p = cmd.Parameters.Add("@x", SqlDbType.Xml);
p.Value = new SqlXml(new XmlTextReader("<hello/>", 
XmlNodeType.Document, null));

// execute update and close connection
   cmd.ExecuteNonQuery();
conn.Close();
}
}
SQL 本机客户端访问

在新的 SQL 本机访问 (SQLNCLI) 的 OLE DB 提供程序中,可以通过 ISequentialStream 来将 XML 数据类型列作为 Unicode 字符串(DBTYPE_XML、DBTYPE_BSTR、DBTYPE_WSTR 和 DBTYPE_VARIANT)或 Unicode 字符串流进行检索。默认为 DBTYPE_XML。

由三部分组成的 XML 架构集合名称是在由 IDBSchemaRowset::GetRowset() 返回的 COLUMNS 架构行集的三个新列中携带的:SS_XML_CATALOGNAME 给出目录的名称;SS_XML_SCHEMANAME 给出 XML 架构集合所驻留的关系架构的名称;SS_XML_SCHEMACOLLECTIONNAME 给出 XML 架构集合的名称。这些名称都属于 DBTYPE_WSTR 类型。对于非类型化的 XML 列,这些列具有 NULL 值。

可以对 PROCEDURE_PARAMETERS 架构行集和 IColumnRowset:GetColumnRowset() 进行类似的改变。

要检索 XML 架构集合的内容,客户端可以通过在对 XML_SCHEMA_NAMESPACE() 的调用中使用这些名称来单独访问服务器,并且返回 XML 架构作为 XML 数据类型。另外,带有新的 SS_XMLSCHEMA 架构行集的 IDBSchemaRowset 可以返回目录的名称、关系架构的名称、XML 架构集合的名称、目标命名空间和 XML 架构。

要使用 SQLNCLI 进行 ODBC 访问,需要将 XML 数据类型映射到名为 SQL_SS_XML 的 Unicode 可变长度字符数据。由三部分组成的 XML 架构集合的名称是通过用于 XML 列的 SqlColAttribute 作为 CharacterAttributePtr 出现的。这些字段标识符为 SQL_DESC_SS_XML_SCHEMA_CATALOG_NAME、SQL_DESC_SS_XML_SCHEMA_SCHEMA_NAME 和 SQL_DESC_SS_XML_SCHEMA_COLLECTION_NAME,分别用于数据库、关系架构和 XML 架构集合的名称。

用户必须安装 SQL Server 2005 版的数据库服务器或客户端工具才能获取 SQL 本机客户端。在撰写本文时,还不能使用 MDAC 2.8 ADO 对 XML 数据类型进行 OLE DB 访问。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值