XML в MS SQL Server 2000 и технологиях доступа к данным - SQLXML-классы в .NET

ОГЛАВЛЕНИЕ

SQLXML-классы в .NET

После выхода SQL Server 2000 в августе 2000 г. дополнительная функциональность, в плане развития поддержки XML, выпускалась в виде веб-релизов под названием SQLXML. SQLXML 1.0 содержал Updategrams, XML Bulkload и усовершенствования в части производительности. В версии 2.0 ввели аннотированные XSD-схемы, FOR XML на стороне клиента, SQLXMLOLEDB-провайдер и SQLXML Managed Classes (в плане интеграции с ADO.Net). Наконец, веб-релиз версии 3.0, вышедший в марте 2002 г. и последний на момент подготовки доклада, добавляет к этому поддержку SOAP, превращая SQL Server в Web-сервис. Некоторые из перечисленных возможностей будут здесь разобраны.

Начнем с того, что в дальнейшем в примерах мы будем использовать управляемые (managed) библиотеки System. Data (ADO .Net) и Microsoft.Data.SqlXml. Первая является штатной функциональностью Visual Studio .Net, а вторая устанавливается в составе SQLXML Web Release 2.0 и выше. Если Вы экспериментируете с приводимыми здесь примерами, пожалуйста, отметьте эти библиотеки в References для своего проекта. Это вполне естественный выбор при использовании .Net-средства разработки, который избавляет, например, от возни с СОМ-маршалингом, при передаче массива интерфейсов IDispatch (Variant) в параметры ADODB.Command.. Не следует, впрочем, полагать, что с этого момента все рассматриваемые задачи решаются только с помощью SQLXML Managed Classes. Большинство разбираемых примеров вполне реализуются средствами классического СОМовского ADO подобно тому, как показывалось в п.п. 2 - 4. Однако с помощью новых технологий доступа к данным, специально предназначенных для работы в .NET Framework, этого можно достичь проще и быстрее. Скрипт 4 демонстрирует предыдущий пример (FOR XML-запрос на стороне сервера), переписанный с ADODB на SqlXml.

using System.Xml;
using Microsoft.Data.SqlXml;
...
static void Execute_FORXMLQuery_SQLXML()
{
      SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLOLEDB;...");
      cmd.CommandText = "SELECT c.ContactName, c.ContactTitle, o.OrderDate FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID WHERE c.ContactName = ? and year(o.OrderDate) = ? FOR XML AUTO";
      cmd.RootTag = "Root";
      cmd.CommandType = SqlXmlCommandType.Sql;
      cmd.OutputEncoding = "UTF-8";
      cmd.CreateParameter().Value = "Maria Larsson";
      cmd.CreateParameter().Value = 1997;
      Stream str = cmd.ExecuteStream();

      XmlDocument xml = new XmlDocument();
      xml.Load(str);
...
}
Скрипт 4

Логика примера не изменилась - выполняется SQL-запрос, результаты получаются в виде XML и передаются для последующей возможной работы в System.Xml.XmlDocument (аналог DOMDocument). Кроме того, для целей демонстрации XML-поток сохраняется в файл, который затем открывается в браузере. Класс SqlXml.Command для получения результатов в виде XML-потока имеет два метода: ExecuteStream() и ExecuteToStream(). Их отличие состоит в том, что первый создает новый Stream, а второй пишет в уже существующий. Кроме того, результаты запроса можно сразу получить как XmlReader (метод ExecuteXmlReader). В отличие от класса XmlDocument (DOM) XmlReader является более легковесным, он не требует загрузки всего документа в память. В терминологии баз данных его ближайшим аналогом будет forward-only read-only курсор. Свойство Dialect класса Command в ADO соответствует свойству CommandType, а Output Encoding и XML Root перешли из расширенных свойств в стандартные (OutputEncoding и RootTag).