Special Review for Visual Tools

ActiveXサーバーフレームワークを実装するための
最新ビジュアル開発ツール

Visual InterDev

 開発コードInternet Studioとして知られたActive Server PagesプログラミングツールがVisual InterDEVと命名され,マイクロソフトのホームページで公開(日本語ベータ版)された.サーバーカーソルを使ったデータベースシステム開発をサポートするなど興味深い点は多いが,ActiveXスクリプトであるVisual Basic Scriptによるサーバーブログラミングを実現している点がVisual Basicユーザーには注目されるだろう.
 本稿でははActive Server Pagesのデータベースプログラミングに焦点を当て,Visual InterDevが提供するWeb-DBプログラミングソリューションについて解説する.

 

秋月 巌, AKIZUKI, Iwao

●Microsoftのプロダクト

 さまざまな場面でMicrosoftのプロダクトを扱っていて思うのは,Microsoft製品が1番だと感じられるジャンルが少ないことである.ほとんどすべてのカテゴリーでの覇権をねらうMicrosoftは,多くの種類の製品を出しているが,どの分野においても製品のできは2番手に甘んじる.
 開発ツールにしても例外ではない.拡張性の問題を別にすれば,Visual BasicよりもDelphiの方が1バージョン分先んじているのは衆知のことだし,Microsoft ACCESSにしてもBorland PARADOXの先進性に及ぶものではない.もっとも,多岐にわたる分野で水準に達した製品を揃えられるのが,Microsoftの底力だということはできる.
 今回,ベータ配布が開始されたVisual InterDevが,このジャンルの製品としてどのレベルに位置づけられるのか,ライバル製品が揃わない現状ではまだわからない.ただ,この製品の持つ可能性について私は多くの期待をしている.Internetを使ったDatabaseシステムを構築する開発者が要求するソリューションを,まだ未完成ながら用意しているからである.これだけの期待を感じさせる製品は,今のところSymantecが開発を進めているDBAnywhere(JDBCを使ったJAVAによるデータベース環境)以外に思い当たらない.

●Internet Studio = Visual InterDev

 Visual InterDevがMicrosoftの新しい開発ツールだと紹介されて,初めて聞く名前だと思う方も多いだろう.これは開発コードInternet Studioとしてメディアなどで紹介されていたツールの製品名である.
 Visual InterDevについて説明する前に開発コード“DENALI”として公表わされていたActive Server Pagesについて説明する必要がある.Visual InterDevはActive Server Pagesによるシステムを開発するための製品だからである.Active Server PagesはActiveX Server Frame Workに属するテクノロジーで,サーバー側でのプログラミング処理を可能にするための仕掛けである.JAVAやActiveXコントロールが動的にダウンロードされクライアントで実行されるのに対し,サーバー側で動作するActive Server Pagesは,クライアントの要求に従って動的に生成したHTMLページをクライアントに送り返すことで,プログラムの実行をおこなう.

●ActiveX Server Frame Workの特徴

 JAVAで作られたアプレットが,単にWebで自動的に配布されるアプリケーションとして扱われることが多いのに対し,Active Server Pagesは最初からクライアントとサーバーの交信を前提として作成される.また,特殊なクライアント処理が必要ないため,HTMLの表示さえできればクライアントのブラウザを選ばない.ただし,ひとつのプログラムトランザクションを実行するたびにサーバーとの交信が必要になるため,ローカルのCPUで処理されるJAVAやVisual Basic Scriptのクライアントワークに比べてレスポンスは悪くなる.
 スクリーン表示以外の処理をすべてサーバーで処理するServer Frame Workは,純粋な3階層システムとして動作する.これはアプリケーションパーティショニングが要求される,これからのシステム構築においては利点となる.
 プログラム開発言語としてはActiveXスクリプトであるVisual Basic Scriptか,Java Scriptを用いる.Visual Basicユーザーならば,迷わずVisual Basic Scriptを選ぶべきであろう.Visual Basic ScriptはVisual Basic for Applicationのサブセットバージョンであり,Visual Basicで学んだ知識のほとんどがそのまま役に立つ.データ型がバリアント型に限られるなど多くの制約があるが,Visual Basic Scriptを使っていると,BASIC言語を使用したプログラミングとは,本来このようにシンプルであるべきだという印象をうける.Visual Basic ScriptのスーパーセットであるVisual Basic(for Windows)はあるゆるWindowsプログラムが作成できるように拡張された言語セットを用いるが,BASICの言語仕様にその任は重過ぎるのだろう.

●C/Sデータベース環境としてのActive Server Pages

 Active Server Pagesが開発者にとって魅力的なのは,データベースアクセスをネイティブでサポートしている点である.データベースサポートによってVisual Basic4.0がVisual Basic2.0よりも実用的になったのと同様,企業ユーザーにとって,これは大きな意味を持つ.イントラネットデータベースシステムは,そのまま,インターネットデータベースシステムへ拡張できるという意味においてWAN対応データベースシステムだからである.
 最近各社が開発を進めている,JDBCによるインターネットDBシステムとの違いは,Active Server Pagesは他のミドルウェアに依存せずにページベースでインターネットサーバーと交信する点である.つまり,HTMLのFormタグのActionオプションに指定されたオブジェクトに,Formオブジェクトが保有する値を送信し,それをきっかけに生成されたページをブラウザで受信するのが,Active Server Pagesを使ったネットワークプログラミングのスタイルである.

●Web-DBシステム

 Web-DBシステムの実装について,私は今ままでに本誌でIDC,OLEISAPI,CGI(アウトオブプロセス)と紹介してきた.そのどれもがあまりに制約が多く問題が多いが,私自身は現場でIDCを多用してきた.
 IDCの最大の問題点は,プログラミング言語としてSQLとその拡張仕様しか使えない点である.MS SQLserverの場合,OLEオートメーションストアドプロシージャを使う方法があるが,これはあまりメジャーな方法ではない.また,JETデータベースエンジンのようにストアドブロシージャをサポートしない製品を使う場合,単にSQL文による照会とその結果の受信しかできなかった.
 それにHTMLファイル,クエリーファイル(IDC),テンプレートファイル(HTX),それにストアドプロシージャと,管理しなければならないオブジェクトがトランザクション単位で増え続け,それを管理する方法が提供されないのも問題だった.

●データアクセスのための新しいオブジェクトADO

 ADO(Advanced Data Object)と呼ばれる新しいデータオブジェクトモデルは,使い慣れたDAOやRDOのプログラミングインターフェイスとの互換性を維持しながら,サーバー上で洗練されたサーバーカーソルを実現する.  リスト1(YUBIN.ASP)はActive Server Pagesを使ったデータベースプログラミングのサンプルである.前号でCGIの解説で使ったものと同様,郵便番号を入力すると該当する地名が結果として表示されるシンプルなデータベースアプリケーションである(図1,図2).
 このファイルのような“.ASP”という拡張子を持つファイルが呼ばれるとActive Serverはアクティブなページが呼ばれたと判断し,サーバー側での処理を実施してからHTMLソースをクライアントに送り返す.サンプルコードをブラウザで表示したのが図1であり,それを「ソースで表示」を選択して表示したソースがリスト2である.処理を記述したVisual Basic Scriptコードは削除されてHTMLページとしてクライアントに応答しているのがわかる.しかし,このページからフォーム情報が送信されれば,サーバーは即座にオリジナルファイルに記述してあるプログラム処理を実行する.
 コードには検索ページを表示するためののHTML,処理を記述したVisual Basic Scriptコード,それに結果を表示するためのテンプレートファイルが混在している.これらを分割して作成しドキュメント内にインクルードすることもできる.それにより,ひとつのルーチンを複数のASPファイルから呼び出すことが可能となる.

リスト1:YUBIN.ASPサンプルオリジナルコード
<HTML> <BODY> <FORM METHOD="Post" ACTION="YUBIN.ASP"> <input type="hidden" name="testpage" value="True"> <input type="Text" name="yubinno"> <input type="submit" Value="郵便番号検索"> </FORM> <% If Request.Form("testpage") = "True" then Set dbConnection = ⇒Server.CreateObject("ADODB.Connection") dbConnection.Open "ADOtest" SQLQuery = "SELECT * FROM yubin" + " ⇒WHERE zipcode = '" + Request.Form("yubinno") + "'" Set rsYubin = dbConnection.Execute(SQLQuery) %> <% Do While Not rsYubin.EOF %> <% = rsYubin("zipcode") %>  <% = rsYubin("address") %> <BR> <% rsYubin.MoveNext Loop %> <%End if%> </BODY> </HTML>

図1:検索画面

リスト2:YUBIN.ASPをブラウザでビューしたときのコード
<HTML> <BODY> <FORM METHOD="Post" ACTION="YUBIN.ASP"> <input type="hidden" name="testpage" value="True"> <input type="Text" name="yubinno"> <input type="submit" Value="郵便番号検索"> </FORM> </BODY> </HTML>

図2:結果表示

●ASPファイル内のHTML

 リスト1の以下の部分は検索画面を表示するHTMLパートである.

<FORM METHOD="Post" ACTION="YUBIN.ASP"> <input type="hidden" name="testpage" value="True"> <input type="Text" name="yubinno"> <input type="submit" Value="郵便番号検索"> </FORM>  郵便番号を入力するためのテキストボックスとSubmitボタンが配置されている.FORMタグのACTIONオプションに自分自身であるYUBIN.ASPファイルが指定されているのがポイントである.テキストボックスに入力され,サブミットボタンがクリックされると,ブラウザはサーバーに対しテキストボックスの値とHIDDEN属性が指定されているtastpageに保持された“True”を引数としてYUBIN.ASPを要求する.それに応答してサーバーが,YUBIN.ASPファイルをテンプレートとして結果となるHTMLページを作成したのがリスト3(図2)である.もちろん,テンプレートファイルには別のファイルを指定することもできる.

リスト3:YUBIN.ASPから検索を実行して応答されたコード
<HTML> <BODY> <FORM METHOD="Post" ACTION="YUBIN.ASP"> <input type="hidden" name="testpage" value="True"> <input type="Text" name="yubinno"> <input type="submit" Value="郵便番号検索"> </FORM> 223  神奈川県横浜市港北区下田町 <BR> 223  神奈川県横浜市港北区新吉田町 <BR> 223  神奈川県横浜市港北区高田町 <BR> 223  神奈川県横浜市港北区綱島上町 <BR> 223  神奈川県横浜市港北区綱島台 <BR> 223  神奈川県横浜市港北区綱島東 <BR> 223  神奈川県横浜市港北区綱島西 <BR> 223  神奈川県横浜市港北区新羽町 <BR> 223  神奈川県横浜市港北区日吉 <BR> 223  神奈川県横浜市港北区日吉本町 <BR> 223  神奈川県横浜市港北区箕輪町 <BR> </BODY> </HTML>

●Visual Basic Scriptデータベースプログラミング

 Visual Basic Scriptコードである次の部分はVisual BasicによるDAOプログラミングを知る人には見慣れた構文であるはずである.

<% If Request.Form("testpage") = _ "True" then Set dbConnection = Server.CreateObject _ ("ADODB.Connection") dbConnection.Open "ADOtest" SQLQuery = "SELECT * FROM yubin" + " _ WHERE zipcode = '" + Request.Form("yubinno") + "'" Set rsYubin = dbConnection.Execute(SQLQuery) %>  CreateObjectメソッドを使ってADOオブジェクトを作成し,OPENメソッドでODBCのデータソースネームを指定している.次の行以降では,フォームから送信された検索条件をWHERE句に設定したSelect文(SQL)を生成し,Executeメソッドを使用して実行する.

●結果表示のためのテンプレート

 検索結果表示用のテンプレートに相当する次の部分はVisual Basic ScriptコードとHTMLタグが混在している.

<% Do While Not rsYubin.EOF %> <% = rsYubin("zipcode") %>  <% = rsYubin("address") %> <BR> <% rsYubin.MoveNext Loop %> <%End if%>  MoveNextによってレコードポインターを移動しながら,Do Whileループによって最後のレコードまで結果セットの値を取り出している.
 結果データを表示するためには次の構文を利用する.

<% = 表示する値 %>  このタグで指定された変数や関数の内容はHTMLにそのまま出力される.Visual Basic ScriptコードはHTML内に記述でき,出力が指定された部分にデータを表示する.Do Whileで囲まれた範囲に書かれたHTMLタグやテキストはループが実行された回数だけ繰り返し使われるので,テーブル等を組んでデータの表示を整形することもできる.
 検索の結果として返されるのがリスト3である.このリストは標準HTMLに準拠しているのがわかるだろう.このページも最初の検索画面同様,標準のHTMLで作成されている.検索結果を表示しているこのフォームから検索条件を送信すれば,再度検索を実行する.

●Visual InterDevのメリット

 Visual InterDevはActive Server Pagesを作成するための開発ツールである.Visualという言葉からわかるようにMicrosoftではVisual開発ツールのひとつとして位置づけている.
 サンプルコードをVisual InterDevで編集しているのが,図3である.コード内のタグや,Visual Basic Scriptコード部が色分けされて表示される.

図3:サンプルプログラムをVisual InterDevで編集

 もっとも,それだけのことならばVisual Basicの簡単なプログラムをエディタだけで作成できるように,この場合もテキストエディタで代用がきく.Visual InterDevが真価を発揮するのはデザインタイムコントロールを使用するときである(図4,図5).たとえばVisual InterDevに付属するDATA RANGE FOOTERコントロールをHTMLに埋め込むことを指定するだけで,リスト4(記事末参照)のようなコードをVisual InterDevは生成する.このコードでは行単位のレコード移動ばかりでなく,ページ単位のスクロールもサポートしている.この機能の実装は従来のWEB-DBシステムでは困難だった。これはHTTPがセッションの管理をするのに適さなかったため,サーバーカーソルの使用が難しかったからである.

図4:Visual IterDev(ベータ)に付属するデザインタイムActiveXコントロール

図5:デザインタイムActiveXコントロールを埋め込む

 また,ページの単位のデータ取得ができないからといって,まとめて全データを要求すると,ブラウザのタグ処理の速度が遅くて表示に時間がかかることもWeb-DBシステムの問題点だった.デザインタイムコントロールを使ってセッションの管理やサーバーカーソル制御をすれば,これらの問題は解決する.しかも,これらの機能はMicrosoft SQL ServerのようなSQLデータベースだけでなく,JETデータベースエンジンのようにSQLとODBCをサポートしているファイル共有型のデータベースエンジンでも使用できる.これは安価なファイル共有型データベースエンジンを,真のクライアント/サーバーーシステムとして活用するのに有効な方法である.高度なフォールトレラントが要求されずデータボリュームが大きくないActive Serevr Pagesデータベースシステムならば,JETデータベースエンジンや,Borland Database Engineで十分である.これらの製品は低価格であるというだけでなく,はるかに安いメンテナンスコストでの運用を可能にする.

●リリース版への期待

 まだ,十分な評価をしたわけでないが,Visual InterDEVは期待すべきツールである.少なくとも今までに難しかった問題の解決方法を提供している.だが,このプロダクトは,まだベータ版でしかない.これが真に実用的な開発環境になるためには,安定性の確保という重大な課題が残されている.また,Internet Explorerに内蔵されたVisual Basic Script実行モジュールの障害の多さも看過できない問題である.
 もっとも,インターネットのような不安定な環境上で使うならば,それらの問題も少しはマスクされることになる.
 また,Visual InterDEVはIIS3.0が使えない環境でも,Visual InterDevがActive Serevr Pagesエミュレーション環境を実現する.
 日本向けの製品版を今年の春に発売とマイクロソフト株式会社はアナウンスしている.現在日本のマイクロソフトサイトにおいてベータ版のダウンロードが可能である(http://www.microsoft.co.jp).私が手にしたレビジョンではサンプルファイルのインストールはできなかった.英語版サンプルプログラムはUSのサイトからダウンロードできる.このページへも日本のサイトからリンクが張られている.
(付録CD-ROMの\VIDディレクトリに“Internet Studio”Beta版を収録しています:編集部)

リスト4:DATA RANGE FOOTERコントロール埋め込み時に
    Visual InterDevが生成したHTMLとVisual Basic Scriptコード
<!--METADATA TYPE="DesignerControl" startspan <OBJECT ID="DataRangeFtr1" WIDTH=151 HEIGHT=24 CLASSID="CLSID:F602E722-A281-11CF-A5B7-0080C73AAC7E"> <PARAM NAME="_Version" VALUE="65536"> <PARAM NAME="_ExtentX" VALUE="3969"> <PARAM NAME="_ExtentY" VALUE="635"> <PARAM NAME="_StockProps" VALUE="0"> </OBJECT> --> <% Loop If tRangeType = "Table" Then Response.Write("</TABLE>") If tPageSize > 0 Then %> <HR> <% If Not fHideNavBar Then %> <TABLE WIDTH=100% > <TR> <TD WIDTH=100% > <P ALIGN=<%= tBarAlignment%> > <FORM ACTION="<%= Request.ServerVariables("PATH_INFO") & stQueryString%>" METHOD="POST"> <INPUT TYPE="Submit" NAME="PagingMove" VALUE=" << "> <INPUT TYPE="Submit" NAME="PagingMove" VALUE=" < "> <INPUT TYPE="Submit" NAME="PagingMove" VALUE=" > "> <INPUT TYPE="Submit" NAME="PagingMove" VALUE=" >> "> <% If Not fHideRequery Then %> <INPUT TYPE="Submit" NAME="PagingMove" VALUE=" Requery "> <% End If %> <INPUT TYPE="Hidden" NAME="PagingRequest" VALUE="<%= tHeaderName%>"> </FORM> </P> </TD> <TD VALIGN=MIDDLE ALIGN=RIGHT> <FONT SIZE=2> <% If Not fHideNumber Then If tPageSize > 1 Then Response.Write("<NOBR>ページ : " & Session(tHeaderName & "AbsolutePage") & "</NOBR>") Else Response.Write("<NOBR>レコード : " & Session(tHeaderName & "AbsolutePage") & "</NOBR>") End If End If %> </FONT> </TD> </TR> </TABLE> <% End If fHideNavBar = False fHideNumber = False stQueryString = "" End If %> <!--METADATA TYPE="DesignerControl" endspan-->


  VB Magazine ライブラリ | Visual Basicコースホームページ
int21 ホームページ | PCDN ホームページ



Copyright (c) 1997 AKIZUKI, Iwao All Rights Reserved.
For questions or comments, please send mail to: pcdn@int21.co.jp