結構描述區段
需要結構描述區段。 如前一個範例所示,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>
然後,在資料區段中,資料列會使用名稱屬性 (而非 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-資料規格的「資料類型」一節。 您可以透過兩種方式指定資料類型:直接在資料行定義本身指定 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
不能包含 null 值。 如果資料區段包含下列資料列,持續性提供者會將 CompanyName
資料行的資料狀態設定為 OLE DB 狀態常數 DBSTATUS_S_ISNULL:
<z:row ShipperID="1"/>
如果資料列完全空白 (如下所示),持續性提供者會針對 ShipperID
傳回 DBSTATUS_E_UNAVAILABLE 的 OLE DB 狀態,並針對 CompanyName 傳回 DBSTATUS_S_ISNULL。
<z:row/>
請注意,長度為零的字串與 null 不同。
<z:row ShipperID="1" CompanyName=""/>
針對前一個資料列,持續性提供者會針對這兩個資料行傳回 DBSTATUS_S_OK 的 OLE DB 狀態。 在此情況下的 CompanyName
只是 "" (長度為零的字串)。
如需進一步了解 OLE DB 的 XML 文件結構描述中可用的 OLE DB 建構,請參閱「urn:schemas-microsoft-com:rowset」的定義,以及 OLE DB 程式設計人員指南。