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

ОГЛАВЛЕНИЕ

Сохранить как XML

Впервые возможность сохранять (есть еще замечательное слово "персистить") результаты запроса в виде XML появилась в ADO 2.1 (1999 г.) До этого в ADO 2.0 объект Recordset сохранялся только в частном бинарном формате ADTG (Advanced Data TableGram), который использовался для передачи recordset'a при удаленном доступе с помощью RDS.
В Скрипте 1 мы "отперсистили" в XML результат выполнения запроса (ADOшный Recordset).

static void Save_ADODBRecordset_XMLFile()
{
   ADODB.ConnectionClass cnn = new ADODB.ConnectionClass();
   cnn.Open("Provider=SQLOLEDB;Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI", "", "", (int)ADODB.ConnectOptionEnum.adConnectUnspecified);

   ADODB.Recordset rst; Object RecsAffected = new Object();
   rst = cnn.Execute("SELECT c.ContactName, c.ContactTitle, o.OrderDate " +
      "FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID",
      out RecsAffected, (int)ADODB.ExecuteOptionEnum.adOptionUnspecified);

   FileInfo f = new FileInfo("..\\Results\\ADODBRecordset_XMLFile.xml");
   if (f.Exists) f.Delete();
   rst.Save(f.FullName, ADODB.PersistFormatEnum.adPersistXML);
   cnn.Close();

   Process.Start("iexplore.exe", f.FullName);

   XmlDocument xmlDoc = new XmlDocument();
   xmlDoc.Load(f.FullName);
   Console.WriteLine("Кол-во заказов, сделанных данным клиентом = {0}",
   xmlDoc.SelectNodes(".//*[@ContactName='Maria Larsson']").Count);
}

Скрипт 1

Получается действительно нормальный XML, как видно на Рис.1.

- <xml xmlns:s=" uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882 " xmlns:rs=" urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
+ <s:Schema id ="RowsetSchema">
-
<rs:data >
  <z:row ContactName=" Paul Henriot" ContactTitle=" Accounting Manager" OrderDate ="1996-07-04T00:00:00"/>
  
<z:row ContactName=" Karin Josephs" ContactTitle=" Marketing Manager" OrderDate ="1996-07-05T00:00:00"/>
  
<z:row ContactName=" Mario Pontes" ContactTitle=" Accounting Manager" OrderDate font color=blue>="1996-07-08T00:00:00"/>
...
 </rs:data>
</xml>
Рис.1

Его можно открыть при помощи объектной модели DOM, выполнить XPath-запрос, возвращающий узлы заказов, сделанные клиентом по имени Maria Larsson, и другие подобающие XML действия. Что-то можно заложить в первоначальный SQL-запрос:

SELECT count(1) FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID WHERE c. ContactName = 'Maria Larsson'

но согласитесь, чтобы показать работу с сохраненным recordset'ом как с XML, часть работы для приличия надо проделать средствами XPath, а не SQL. По соображениям экономии места данный пример, как и все последующие, написаны на C#. Обратите внимание, что в нем используется не ADO.Net, а классическая объектная модель ADO (2.7). Для нее не требуется делать tlbimp из библиотек классов в ... \Program Files\Common Files\System\ado, потому что соответствующая обертка существует изначально как Primary Interop Assembly.