スキーマ セクション
スキーマ セクションは必須です。 前の例に示すように、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"/>
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-Data specification (W3C XML-Data 仕様)」のデータ型に関するセクションを参照してください。 データ型は 2 つの方法で指定できます。列定義自体で直接 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 " です。ただし、"123" は長さが 6 ではなく 3 なので、有効ではありません。 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
に OLE DB 状態の DBSTATUS_E_UNAVAILABLE を、CompanyName に DBSTATUS_S_ISNULL を返します。
<z:row/>
長さ 0 の文字列は null と同じではないことに注意してください。
<z:row ShipperID="1" CompanyName=""/>
前の行の場合、永続化プロバイダーは、両方の列に OLE DB 状態の DBSTATUS_S_OK を返します。 この場合の CompanyName
は、単に "" (長さ 0 の文字列) です。
OLE DB の XML ドキュメントのスキーマ内で使用できる OLE DB コンストラクトの詳細については、"urn:schemas-microsoft-com:rowset" の定義と OLE DB プログラマー ガイドを参照してください。