Поделиться через


Иерархические наборы записей в XML

Область применения: Access 2013, Office 2013

Иерархические наборы записей в XML

ADO обеспечивает сохранение иерархических объектов Recordset в XML. При использовании иерархических объектов Recordset значение поля в родительском наборе записей является другим набором записей. Такие поля представляются в xml-потоке дочерними элементами, а не атрибутом. Следующий пример демонстрирует этот случай:

 
Rs.Open "SHAPE {select stor_id, stor_name, state from stores} APPEND ({select stor_id, ord_num, ord_date, qty from sales} AS rsSales RELATE stor_id TO stor_id)", "Provider=MSDataShape;DSN=pubs;UID=MyUserId;PWD=MyPassword;" 

Ниже приведен xml-формат сохраненного набора записей:

 
<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">  
    <s:ElementType name="row" content="eltOnly" rs:updatable="true">  
      <s:AttributeType name="stor_id" rs:number="1"  
        rs:writeunknown="true">  
        <s:datatype dt:type="string" dt:maxLength="4"  
          rs:fixedlength="true" rs:maybenull="false"/>  
      </s:AttributeType>  
      <s:AttributeType name="stor_name" rs:number="2" rs:nullable="true"  
        rs:writeunknown="true">  
          <s:datatype dt:type="string" dt:maxLength="40"/>  
      </s:AttributeType>  
      <s:AttributeType name="state" rs:number="3" rs:nullable="true"  
        rs:writeunknown="true">  
        <s:datatype dt:type="string" dt:maxLength="2"  
          rs:fixedlength="true"/>  
      </s:AttributeType>  
      <s:ElementType name="rsSales" content="eltOnly"  
        rs:updatable="true" rs:relation="010000000100000000000000">  
        <s:AttributeType name="stor_id" rs:number="1"  
          rs:writeunknown="true">  
          <s:datatype dt:type="string" dt:maxLength="4"  
            rs:fixedlength="true" rs:maybenull="false"/>  
        </s:AttributeType>  
        <s:AttributeType name="ord_num" rs:number="2"  
          rs:writeunknown="true">  
          <s:datatype dt:type="string" dt:maxLength="20"  
            rs:maybenull="false"/>  
        </s:AttributeType>  
        <s:AttributeType name="ord_date" rs:number="3"  
          rs:writeunknown="true">  
            <s:datatype dt:type="dateTime" dt:maxLength="16"  
              rs:scale="3" rs:precision="23" rs:fixedlength="true"  
              rs:maybenull="false"/>  
        </s:AttributeType>  
        <s:AttributeType name="qty" rs:number="4" rs:writeunknown="true">  
          <s:datatype dt:type="i2" dt:maxLength="2" rs:precision="5"  
            rs:fixedlength="true" rs:maybenull="false"/>  
        </s:AttributeType>  
        <s:extends type="rs:rowbase"/>  
      </s:ElementType>  
      <s:extends type="rs:rowbase"/>  
    </s:ElementType>  
  </s:Schema>  
  <rs:data>  
    <z:row stor_id="6380" stor_name="Eric the Read Books" state="WA">  
      <rsSales stor_id="6380" ord_num="6871"  
        ord_date="1994-09-14T00:00:00" qty="5"/>  
      <rsSales stor_id="6380" ord_num="722a"  
        ord_date="1994-09-13T00:00:00" qty="3"/>  
    </z:row>  
    <z:row stor_id="7066" stor_name="Barnum's" state="CA">  
      <rsSales stor_id="7066" ord_num="A2976"  
        ord_date="1993-05-24T00:00:00" qty="50"/>  
      <rsSales stor_id="7066" ord_num="QA7442.3"  
        ord_date="1994-09-13T00:00:00" qty="75"/>  
    </z:row>  
    <z:row stor_id="7067" stor_name="News & Brews" state="CA">  
      <rsSales stor_id="7067" ord_num="D4482"  
        ord_date="1994-09-14T00:00:00" qty="10"/>  
      <rsSales stor_id="7067" ord_num="P2121"  
        ord_date="1992-06-15T00:00:00" qty="40"/>  
      <rsSales stor_id="7067" ord_num="P2121"  
        ord_date="1992-06-15T00:00:00" qty="20"/>  
      <rsSales stor_id="7067" ord_num="P2121"  
        ord_date="1992-06-15T00:00:00" qty="20"/>  
    </z:row>  
... 
  </rs:data>  
</xml>  

Точный порядок столбцов в родительском наборе записей не очевиден при его сохранении таким образом. Любое поле в родительском элементе может содержать дочерний набор записей. Поставщик сохраняемости сначала сохраняет все скалярные столбцы в виде атрибутов, а затем сохраняет все дочерние столбцы Набора записей как дочерние элементы родительской строки. Порядковое положение поля в родительском наборе записей можно получить, просмотрев определение схемы набора записей. Каждое поле имеет свойство OLE DB rs:number, определенное в пространстве имен схемы Recordset , которое содержит порядковый номер для этого поля.

Имена всех полей в дочернем наборе записей объединяются с именем поля в родительском наборе записей , который содержит этот дочерний элемент. Это позволяет гарантировать отсутствие конфликтов имен в случаях, когда родительский и дочерний наборы записей содержат поле, полученное из двух разных таблиц, но именуемое в единственном числе.

При сохранении иерархических наборов записей в XML следует учитывать следующие ограничения в ADO:

  • Иерархический набор записей с ожидающих обновлений не может быть сохранен в ФОРМАТЕ XML.

  • Иерархический набор записей, созданный с помощью параметризованной команды фигуры, не может быть сохранен (в формате XML или ADTG).

  • В настоящее время ADO сохраняет связь между родительским и дочерним наборами Записей в виде двоичного большого двоичного объекта (BLOB). XML-теги для описания этой связи еще не определены в пространстве имен схемы набора строк.

  • При сохранении иерархического набора записей вместе с ним сохраняются все дочерние наборы записей . Если текущий набор записей является дочерним элементом другого набора записей, его родительский элемент не сохраняется. Сохраняются все дочерние наборы записей , образующие поддеревок текущего набора записей .

При повторном открытии иерархического набора записей в формате XML необходимо учитывать следующие ограничения:

  • Если дочерняя запись содержит записи, для которых нет соответствующих родительских записей, эти строки не записываются в XML-представление иерархического набора записей. Таким образом, эти строки будут потеряны при повторном открытии набора записей из своего постоянного расположения.

  • Если дочерняя запись содержит ссылки на несколько родительских записей, то при повторном открытии набора записейдочерний набор записей может содержать повторяющиеся записи. Однако эти дубликаты будут видны только в том случае, если пользователь работает непосредственно с базовым дочерним набором строк. Если глава используется для перемещения по дочернему набору записей (это единственный способ навигации по ADO), дубликаты не видны.