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 访问。
