架构部分
适用于:Access 2013、Office 2013
Schema 节
Schema 节是必需的。 如上例所示,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(货主ID)映射到 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 中的合法属性或标记名时,需要为列名创建别名。 例如,"Last Name"必须有一个别名,因为带有嵌入空格的名称是非法属性。 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 值。 而且,如果无法在数据行中找到该列,则从行集向后读取数据的用户将从 IRowset::GetData() 获得 null 状态。 请考虑 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(货主ID)不能包含 null 值。 如果数据节中包含下列行,则 Persistence Provider 会将 CompanyName(公司名称)列中数据的状态设置为 OLE DB 状态常量 DBSTATUS_S_ISNULL:
<z:row ShipperID="1"/>
如果该行全部为空,那么,Persistence Provider 将返回 OLE DB 状态,对于 ShipperID(货主ID)将返回 DBSTATUS_E_UNAVAILABLE,对于 CompanyName(公司名称)将返回 DBSTATUS_S_ISNULL,如下所示。
<z:row/>
请注意,零长度字符串与 null 并不相同。
<z:row ShipperID="1" CompanyName=""/>
对于前面的行,Persistence Provider 将为这两列都返回 OLE DB 状态 DBSTATUS_S_OK。 在这种情况下,CompanyName(公司名称)只是 ""(零长度字符串)。
有关可用在 OLE DB XML 文档架构中的 OLE DB 结构的进一步信息,请参阅"urn:schemas-microsoft-com:rowset"的定义和《OLE DB 程序员指南》。