共用方式為


結構描述區段

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

另請參閱

以 XML 格式保存記錄