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


Раздел схемы

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

Schema Section

Раздел схемы является обязательным. Как показано в предыдущем примере, ADO записывает подробные метаданные о каждом столбце, чтобы максимально сохранить семантику значений данных для обновления. Однако для загрузки в XML-коде ADO требуются только имена столбцов и набор строк, к которым они принадлежат. Ниже приведен пример минимальной схемы:

 
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" 
    xmlns:rs="urn:schemas-microsoft-com:rowset" 
    xmlns:z="#RowsetSchema"> 
  <s:Schema id="RowsetSchema"> 
    <s:ElementType name="row" content="eltOnly"> 
      <s:AttributeType name="ShipperID"/> 
      <s:AttributeType name="CompanyName"/> 
      <s:AttributeType name="Phone"/> 
      <s:Extends type="rs:rowbase"/> 
    </s:ElementType> 
  </s:Schema> 
  <rs:data> 
... 
  </rs:data> 
</xml> 

В приведенном выше случае ADO будет обрабатывать данные как строки переменной длины, так как в схему не включены никакие сведения о типе.

Создание псевдонимов для имен столбцов

Атрибут rs:name позволяет создать псевдоним для имени столбца, чтобы в сведениях о столбцах, предоставляемых набором строк, отображалось понятное имя, а в разделе данных можно было использовать более короткое имя. Например, схему выше можно изменить, чтобы сопоставить ShipperID с s1, CompanyName — s2, а Phone — s3 следующим образом:

 
<s:Schema id="RowsetSchema">  
<s:ElementType name="row" content="eltOnly" rs:updatable="true">  
<s:AttributeType name="s1" rs:name="ShipperID" rs:number="1" ...>  
... 
</s:AttributeType>  
<s:AttributeType name="s2" rs:name="CompanyName" rs:number="2" ...>  
... 
</s:AttributeType>  
<s:AttributeType name="s3" rs:name="Phone" rs:number="3" ...>  
... 
</s:AttributeType>  
... 
</s:ElementType>  
</s:Schema>  

Затем в разделе данных строка будет использовать атрибут name (не rs:name) для ссылки на этот столбец:

 
"<row s1="1" s2="Speedy Express" s3="(503) 555-9831"/> 

Создание псевдонимов для имен столбцов требуется, если имя столбца не является законным атрибутом или именем тега в XML. Например, "Фамилия" должна иметь псевдоним, так как имена со встроенными пробелами являются недопустимыми атрибутами. Следующая строка не будет правильно обрабатываться синтаксический анализатор XML, поэтому необходимо создать псевдоним с другим именем, не имеющим встроенного пространства:

 
<row last name="Jones"/> 

Любое значение, используемое для атрибута name , должно использоваться согласованно в каждом месте, на которое ссылается столбец в разделах схемы и данных XML-документа. В следующем примере показано согласованное использование s1:

 
<s:Schema id="RowsetSchema"> 
  <s:ElementType name="row" content="eltOnly"> 
    <s:attribute type="s1"/> 
    <s:attribute type="CompanyName"/> 
    <s:attribute type="s3"/> 
    <s:extends type="rs:rowbase"/> 
  </s:ElementType> 
  <s:AttributeType name="s1" rs:name="ShipperID" rs:number="1"  
    rs:maydefer="true" rs:writeunknown="true"> 
    <s:datatype dt:type="i4" dt:maxLength="4" rs:precision="10"  
      rs:fixedlength="true" rs:maybenull="true"/> 
  </s:AttributeType> 
</s:Schema> 
<rs:data> 
  <z:row s1="1" CompanyName="Speedy Express" s3="(503) 555-9831"/> 
</rs:data> 

Аналогичным образом, так как псевдоним для CompanyName не определен выше, CompanyName должен использоваться согласованно во всем документе.

Типы данных

Тип данных можно применить к столбцу с атрибутом dt:type . Тип данных можно указать двумя способами: указать атрибут dt:type непосредственно в самом определении столбца или использовать конструкцию s:datatype в качестве вложенного элемента определения столбца. Пример.

 
<s:AttributeType name="Phone" > 
  <s:datatype dt:type="string"/> 
</s:AttributeType> 

эквивалентен

 
<s:AttributeType name="Phone" dt:type="string"/> 

Если полностью пропустить атрибут dt:type из определения строки, по умолчанию типом столбца будет строка переменной длины.

Если у вас больше сведений о типе, чем просто имя типа (например, dt:maxLength), это делает его более удобочитаемым, чтобы использовать дочерний элемент s:datatype . Однако это просто соглашение, а не требование.

В следующих примерах показано, как включить сведения о типах в схему:

 
<!-- 1. String with no max length --> 
<s:AttributeType name="title_id"/> 
<! — or --> 
<s:AttributeType name="title_id" dt:type="string"/> 
 
<! — 2. Fixed length string with max length of 6 --> 
<s:AttributeType name="title_id"> 
    <s:datatype dt:type="string" dt:maxLength="6" rs:fixedlength="true" /> 
</s:AttributeType> 
 
<! — 3. Variable length string with max length of 6 --> 
<s:AttributeType name="title_id"> 
    <s:datatype dt:type="string" dt:maxLength="6" /> 
</s:AttributeType> 
 
<! — 4. Integer --> 
<s:AttributeType name="title_id" dt:type="int"/> 

Во втором примере используется атрибут rs:fixedlength . Столбец с атрибутом rs:fixedlength , равным true, означает, что данные должны иметь длину, определенную в схеме. В этом случае юридическим значением для title_id является "123456", как и "123". Однако значение "123" будет недопустимым, так как его длина равна 3, а не 6. Более полное описание свойства fixedlength см. в руководстве программиста OLE DB.

Обработка значений NULL

Значения NULL обрабатываются атрибутом rs:maybenull . Если для этого атрибута задано значение true, содержимое столбца может содержать значение NULL. Кроме того, если столбец не найден в строке данных, пользователь, считывающий данные обратно из набора строк, получит состояние NULL из IRowset::GetData(). Рассмотрим следующие определения столбцов из таблицы Shippers:

 
<s:AttributeType name="ShipperID"> 
  <s:datatype dt:type="int" dt:maxLength="4"/> 
</s:AttributeType> 
<s:AttributeType name="CompanyName"> 
  <s:datatype dt:type="string" dt:maxLength="40" rs:maybenull="true"/> 
</s:AttributeType> 

Определение допускает значение CompanyName null, но ShipperID не может содержать значение NULL. Если раздел данных содержит следующую строку, поставщик сохраняемости установит состояние данных для столбца CompanyName константой состояния OLE DB DBSTATUS_S_ISNULL:

 
<z:row ShipperID="1"/> 

Если строка была полностью пустой, поставщик сохраняемости вернет состояние OLE DB DBSTATUS_E_UNAVAILABLE для ShipperID и DBSTATUS_S_ISNULL для CompanyName.

 
<z:row/>  

Обратите внимание, что строка нулевой длины не совпадает со значением NULL.

 
<z:row ShipperID="1" CompanyName=""/> 

Для предыдущей строки поставщик сохраняемости вернет состояние OLE DB DBSTATUS_S_OK для обоих столбцов. CompanyName в этом случае просто "" (строка нулевой длины).

Дополнительные сведения о конструкциях OLE DB, доступных для использования в схеме XML-документа для OLE DB, см. в определении urn:schemas-microsoft-com:rowset и руководстве программиста OLE DB.