Раздел схемы
Раздел схемы является обязательным. Как показано в предыдущем примере, 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. Например, lastName должен иметь псевдоним, так как имена со встроенными пробелами являются недопустимыми атрибутами. Следующая строка не будет правильно обрабатываться синтаксическому анализатору 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. Полное руководство по допустимым типам XML см. в разделе Типы данных спецификации W3C XML-Data. Тип данных можно указать двумя способами: указать атрибут 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.