ホーム > X-Plus > XML Square >  デベロッパーズコーナー  >  XMLとデータベース

この記事を送る はてなブックマークに追加する BuzzurlにブックマークBuzzurlにブックマーク Yahoo!ブックマークに登録
テキストリンクコードを取得する

デベロッパーズコーナー:XMLとデータベース I(5)

2002年01月01日作成 

XMLとデータベース
ADO、ASPとの連携について
(株)日本ユニテック
竹内 理


目次<全10ページ>

2.準備
5.STEP3:永続化されたレコードセットの中身を検証する
    おわりに



STEP3:永続化されたレコードセットの中身を検証する

STEP2ではSTEP1で永続化したレコードセット、つまりADOが生成したXMLファイルを再びレコードセットとして読み込むことができました。ではどんなXMLファイルであってもRecordsetオブジェクトはオープンできるのでしょうか。「いいえ」というのがその答えです。

ADOは決まった形式のXMLファイル以外を開くことはできません。では、STEP1で出力されたXMLファイルを詳しく見ることにより、その基本的な形式を理解しましょう。このようなファイルが出力されました。

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
   xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
   xmlns:rs='urn:schemas-microsoft-com:rowset'
   xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
   <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
       <s:AttributeType name='Name' rs:number='1' rs:nullable='true' rs:write='true' rs:basetable='person' rs:basecolumn='Name'>
           <s:datatype dt:type='string' dt:maxLength='50'/>
       </s:AttributeType>
       <s:AttributeType name='Age' rs:number='2' rs:nullable='true' rs:write='true' rs:basetable='person' rs:basecolumn='Age'>
           <s:datatype dt:type='i2' dt:maxLength='2' rs:precision='5' rs:fixedlength='true'/>
       </s:AttributeType>
       <s:extends type='rs:rowbase'/>
   </s:ElementType>
</s:Schema>
<rs:data>
    <z:row Name='C.Mansfield' Age='22'/>
   <z:row Name='F.S.Fitzgerald' Age='35'/>
</rs:data>
</xml>
<リスト3.XMLファイルに永続化されたレコードセット(adors.xml)>

では、それぞれの要素について見ていきましょう。

<xml>要素:まず、永続化されたレコードセットは<xml>というルート要素をもっています。この要素の中では4つの名前空間を宣言しています。「s」(これらの識別子は任意でつけることができます)はXDR(Xml Data Reduced:XMLスキーマ定義のひとつ)に基づいており、レコードセットのスキーマを定義する要素と属性を含みます。「dt」はデータ型定義指定です。「rs」はレコードセットの要素と属性を定義します。そして最後に「xmlns:z='#RowsetSchema'」が定義されています。これは「z」という識別子を持つ要素(この例でいくと<z:row Name='F.S.Fitzgerald' Age='35'>など)が属性id='RowsetSchema'を持つ要素<s:Schema>で定義されているスキーマを参照することを示すものです。

<s:Schema>要素:この要素はこのレコードセットの構造を記述する部分です。いわゆるスキーマと考えてよいでしょう。前述したようにid属性を持ち、キーワード(ここではRowsetSchemaですが、実際には任意で名前をつけられます)を指定します。

<s:ElementType>要素:<s:Schema>は<s:ElementType>という子要素をもちます。この例の場合、<s:ElementType>要素は元のデータベースのPersonテーブルの列定義をまとめたものといえます。この要素のname属性は重要です。後に記述するデータ部はこのname属性の値を参照してレコードを<s:ElementType>要素内でなされている列定義と関連付けるからです。また、rs:updatable='true'となっていることに注意してください。属性rs:updatableがtrueであればこのレコードセットの更新を認める、という意味になります。これはSample1.aspでRecordsetオブジェクトのプロパティlockTypeを「更新可」の状態にしているためです。

<s:AttributeType>要素:ひとつの列の定義を表します。属性nameは列名です。またrs:write='true'となっていることに注意してください。rs:writeがtrueであれば、この列が書き込み可能であることを示しています。

<s:datatype> 要素:<s:datatype>要素にはその列のデータ型を記述します。属性dt:typeに指定できる型の詳細についてはhttp://www.w3.org/TR/1998/NOTE-XML-data-0105/#Datatypesをご覧ください。

<rs:data>要素:このレコードセットの実際のデータを記述します。

<z:row>要素:1つの<z:row>要素で1行のデータを持ちます。名前空間識別子「z」はこのレコードが<s:Schema>要素内で定義されたスキーマを参照することを表します。またローカルネーム「row」は属性nameが「row」である<s:ElementType>要素内で定義された列の定義を参照することを意味します。また、各属性はs:AttributeTypeで定義された各列に入れる値を設定します。<z:row Name='C.Mansfield' Age='22'/>はName、Ageの各列の値がそれぞれC.mansfiled、22であることをあらわしています。

<rs:insert>、<rs:update>、<rs:delete>要素:adors.xmlにはありませんが、ADOは変更を行ったレコードセットを永続化する際に、その変更情報も保存します。例えば、レコードセットにaddnewメソッドを使用してレコードを追加した場合は<rs:data>要素の子要素として<rs:insert>要素が出力されます。

<rs:insert>
  <z:row Name='O.Henry' Age='38'/>
</rs:insert>

同じようにupdateの場合、変更情報は次のように出力されます。

<rs:update>
  <rs:original>
    <z:row Name='C.Mansfield' Age='22'/>
  </rs:original>
  <z:row Name="W.Faulkner" Age="24"/>
</rs:update>

これは、"C.Mansfield"、"22"の行のデータを"W.Faulkner"、"24"に更新したことを示します。

またdeleteの場合は、削除された行が通常の行リストから除かれ、変わりに次のような出力がされます。

<rs:delete>
  <z:row name="C.Mansfield" Age="22"/>
</rs:delete>

実際に変更がなされたレコードセットを永続化したファイルを以下に示しておきます。
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
   xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
   xmlns:rs='urn:schemas-microsoft-com:rowset'
   xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
   <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
       <s:AttributeType name='Name' rs:number='1' rs:nullable='true' rs:write='true' rs:basetable='person' rs:basecolumn='Name'>
           <s:datatype dt:type='string' dt:maxLength='50'/>
       </s:AttributeType>
       <s:AttributeType name='Age' rs:number='2' rs:nullable='true' rs:write='true' rs:basetable='person' rs:basecolumn='Age'>
           <s:datatype dt:type='i2' dt:maxLength='2' rs:precision='5' rs:fixedlength='true'/>
       </s:AttributeType>
       <s:extends type='rs:rowbase'/>
   </s:ElementType>
</s:Schema>
<rs:data>
   <rs:update>
       <rs:original>
           <z:row Name='C.Mansfield' Age='22'/>
       </rs:original>
       <z:row Name='W.Faulkner' Age='24'/>
   </rs:update>

   <z:row Name='F.S.Fitzgerald' Age='35'/>
   <rs:insert>
       <z:row Name='O.Henry' Age='38'/>
   </rs:insert>

</rs:data>
</xml>
<リスト4.変更をしたレコードセットの永続化XMLファイル>

上の例はレコードセットにデータの追加と更新の処理を行い、その後永続化した場合のXMLファイルです。<rs:data>の子要素がどのようになっているかに注目してください。
以上でADOが永続化するレコードセットの内容を見ることができました。このような基本的な形式を知ることにより、永続化されたXMLファイルの利用の幅が広がります。



この記事と関連の高い記事

関連キーワード:ADO


関連キーワード:ASP


関連キーワード:データベース




ページトップへ戻る