共用方式為


架構區段

需要架構區段。 如前一個範例所示,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 程式設計人員指南。

另請參閱

以 XML 格式儲存記錄