XMLとデータベース
ADO、ASPとの連携について
(株)日本ユニテック
竹内 理
目次<全10ページ>
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
関連キーワード: データベース
|