次の方法で共有


スキーマ セクション

適用先: 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 を 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 ではなく 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"/> 

2 番目の例では、 rs:fixedlength 属性を細部で使用しています。 rs:fixedlength 属性が true に設定されている列は、そのデータにはスキーマで定義されている長さが必要だということを示しています。 この場合、title_idの法的価値は "123456" で、"123" と同じになります。ただし、長さが 6 ではなく 3 であるため、"123" は有効ではありません。 fixedlength プロパティの詳細については、「OLE DB Programmer's Guide」 (英語) を参照してください。

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 値を含めることはできません。 データ セクションに次の行が含まれている場合、Persistence Provider は CompanyName 列のデータの状態を OLE DB 状態定数 DBSTATUS_S_ISNULL に設定します。

 
<z:row ShipperID="1"/> 

次のように、行が完全に空の場合、Persistence Provider は ShipperID に OLE DB 状態 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 Programmer's Guide」 (英語) を参照してください。