XMLプログラミング(ADO編)

Similar documents
データアダプタ概要

VB.NET解説

DAOの利用

グラフィックス

目次 更新履歴... 1 はじめに... 3 レコードセット?... 3 準備... 5 SQL でデータを取得する... 6 データのループ処理... 7 列の値を取得する... 7 対象行を変更する (MoveFirst, MoveNext, MovePrevious, MoveLast)...

データベース1

VB実用Ⅲ⑩ フリーデータベースⅡ

VB.NET解説

データベースⅠ

データベースプログラミング

ICONファイルフォーマット

Userコントロール

データベース1

ADO.NETのアーキテクチャ

正規表現応用

ファイル操作-バイナリファイル

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

ファイル操作

ListViewコントロール

MS Office オートメーション

mySQLの利用

Microsoft Office操作(EXCEL)

構造体

データベース1

ファイル操作-インターネットキャッシュ

NotifyIconコントロール

プラグイン

ルーレットプログラム

データベースアクセス

データベースⅠ

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの

VB実用Ⅲ③ ADOでXML操作

Base によるアプリケーション開発とサポート 鎌滝雅久 /OpenOffice.org 日本ユーザー会 OSC2007 Hokkaido 2007 年 6 月 30 日土曜日 10:55-11:40 北海道大学学術交流会館第 4 会議室

VB実用① データベースⅠ

データベースⅡ

プロセス間通信

グラフィックス 目次

データベースⅡ

Case 0 sqlcmdi.parameters("?tencode").value = Iidata(0) sqlcmdi.parameters("?tenname").value = Iidata(1) 内容を追加します sqlcmdi.executenonquery() Case Else

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft


XML(DOMガイド)

Microsoft Office操作

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

ブロック パニック

MS Office オートメーション

ファイル監視

VB実用⑦ エクセル操作Ⅰ

GUIプログラムⅡ

TableAdapterクラス

Microsoft Word - Android_SQLite講座_画面800×1280

VB実用Ⅲ⑩ フリーデータベースⅡ

目次 はじめに... 3 システムの必要条件... 3 サンプルアプリケーションの作成... 3 手順 手順 手順 手順 手順 手順 終わりに... 23

64bit環境で32bitコンポーネントの利用

ブロック崩し風テニス

目次 はじめに... 3 システムの必要条件... 4 ライセンス認証... 4 アクティベーション... 6 開発... 7 手順 1. アプリケーションの作成... 7 手順 2. データソースの作成と代入... 7 手順 3. テンプレートの作成 手順 4. レポートビューアの追加


ObjectPartner Pro

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

図 2 Excel スプレッドシートの世界 のウィンドウ 図 3 Visual Basic の世界 のウィンドウ 図 3 の VBA ウィンドウは 図 2 の Excel ウィンドウのメニューの ツール をクリックし 開か れるプルダウンメニューで マクロ /Visual Basic Editor

ADOとADO.NET

OTRS10 他社システムOTRS呼出利用手順書

ご存知ですか? データ転送

1. アンケート集計サンプルについて ここでは Windows Azure と SQL Azure を使ってアンケートを実施し アンケート結果を Excel で集計するサンプルについて説明します アンケートは Windows Azure で運用し アンケート結果は SQL Azure に格納されます

Maser - User Operation Manual

ハッシュテーブル

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

Microsoft Word - VB.doc

スケジューリングおよび通知フォーム のカスタマイズ

Prog2_15th

回文作成支援プログラム

VB6互換のファイルの処理

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

スクールCOBOL2002

intra-mart Accel Platform — OData for SAP HANA セットアップガイド   初版  

連絡先の管理

VB実用③ アクセス操作Ⅰ

LightSwitch で申請システム Windows ストアアプリで受付システムを構築してみた 情報政策グループ技術職員金森浩治 1. はじめに総合情報基盤センターでは 仮想サーバホスティングサービスや ソフトウェアライセンス貸与といった さまざまなエンドユーザ向けサービスを行っている 上記のよう

データを TreeView コントロールで表示 VisualStudio2017 の Web サイトプロジェクトで bootstrap, 及び script フォルダの js ファイルが使用できるマスターページを親とする TestTreeView.aspx ページを作成します 下記の html コー

正規表現概要

Microsoft Word - NW2013_Installation_Guide_English_no_screenshots_JPN.doc

PowerPoint プレゼンテーション

プレポスト【問題】

C# bit 環境用 C# 2005 基礎 Ⅱ 電脳梁山泊烏賊塾 データベース操作プログラム Ⅰ C# プログラムの概要 データベースプログラムを手軽に作成する方法としては Access のフォーム機能を用いる事が 先ず考えられます ウィザードも充実しており 操作を覚

PowerPoint プレゼンテーション

万年暦プログラム

Sharing the Development Database

1. 入力画面

问题集 ITEXAMPASS 1 年で無料進級することに提供する

エクセル詳細 アドイン

Java - Visual Editor

MVP for VB が語る C# 入門

GUIプログラムⅣ

データベースⅢ

Caché SQL ゲートウェイの使用法

WebReportCafe

Android Layout SDK プログラミング マニュアル

Transcription:

XML プログラミング ADO 2.5 と XML ADO 2.5 と XML ADO 2.5 を利用すれば 粗所有るデータソースからのデータの読み取りや ADO レコードセット ( メモリ上にデータを持つ仮想テーブルの様な物 ) へのデータの配置 XML へのデータ変換が可能に成る XML に変換したデータをデータストリームに配置すれば ファイルや ADO ASP Response オブジェクト (Web クライアントへの情報の返送に使用する ) XML DOM と謂ったデータソースへの出力と仕て使用出来る様に成る データを XML と仕て出力するには COM の IStream インターフェイスを使用する IStream インターフェイスは ADO Stream オブジェクトへのデータの読み取りと書き込みをサポートする為に設計された物で有る ADO 2.5 は IStream インターフェイスのサポートを要求する 其の一方で XML データは ADO 2.5 の読み取り専用のレコードセットや読み取り 書き込みレコードセットのデータソースと仕て使用する事も出来る 例えば Web サーバーの ASP ページに ADO 2.5 を使用すれば データを ADO レコードセットに配置すると謂う方法で データベースからデータを取得出来る様に成る 此のデータは ASP Response オブジェクトへの XML 出力と仕て ADO 2.0 を使って転送される クライアントに到着した XML データは DHTML を使ってクライアントの ADO レコードセットに読み込まれる クライアント側で ADO レコードセットと DHTML を使用すれば ユーザーに依るデータの読み取りや更新が可能に成る 次は データを XML と仕て入出力する ADO 2.5 のサンプルを使って 其の仕組みを探って観る事にする ADO 2.5 を使った XML と仕てのデータ出力 此のサンプルでは SQL Server の Northwind データベースからデータを取り出し 其れを XML と仕てテキストファイルに保存する 此の作業を実行する為 Visual Basic アプリケーションに ADO 2.5 を使用する 次の手順に従って サンプルアプリケーションを作成して観る事にする 1.Visual Basic を開いて 標準 EXE アプリケーションを作成し デフォルトフォームの名前を frmadoxml に変更する 2.[ プロジェクト ] メニューから [ 参照設定 ] を選択し [ Microsoft ActiveX Data Objects 2.5 Library ] への参照を追加する 3. フォームに cmdsave と謂うコマンドボタンを追加し キャプションに Save を設定する 4.cmdSave コマンドボタンの Click イベントハンドラに 次のコードを追加する Private Sub cmdsave_click() Dim objnwconnection As ADODB.Connection Set objnwconnection = New ADODB.Connection objnwconnection.cursorlocation = aduseclient ' 次のステートメントの IES-FUJI を 適切なデータソースに置き換える必要が有る objnwconnection.open "Provider=SQLOLEDB.1;" & _ "Integrated Security=SSPI; Persist Security Info=False;" & _ " User ID=sa; Initial Catalog=Northwind; " Data Source=IES-FUJI" objnwrecordset.cursorlocation = aduseclient 1

objnwrecordset.cursortype = adopenstatic Set objnwrecordset.activeconnection = objnwconnection objnwrecordset.open "Products" ' レコードセットを XML と仕てファイルに保存する objnwrecordset.save "C: Products.xml", adpersistxml コードは先ず objnwconnection と謂う ADO Connection オブジェクトと objnw Recordset と謂う Recordset オブジェクトを生成し オブジェクトのプロパティを設定してから 其等を開く Connection オブジェクトは データソースへの接続を提供する Recordset オブジェクトは データソースから取り出したデータを持つ メモリ上の仮想テーブルで有る Recordset オブジェクトの CursorLocation プロパティは データがクライアントとサーバーの敦れに配置されるのかを決定する 亦 CursorLocation プロパティは データベースとの接続を維持しなければ成らないのか ( サーバーカーソル ) 其れ共 切断されたレコードセットを作成して居る間は接続を切断する事が出来るのか ( クライアントカーソル ) を決定する ADO Connection オブジェクトの Open メソッドは パラメータと仕て接続文字列を取る 此の接続文字列には カタログ ( 使用するデータベース ) データソース (SQL Server の名前 ) 及び ユーザー ID( 接続の確立時に使用する有効なユーザー名 ) が含まれる 此の接続文字列は SQL Server データベースに接続する データソースの名前は Northwind データベースを含んで居る SQL Server の名前に変更する必要が有る ADO Connection オブジェクトは Northwind データベースに接続し Recordset オブジェクトは Northwind データベースの Products テーブルに接続する 此等の接続が確立されたら Recordset オブジェクトの Save メソッドを呼び出し データを XML と仕て保存する コードが示す様に Save メソッドはデータを XML と仕て保存する為に パラメータ adpersistxml を使用する 作成される XML ファイルは 主に 2 つのセクションに分かれる 最初のセクションにはデータの BizTalk スキーマが 2 番目のセクションには実際のデータが含まれる 此のファイルには 4 つの名前空間プレフィックスが使用される 最初の名前空間プレフィックスは データのスキーマ定義のプレフィックスに使用される s で有る 2 番目の名前空間プレフィックスは スキーマのデータ型定義に使用される dt で有る 3 番目の名前空間プレフィックスは ADO レコードセットのプロパティとメソッドを参照する rs で有る 然して 4 番目の名前空間プレフィックスは 実際のデータを参照する z で有る 此のコードは 次の Products.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'> <s:attributetype name='productid' rs:number='1'> <s:datatype dt:type='int' dt:maxlength='4' rs:precision='10' rs:fixedlength='true' rs:maybenull='false'/> <s:attributetype name='productname' rs:number='2' s:writeunknown='true'> <s:datatype dt:type='string' dt:maxlength='40' rs:maybenull='false'/> 2

<s:attributetype name='supplierid' rs:number='3' <s:datatype dt:type='int' dt:maxlength='4' rs:precision='10' <s:attributetype name='categoryid' rs:number='4' <s:datatype dt:type='int' dt:maxlength='4' rs:precision='10' <s:attributetype name='quantityperunit' rs:number='5' <s:datatype dt:type='string' dt:maxlength='20'/> <s:attributetype name='unitprice' rs:number='6' <s:datatype dt:type='i8' rs:dbtype='currency' dt:maxlength='8' rs:precision='19' <s:attributetype name='unitsinstock' rs:number='7' <s:datatype dt:type='i2' dt:maxlength='2' rs:precision='5' <s:attributetype name='unitsonorder' rs:number='8' <s:datatype dt:type='i2' dt:maxlength='2' rs:precision='5' <s:attributetype name='reorderlevel' rs:number='9' <s:datatype dt:type='i2' dt:maxlength='2' rs:precision='5' <s:attributetype name='discontinued' rs:number='10' rs:writeunknown='true'> <s:datatype dt:type='boolean' dt:maxlength='2' rs:fixedlength='true' rs:maybenull='false'/> <s:extends type='rs:rowbase'/> </s:elementtype> </s:schema> <rs:data> <z:row ProductID='1' ProductName='Chai' SupplierID='1' CategoryID='1' QuantityPerUnit='10 boxes x 20 bags' UnitPrice='18' UnitsInStock='39' UnitsOnOrder='0' ReorderLevel='10' Discontinued='False'/> 3

<z:row ProductID='2' ProductName='Chang' SupplierID='1' CategoryID='1' QuantityPerUnit='24-12 oz bottles' UnitPrice='19' UnitsInStock='17' UnitsOnOrder='40' ReorderLevel='25' Discontinued='False'/>... </rs:data> </xml> ADO 2.5 を使用する事で Northwind データベースの Products テーブルのスキーマとデータから成る XML ドキュメントが完成した ADO 2.5 の詳細に付いては Microsoft の Web サイトで MDAC (Microsoft Data Access Components )2.5 SDK を参照され度い 生成したデータを XML と仕て使用する為には データを変更しなければ成らない場合が有る 例えば 列名にスペースと謂った無効な文字が使用されて居る場合は 有効な XML 名に変更しなければ成らない 此の場合は name 属性を変更し フィールドの元の名前を持つ rs:name 属性を追加する 例えば データベースに ShipperName と謂う列が存在する場合 AttributeType は次の様に成る <s:attributetype name='shipper Name' rs:number='9' <s:datatype dt:type='i2' dt:maxlength='2' rs:precision='50' 此の AttributeType を 次の様に変更しなければ成らない <s:attributetype name='shippername' rs:name='shipper Name' rs:number='9' <s:datatype dt:type='i2' dt:maxlength='2' rs:precision='50' 此のドキュメントは Internet Explorer 5 に XML と仕て表示するか XSL ドキュメントを使って XHTML と謂ったフォーマットに変換する事が出来る 生成されるオリジナルファイルは 読み取り専用の ADO レコードセットの生成にしか利用出来ない クライアント側に更新可能な切断されたレコードセットを生成し度い場合は ElementType 定義に rs:updatable 属性を追加しなければ成らない クライアント側の切断されたレコードセットは 元のデータソースへの接続を持たない ユーザーは レコードセットの参照や 編集 削除 更新 レコードの追加を行う事が出来るが 変更をデータベースに保存するには データベースへの接続を再確立しなければ成らない 変更を保存するには 切断されたレコードセットをデータベースに再接続した後に ADO レコードセットの UpdateBatch メソッドを呼び出す UpdateBatch は 1 つの呼び出しで複数のレコードセット更新をサーバーに送信するメソッドで有る データを更新可能にするには ElementType の定義を次の様に変更する s:elementtype name='row' content='eltonly' rs:updatable='true'> 4

ADO 2.5 を使った XML と仕てのデータ入力 ADO 2.5 が生成する XML データの読み取りは データの出力と同じ様に簡単だ 次は ADO 2.5 を使って サンプルアプリケーションにデータを入力する方法に付いて観る事にする frmadoxml フォームに新しいコマンドボタンを追加し 名前を cmdretrieve に変更し キャプションに Retrive&Add を設定する cmdretrieve コマンドボタンの Click イベントハンドラに 次のコードを追加する Private Sub cmdretrieve_click() ' XML ファイルにレコードセットを開く objnwrecordset.open "C: Products.XML", Options:=adCmdFile ' 新しいレコードセットを追加する objnwrecordset.addnew objnwrecordset.fields("productname") = "Test" 此のコードを実行する前に 生成された XML ファイルのスキーマセクションに rs:updatable='true' 属性を追加しないと エラーが発生する Options を adcmdfile に設定すると ADO は データベースの代わりに通常のファイルからデータを取り出す物と認識する 新しいレコードの追加や レコードの編集 又は レコードの削除を行ったら ADO レコードセットの Update メソッドを呼び出さなければ成らない Update メソッドを呼び出す度に レコードセットの更新されたレコードにマークが付けられる 実際の変更を参照するには レコードセットを変更し 変更をファイルに保存する データベースに接続して居ない為 此等の変更はレコードセット丈に適用され データベースの実際のデータには適用されない データの変更 此れで データを XML と仕て保存し ADO を使って XML データを開く方法が解った 次は XML データを変更する方法に付いて調べて観る事にする 先ず 作成した Products.xml ファイルを開く為のコードを記述し 次にデータを変更する データを変更したら レコードセットの Update メソッドを呼び出す 変更が完了したら ProductsUpdate.xml と謂うファイルに新しいデータを保存する 先ず フォームに cmdmakechanges と謂う新しいコマンドボタンを追加し キャプションに Make Changes を設定する cmdmakechanges コマンドボタンの Click イベントハンドラに 次のコードを追加する Private Sub cmdmakechanges_click() ' XML ファイルにレコードセットを開く objnwrecordset.open "C: Products.XML", Options:=adCmdFile objnwrecordset.fields("productname") = "Test" objnwrecordset.update objnwrecordset.movelast 5

objnwrecordset.delete objnwrecordset.update objnwrecordset.filter = adfilterpendingrecords objnwrecordset.save "c: ProductsUpdate.xml", adpersistxml 先ず 最初のレコードの製品名を Test に変更し 最後のレコードを削除する 次に 変更したレコードを ProductUpdate.xml ファイルに保存する [ Make Changes ] コマンドボタンをクリックすると ProductUpdate.xml ファイルが次の様に変更されて居るのがわかる... <rs:update> <rs:original> <z:row ProductID='1' ProductName='Chai' SupplierID='1' CategoryID='1' QuantityPerUnit='10 boxes x 20 bags' UnitPrice='18' UnitsInStock='39' UnitsOnOrder='0' ReorderLevel='10' Discontinued='False'/> </rs:original> <z:row ProductName='Test'/> </rs:update>... <rs:delete> <z:row ProductID='77' ProductName='Original Frankfurter grune Sose' SupplierID='12' CategoryID='2' QuantityPerUnit='12 boxes' UnitPrice='13' UnitsInStock='32' UnitsOnOrder='0' ReorderLevel='15' Discontinued='False'/> </rs:delete> ADO は更新された XML ファイルを使って 編集されたフィールドの元の値と新しい値を持つレコードセットを再構築し 削除された行を突き止める 次は データソースを更新する方法に付いて調べて観る事にする データソースの更新データソースの更新 此れ迄に操作したデータは ローカルファイルにしか保存されて居ない 此のデータを元のデータソース ( 此の場合は Northwind データベース ) に保存しなければ成らない 更新されたデータを保存する為 フォームに cmdsaveupdate と謂う新しいコマンドボタンを追加し キャプションに Save Update を設定する cmdsaveupdate コマンドボタンの Click イベントハンドラに 次のコードを追加する Private Sub cmdsaveupdate_click() Dim objnwconnection As ADODB.Connection Dim objxmlrecordset As ADODB.Recordset Dim lngfieldcounter As Long Set objxmlrecordset = New ADODB.Recordset 6

Set objnwconnection = New ADODB.Connection objnwconnection.cursorlocation = aduseserver ' 次のステートメントの IES-FUJI を ' 適切なデータソースに置き換える必要がある objnwconnection.open _ "Provider=SQLOLEDB.1; Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "User ID=sa; Initial Catalog=Northwind; Data Source=IES-FUJI" objnwrecordset.cursorlocation = aduseserver objnwrecordset.cursortype = adopendynamic objnwrecordset.locktype = adlockpessimistic Set objnwrecordset.activeconnection = objnwconnection objxmlrecordset.open "C: ProductsUpdate.XML", Options:=adCmdFile objxmlrecordset.filter = adfilterpendingrecords Do Until objxmlrecordset.eof If objxmlrecordset.editmode<>adeditadd Then objnwrecordset.open _ "Select * From Products Where ProductID=" _ & objxmlrecordset.fields.item("productid").originalvalue If objxmlrecordset.editmode = adeditdelete Then ' 削除 objnwrecordset.delete Else ' 編集 For lngfieldcounter = 0 To objxmlrecordset.fields.count-1 ' 主キーは変更不可能 If UCase(objXMLRecordset.Fields.Item(lngFieldCounter).Name) _ <>"PRODUCTID " Then objnwrecordset.fields.item(lngfieldcounter).value =_ objxmlrecordset.fields.item(lngfieldcounter).value End If Next End If Else objnwrecordset.open _ "Select * From Products Where ProductID=" & 0 objnwrecordset.addnew ' 新しいレコードの追加 For lngfieldcounter=0 To objxmlrecordset.fields.count -1 ' productid の自動インクリメントフィールド If UCase(objXMLRecordset.Fields.Item(lngFieldCounter).Name) _ <>"PRODUCTID " Then objnwrecordset.fields.item(lngfieldcounter).value = _ objxmlrecordset.fields.item(lngfieldcounter).value End If Next End If 7

objnwrecordset.update objnwrecordset.close objxmlrecordset.movenext Loop 此の場合も Northwind データベースに接続する為に objnwconnection と謂う Connection オブジェクトを生成する 亦 ProductsUpdate.xml ファイルのデータを保持する為に objnwrecordset と謂う Recordset オブジェクトを生成する 先程のサンプルと同様に 此の場合もデータソースを構成して 接続文字列を変更しなければ成らない objnwrecordset は WHERE 句を持つ SELECT ステートメントを使って 更新するレコードへの参照を取得するのに使用する objxmlrecordset と謂うもう 1 つの Recordset オブジェクトは 追加 編集 又は 削除されたデータを持つ XML データの取り出しに使用する 亦 ADO データストリームから XML データを取り出す事も出来る objxmlrecordset レコードセットに保存されて居た XML データを取得したら 変更されたレコードと新しいレコード丈が検出される様に フィルタを適用する 次に objxmlrecordset の新しいレコード 又は 変更されたレコードを 1 件宛取り出し objnwrecordset を使って データベースから其のレコードを取り出す 変更の対象と成るレコード而巳を集めた後は AddNew Delete 又は Edit の内の 正しい操作を実行する事が出来る 先ず objxmlrecordset の EditMode プロパティを検査し 其のレコードに実行された操作を突き止め 正しい操作を実行する 切断された ADO レコードセットを使った経験が有れば ADO レコードセットの UpdateBatch メソッドを使用すると思ったかも知れない 残念乍ら XML を使って作成される切断された ADO レコードセットは データを取り出した元のテーブルへの参照を持たない 此の為 正しいデータベースに ADO 接続を確立し レコードセットの ActiveConnection プロパティに此の接続を設定したと仕ても レコードセットを正しいテーブルに接続する手段が無い レコードセットを正しいテーブルに接続出来ない為 UpdateBatch メソッドは機能しない 先程のサンプルからも解る様に 此処では objxmlrecordset 及び objnwrecordset と謂う 2 つの Recordset オブジェクトを生成した コードを簡潔に保つ為 此の章のサンプルにはエラー処理が含まれて居ない 何のプロダクションコードにも エラーハンドラは不可欠で有る 此のサンプルでは 変更の対象と成るレコードがデータベースに存在する事 他のユーザーに依って変更されて居ない事を確認しなければ成らない データの状態を確認するには フィールド毎に Recordset オブジェクトの PreviousValue プロパティを使用する PreviousValue プロパティは 変更される前のフィールドの値を提供する サンプルのコードには テーブル名とフィールド名を含んだクエリ文字列が使用されて居る 但し プロダクションコードでは テーブル名やフィールド名が変更された場合に定数の値を変更する丈で済む様に クエリ文字列には定数を使用する ストリームの処理 先程のサンプルでは 情報をデータファイルに保存した 此れは 殆どのアプリケーションに取って不適切で有る可能性が高い 此れに変わる方法は データを DOM オブジェクトに渡したり データを ASP Response オブジェクトでクライアントに返す為の データストリームを直接操作する事だ 次は ストリームを使って データを直接 DOM オブジェクトに挿入するサンプルを観る事にする 此のサンプルは テキストファイルからデータをロードし 其れを ADO Stream オブジェクトに配置する 次に データを DOM オブジェクトにロードする DOM オブジェクトにロードしたデータは XSL を使った変換 8

を含め 粗自由に操作する事が出来る データを ADO Stream オブジェクトに配置する為 フォームに cmdstream と謂う新しいコマンドボタンを追加し キャプションに Stream を設定する cmdstream コマンドボタンの Click イベントハンドラに 次のコードを追加する Private Sub cmdstream _Click() Dim objadostream As ADODB.Stream Dim objdom As DOMDocument Dim strxml As String Dim objnwconnection As ADODB.Connection Set objadostream = New ADODB.Stream Set objdom = New DOMDocument Set objnwconnection = New ADODB.Connection objnwconnection.cursorlocation = aduseclient ' 次のステートメントの IES-FUJI を ' 適切なデータソースに置き換える必要が有る objnwconnection.open _ "Provider=SQLOLEDB.1; Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "User ID=sa; Initial Catalog=Northwind; Data Source=IES-FUJI" objnwrecordset.cursorlocation = aduseclient objnwrecordset.cursortype = adopenstatic Set objnwrecordset.activeconnection = objnwconnection objnwrecordset.open "Products" objadostream.open objnwrecordset.save objadostream,adpersistxml strxml = objadostream.readtext objdom.loadxml strxml 他のサンプルと同様に 此のコードは ADO Connection オブジェクトと Recordset オブジェクトを生成する Northwind Traders データベースへの接続を確立し Products テーブルのデータをレコードセットに配置したら objadostream と謂う ADO Stream オブジェクトに XML データを保存する ADO Stream オブジェクトの情報を strxml と謂う文字列変数に代入し ドキュメントオブジェクトの loadxml メソッドを使って objdom と謂う DOM ドキュメントオブジェクトに XML データを配置する 要するに 通常のデータベースのデータを開いて 其れを XML と仕て DOM ドキュメントオブジェクトに渡して居る 此の様に ADO レコードセットは揮発性で有り クライアントとサーバーの両方で 分散アプリケーションの強力なデータアクセスコンポーネントの構築に利用する事が出来る 9