架構區段
需要架構區段。 如前一個範例所示,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"/>
您用於名稱屬性的任何值,都必須在 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 程式設計人員指南。
處理空值
空值由 rs:maybenull 屬性來處理。 如果此屬性設定為 true,則數據行的內容可以包含 Null 值。 此外,如果在數據列中找不到數據行,則從數據列集讀取數據的使用者將會從 IRowset::GetData() 取得 Null 狀態。 請考慮來自[貨運公司]資料表的下列欄位定義。
<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 程式設計人員指南。