特集:クライアント/サーバーシステムとイントラネット

秋月 巌 AKIZUKI, Iwao
首都圏コンピューター技術者共同組合


Webシステムの普及にともない,Internet ServerとDBの連携システムの需要が急速に高まってきている.システムのロジック部分のすべてをサーバーサイドで処理するWeb-DBシステムは,純粋な3階層システムである.ここでは,Microsoft Internet Information serverの一機能として提供されているIDCによるデータベースプログラミングの入門と実践を紹介する.

Microsoftのインターネット戦略

 PC関係の雑誌を愛読している方ならば,ここ2〜3ヶ月の間に「Microsoftのインターネット戦略」という言葉を何度目にしたか,数え切れないだろう.本誌の読者のようなデベロッパーの方達が,隔月刊の本誌以外に読まないなどとは考えられないのだから尚更である.
 だから,細かいことは抜きにしよう.JAVA連合vs Microsoftの覇権争いについてはあまた報道されている.ActiveX PDC(Professional Developers Conference)で,MicrosoftはActiveXとJAVAが対立するものではないと強調していた.これはWindowsはC++と対立するものではないといっているようなものだ.ActiveXはプロジェクトの総称のようなものだし,JAVAは一介の言語なのだから,比較することに無理はある.しかし,ActiveXがJAVAを受容していることをもってそういうならば,OLEとOpenDocだって対立する規格でないということになる.
 ActiveXとJAVAの技術的な優位について比較をするのは,今後の流れを予測する上であまり意味がない,と筆者は判断している.いくらかのはっきりした事柄から推測するだけで,将来の像は浮かんでくる.
 すでに,明確なことは次の3つである.

 1,2のどちらにも異論はあるだろう.だが,色眼鏡をはずして判断するならば,これらはすでに動かしようのない事実だといえる.しかし,2には少し言い加えておいた方がいいかもしれない.「Microsoftは今や世界のトップクラスの開発資金をもっている」
 これらの条件から,導き出される結論は次のようなものである.

 Microsoft自身,JAVAのサポートを決断した時点で,従来のような覇権路線を進もうとは考えていなかったはずである.既得権に執着しない,この判断はまさに的確といわざるを得ない.AppleやIBMと同じ轍は踏まないのである.
 この辺りの立場はDOS/Vが台頭を始めたころの,NECの立場に似ている.NECは寡占状態を失ったが,市場の流れに素早く対応し,現在でも首位のシェアを維持したまま,売り上げを伸ばしている.
 本誌の読者ならば,JAVAの台頭よりも,ActiveXコントロール+VBSの普及を願っているかもしれない.これらは共存すべきものであり,共存可能であり,実際に共存していくだろう.一つの環境で一つの開発言語しか使えないならば,インターネットプログラミングは貧しいものになるに違いない.現在のWindowsプログラミング環境でVisualBasicとC++(それにDelphi)が共存しているように,インターネットプログラミングでも,JAVA(アプレット)とC++(ActiveX control),それにVBSとJAVAスクリプトが共存していくことになる.これら,二つのグループはコンポーネント作成言語と,コンポーネント操作言語という二つの役割に別れていく.何のことはない,結局は今と何もかわらない.プログラムの実行環境が,Windows上から,ブラウザ上に移行するだけのことである.
 そしてMicrosoftがアナウンスしているように,Visual BasicがActiveX開発環境を提供できるようになるならば, Visual BasicデベロッパーはVisual Basicの学習範囲を拡大していくだけで,スケラーブルなデベロッパーになれることになる.
 楽観的かもしれないが,今後のPCの流れは,皆にとって都合のいい方向に向かうのではないだろうか.PCが世界を変えるならば,よりよい方向に変えていくのが関係者の努めだろう.そのためにインターネットの普及は良い機会だといえる.

インターネットとデータベース

 インターネットは,データベースと連携することで,秩序立ったデータストアの方法を身につけることになる.HTML(Hyper Text Markup Language)のような非定型文書の集まりではなく,コンピュータにとって扱いやすい(検索のはやい)形でデータを処理することが可能となるのだ.Visual Basicがデータベースをサポートすることで飛躍的に進歩したのと同じ理屈である.HTMLは情報の格納というよりも,インターフェイスの提供が主な役割となる.
 WWWブラウザは基本的にはHTMLドキュメントブラウザだから,動的なインターフェイスの作成にはむいてない.この問題を将来的に解消するのが,JAVAでありActiveXコントロール+VBSなのである.しかし,現時点でもっとも有効なのはサーバー側でHTMLを動的に生成してブラウザに結果を返す方法である.
 今回紹介するIDC(Internet Database Connector)プログラミングも,この方法に属する.これはまさに純粋な3階層システムである.すべての処理をサーバー側で処理し,クライアントはその結果の表示と,ユーザーアクションだけをサーバーに送る.この方式を「サーバーインクルード方式」と呼ぶことにする.
 サーバーインクルード方式は不特定多数のユーザーに対しても,プログラムは常に一つだけだから,保守性は極めて高い.この方法の最大の問題点はアクセスが集中したときに,サーバーの負荷が大きいことである.

JAVAとActiveXコントロール+VBS

 そこで,実行時にプログラムを動的にロードして走らせるようにしたのが,JAVAやActiveXコントロール+VBSによるプログラミングである.これらはメンテナンスという意味では,サーバーインクルード方式と同様のメリット持つ.サーバーインクルード方式との最大の違いは,プログラムの実行処理を,クライアントでおこなうことである.時代の流れとしては,クライアントに負荷を分散させる方向に向かうだろう.サーバーで処理するためには,常に最大のアクセスに対して,サーバーの能力を確保しておくことが必要になるからである.それでも,ブラウザの対応が進んでいない現在では,サーバーサイドで処理をするのが現実的といえる.

IDCプログラミング

 IDCは,MicrosoftがIIS(Internet Information Server)に添付しているインターネット用データアクセスモジュールである.このモジュールはIISのAPIであるISAPIをコールすることによって,機能をインプリメントしている.IDCによるデータベースアクセスはIISのヘルプにもサンプルや説明が添付されているので,ご覧になったことがある方もいるだろう.また,日本のMicrosoftのサイト内で入力画面を持ったページは,大抵,IDCを使ってユーザーが送信した情報をデータベースにストアしている.

図1:IISのヘルプ

 多くのベンダーが次々にインターネットサーバーとデータベースの接続規約を発表するなかで,ODBCを利用したIDCは,早い時期に実用的なソリューションを提供したといえる.今の時点では多くの制約があるが,プログラミングがシンプルで,動作が安定している点では評価を与えてもいいだろう.
 CGI(Common Gateway Interface)を用いたプログラミングと違い,ISAPI(Internet Server API)アプリケーションはマルチスレッドで動作する.そのため,同時にリクエストがきた場合でも,複数のプロセスを起動しない.これは,多くのアクセスが予想されるサイトや,多数のクライアントを接続したイントラネット上では強みになる.
 IDCプログラミングといっても,IDCの機能はSQL文をODBC経由でSQLデータベースにパススルーし,戻ってきた値をHTMLファイルとして動的に生成するというだけの仕組みである.それゆえ,当然のことながら,プログラミングにはSQLとHTMLの知識が必要となる.また,接続の設定をするためにはODBCによる設定を理解することが前提となる.とはいっても,後者は問題にはならないだろう.たとえばMS SQLseverと接続する場合,MS SQLserverの設定がきちんとできていれば,ODBCで設定しなければならない項目は,サーバーマシン名とデータベース名の2つだけである(図2).
 IDCプログラミングは,JAVAやActiveXコントロールなどのインターフェイスコンポーネントと組み合わせたときに,更に威力を発揮する.たとえば,そういったコンポーネントを使わない今回の例では,入力された値が数字かどうかをチェックするためだけでも,サーバーにデータを送り,ストアドプロシージャでエラーメッセージを返している.このような処理をクライアント側で処理すれば,レスポンスははるかに向上することになる.
 現在のIDCの仕様は,ある程度過度的なものだということができる.今の時点では,インターフェイスの操作にいたるまで,すべてをIDCを経由したSQL文とHTMLタグによって記述する.やがては,インターフェイス周りも,もっと実用的なコンポーネントを活用していくことになる.その時でもMS IISを使っている限りは,データベース周りはIDCを使うことになるだろう.

図2:IDCによるデータベースアクセス例

簡単なIDCプログラミング その1

 IDCによるプログラミングを理解するために簡単な例をあげてみよう.リスト1,2,3はテキスト形式のファイルとして,インターネットサーバーマシン上の同じデイレクトリに存在するとする.
 リスト1のHTMLファイルをHTTP経由で受け取り,ブラウザに表示したのが,図3である.このページから下線の部分の「社員名簿」をクリックすれば, ODBCでEmployeeDBというデータソース名で設定されたデータベースに,リスト2のIDCファイルの内容を送り,Employeeテーブルを作成する.結果としてTemplateで指定されたHTXファイルCREATE.HTX(リスト3)をクライアントに表示する.このケースでは,CREATE.HTXファイルにテンプレートタグを設定していないので,動的なHTMLファイルの生成はおこなわない. CREATE.HTXファイルに記述された内容が,そのまま,HTMLファイルとして,ユーザーにバックされる.
 IDCファイルの内容が,SQL文そのままであることに気づかれるだろう.ただ,改行時,行頭に「+」記号を記述することを忘れてはいけない.このSQL文は+記号やダブルクォーテーションが除去された形で,そのままDBに送られる.ストアドプロシージャの使用も可能だし,SQLが拡張されているDBならば,拡張SQLも記述できる.また,単一のSQL文だけでなく,複数の記述もできるので,DBサイドがサポートさえしていれば,IF文等の制御文を使うこともできる.
 当然のことだが,これらの処理はHTTPサービスを通してでなければおこなえない.ブラウザの「ファイルを開く」メニューから,HTMLファイルを開いた場合は,IDCファイルを呼び出した時点で,エラーが発生する.

図3:リスト1をブラウザで表示

リスト1:CREATE.IDCを呼び出すHTMLファイル
<HTML> <HEAD><TITLE>テーブル作成</TITLE></HEAD> <BODY> <A HREF=CREATE.IDC?>社員名簿</A>の作成 </BODY> </HTML>

リスト2:CREATE.IDC
Datasource: EmployeeDB
Username: sa
Password:
Template: CREATE.HTX
SQLStatement:
+CREATE TABLE "Employee" (
+"Name" varchar(10), 
+"Section" varchar(10) )

リスト3:CREATE.HTX
<HTML> <HEAD><TITLE>テーブル作成完了</TITLE></HEAD>  <BODY>   社員テーブル作成完了しました.  </BODY> </HTML>

簡単なIDCプログラミング その2

 今度はパラメータと,結果セットの表示機能を持ったプログラムを紹介する(リスト4〜6).この例ではパラメータを元にデータの検索をおこない,結果をクライアントに表示する.
 IDCファイル内に '%SectionName%'というパラメータの記述があるのが,前の例と違う部分である.HTMLでIDCにわたされたパラメータをここで検索条件として用いる.シングルクォーテーションで囲まれているが,これを省略すると文字列ではなく,数字として判断される.だが,この例のようにHTML内でパラメータが記述されるような場合はともかく,Input Boxでユーザーに入力させるような場面では,この方法はおすすめできない.なぜなら,もし,ユーザーが文字列を入力して送信したりすれば,システムがデフォルトで表示する難解なエラーメッセージがユーザーの目にふれるからである.
 その場合にはJAVAやActiveX+VBSなどで,チェックルーティンを作成するか,あるいは一旦文字列として受けつけておいてから,IDCファイル内,またはDBのストアドプロシージャで数字に変換することである.もし,数字に変換できないような文字列だったなら,HTXファイルを使って,エラーメッセージを表示させればいい.
 LIST.HTXファイルには,SQLデータベースサーバーが返した値を表示するためのタグが記述されている.EmployeeテーブルはSectionとNameフィールドの該当する結果セットを返す.値は%記号で囲まれた同名の項目に代入され,動的に作成されたHTMLファイルをユーザーのブラウザに表示する.
<%begindetail%> <%enddetail%>タグに注目してほしい.この2つのタグに囲まれた部分は結果セットのレコード数だけくりかえされる.結果として表示されるのが,図5である.

リスト4:LIST.IDCを呼び出すHTMLファイル ( LIST.HTM )
<HTML> <HEAD><TITLE>社員名簿</TITLE></HEAD> <BODY> <A HREF=LIST.IDC?SectionName=総務>-総務-</A>    <A HREF=LIST.IDC?SectionName=経理>-経理-</A><BR> </BODY> </HTML>

リスト5:検索を実行し,結果をHTXファイルを使って表示するIDC ( LIST.IDC )
Datasource: EmployeeDB Username: sa Password: Template: LIST.HTX SQLStatement: +SELECT * FROM "Employee" +WHERE Section='%SectionName%'

リスト6:LIST.IDCが返したデータを表示するテンプレート ( LIST.HTX )
<HTML> <HEAD><TITLE>社員名簿</TITLE></HEAD> <BODY> <%Section%><BR> <HR> <%begindetail%> <%Name%><BR>     <HR> <%enddetail%> </BODY> </HTML>

図4:検索ページ ( LIST.HTM )

図5:検索結果の表示 ( LIST.HTXをテンプレートにして,LIST.IDCが動的に作成 )

実用的なIDCプログラムのサンプル

 実用的なサンプルとして,Microsoft株式会社のホームページにあるSQLserverのデモプログラムを紹介しよう.実際の動作はホームページをアクセスして,確認していただきたい.
 サンプルデモ「美な味for Internet」はインターネット上の受発注システムである.このシステム上ではユーザーはインターネット上で次のことができる.

 このように,データベースアプリケーションに必要な処理は一通りできる.セッション管理ができないインターネットにおいて,データの変更と削除ができるのが特徴となっている.ページが変わるたびに現れるブラウザ上部のURLを見れば,常にCode_clientというパラーメータがわたされていることに気づくだろう.このパラメータをセッションIDとして利用し,更新や削除処理を実現している.
 システム全部の解説をするのは無理なので,最初のログインページ(図6)から,顧客IDを使ってログインするまでのソースコードを掲載する(リスト7〜11).一部,デザインに未完成な部分があるが,機能面はほとんどインプリメントされている.ここまでの解説とHTML,それにMS SQLserverの拡張SQLであるTransact SQLの知識があれば理解できるはずである.
 この例ではIDCファイルからストアドプロシージャを呼び出している.ストアドプロシージャの内容をIDCファイル内に記述することも可能だが,複雑な処理をおこなう場合は,構文解析を事前に処理できるストアドプロシージャの方が有利となる.
 ストアドプロシージャ( sql_login )でおこなっている処理は次のようなものである.
 ストアドプロシージャが返した値をもとに,CATEGORY.HTXをテンプレートとして,カテゴリ一覧ページを動的に生成する.
 IDCの現行バージョンの制限事項で,一つの結果セット(一つのレコードではない)の処理しかおこなえない.そのため,顧客IDや,顧客名のように一つしか必要がないデータまで,カテゴリ一覧のレコード数だけ,データとしてテンプレートファイルにわたしている.テンプレートファイル中の<%begindetail%> <%enddetail%>タグを使って,必要な回数しか表示しないように調整している.
 マスター詳細フォームを作成するには,このようにマスター部と詳細部のデータを一つの表としてわたさなければならない.
 また,テンプレートファイル中で,<%enddetail%>以降に埋め込んだ変数の処理はおこなわないようである.つまり,表の後にクエリーの結果を表示することはできない.伝票のように最後に合計を表示したいような場合でも,表よりも上に表示しなければならない.このあたりは,次のバージョンでの改善を望むしかない.
 ストアドプロシージャ内のエラーメッセージ部分に,HTMLタグが記述されていることに注意してほしい.IDCはHTXファイルの指定部分に機械的にテキストを挿入していくだけなので,IDCでタグを表現するテキストを返せば,ブラウザに読み込むときにはタグと判断して取り扱う.
 だから,HTXに一行だけ変数を埋め込んでおき,そこにHTML文をそっくりはめ込むという芸当も可能である.HTML自身をデータベースで管理し,ユーザーの要求にしたがって随時生成するというようなサイト管理方法ができるわけである.

最後に

 IDCによるインターネットデータベースプログラミングは,まだ,最高のパワーを持つわけではないが,業務を選べば十分に実用になる.ISAPIアプリケーションであるIDCはCGIプログラムではないので,サーバーの高負荷時に威力を発揮する.同時アクセス数が増えた場合,一つのプロセス内で一定量までスレッドを生成し,それを越えた場合はキューにポストしていく.CGIのようにむやみにプロセス数を増やさないことは,管理者に大きな安心を与えるだろう.
 また,急速に発展しているインターネットプログラミング環境と組み合わせることで,より柔軟なシステムの構築が期待できる.
 IDCプログラミングは,データサービス,ビジネスロジック,ユーザーサービスが明確に分離した,完成された3階層システムである.しかし,将来はその形を柔軟に変化させていくことで発展していくことになるはずである.3階層アーキテクチャはすぐれたアーキテクチャだが,システムのすべてに適応するものではない.
 IDCの普及は,インターネットサーバーとして,どれだけNTが使用されるかにかかっている.IISは高速で安定しているが,UNIXインターネットサーバーの市場に,どれだけ食い込んでいけるかは,今後の経過を見守るしかない.

***

なお,参考までに,当方ではIISとデータベースの連携システムについてコンサルティング業務も受けつけている.iwao@scan-net.or.jpまでお問い合わせいただきたい.

図6:「美な味for Internet」ログイン画面 ( LOGIN.HTM )

リスト7:ログインページ ( LOGINB.HTM )
注:誌面の都合で折り返している行があります
<HTML> <HEAD> <TITLE>美な味 for Intenert</TITLE> </HEAD> <BODY BGCOLOR="#BBEEFF" BACKGROUND="GIF/BACK.JPG"> <IMG SRC="gif/BACKOFFICE.gif" ALIGN="RIGHT" BORDER="0"> <IMG SRC="gif/MSMINI.GIF" ALIGN="LEFT" BORDER="0"> <BR> <CENTER> <IMG SRC="GIF/BANR.JPG" ALIGN="CENTER" BORDER="0"> <BR> <FONT COLOR=RED SIZE=6></FONT> </CENTER> <P> <FONT FACE="MS Pゴシック"> <B>「美な味 for Intenert」</B>では, <B>Microsoft SQLserver6.5</B>を使用したインターネット発注システムのデモをごらん いただけます.ユーザーが自由に商品を検索,選択し,気に入った商品をその場で注文 することが可能です.発注の確認もリアルタイムでおこなえる他,注文の変更や取り消 しもインターネット上でおこなうことができます.</FONT> <FORM ACTION="LOGIN.IDC" METHOD="POST"> <CENTER> <P><FONT FACE="MS Pゴシック"> <B>「お客さまID」</B>を入力してください.</FONT> <TABLE BORDER=1> <TR><TD> <FONT COLOR=RED FACE="MS ゴシック" ALIGN="CENTER"><B>お客さまID</B></FONT> </TD><TD><INPUT TYPE="text" Name="ID" VALUE="" SIZE=8 MAXLENGTH=8></TD></TR> </TABLE> <INPUT TYPE=SUBMIT VALUE="送信"> </CENTER> <P><FONT COLOR=BLUE FACE="MS Pゴシック"> はじめてのお客さまは,下の表にて新規登録を お願いいたします.<B>「お客さまID」</B>に<B>1-999</B>のいずれかの数字を入力す ると,デモ用に仮の取引先名がご利用になれます.</FONT> </FORM> <HR> <FORM ACTION="REG_CLI.IDC" METHOD="POST"> <P> <CENTER> <TABLE BORDER=1> <TR><TD COLSPAN="2" ALIGN="CENTER"><B><FONT COLOR=RED SIZE=2 FACE="MS ゴシック"> 新規登録</FONT></B></TD></TR> <TR><TD><B>会社名</B></TD> <TD><INPUT TYPE="text" Name="COMPANY" VALUE="" SIZE=40 MAXLENGTH=40></TD></TR> <TR><TD>部署</TD><TD> <INPUT TYPE="text" Name="SECTION" VALUE="" SIZE=40 MAXLENGTH=40></TD></TR> <TR><TD><B>住所</B></TD><TD> <INPUT TYPE="text" Name="ADDRESS" VALUE="" SIZE=40 MAXLENGTH=40></TD></TR> <TR><TD><B>お電話</B></TD><TD> <INPUT TYPE="text" Name="TEL" VALUE="" SIZE=14 MAXLENGTH=14></TD></TR> <TR><TD><B>お名前</B></TD><TD> <INPUT TYPE="text" Name="PERSON" VALUE="" SIZE=14 MAXLENGTH=14></TD></TR> <TR><TD>E-mail</TD><TD> <INPUT TYPE="text" Name="EMAIL" VALUE="" SIZE=40 MAXLENGTH=40></TD></TR> </TABLE> (太字の項目は必須入力です) <P><FONT COLOR=BLUE>ご入力いただいたデータは,資料の配布等の参考にさせていただきます. </FONT><BR> <INPUT TYPE=SUBMIT VALUE="新規登録"><INPUT TYPE=RESET VALUE="リセット"> </CENTER> <BR> </FORM> <HR> <CENTER> <A HREF="INDEX.HTM"><IMG SRC="GIF/UP.GIF" ALIGN="CENTER" BORDER="0"><BR>UP</A> </CENTER> <BR> <CENTER> <A HREF="INDEX.GIF"><IMG SRC="GIF/HOME-S.GIF" ALIGN="CENTER" BORDER="0"><BR>HOME</A> </CENTER> <BR> <BR> <IMG SRC="GIF/IE_ANIM.GIF"> <H5> (c)1996 Microsoft and/or its suppliers. All rights reserved. </H5> </BODY> </HTML>

リスト8:ログインページが呼び出すIDCファイル ( LOGIN.IDC )
Datasource: XXXXX
Username: XXXXX 
Template: Category.htx 
RequiredParameters: 
SQLStatement:
+ sql_login '%ID%'

リスト9:LOGIN.IDCが呼び出すストアドプロシージャ ( SQL_LOGIN )
CREATE PROC sql_login @id varchar(10) AS Declare @err_msg varchar(255) Declare @company_name varchar(30) Declare @retval int select @err_msg = '<BR>入力しなおしてください.</H3></FONT><!--' Execute @retval = sp_numcheck @id if @retval <> 0 BEGIN SELECT message = '<FONT COLOR=RED><H3>「お客さまID」項目に数字を入力してください</H3> </FONT><!--'+ @err_msg RETURN END select @company_name = Company from SQL_Client where Code_client = convert(int,@id) if @company_name = NULL select message = '<FONT COLOR=RED><H3>該当する顧客IDがありません.' + @err_msg else select code_client = convert(int,@id), message = @company_name + '<BR><BR>', Code_category,Category_name, Description from SQL_Category

リスト10:数字チェックサブプロシージャ(sp_numcheck)
create proc sp_numcheck @param varchar(126)

as 

Declare @pcount int
select @pcount = 1
select @param = ltrim(rtrim(@param))

if SUBSTRING(@param,1,1) = '' 
return 0

WHILE SUBSTRING(@param,@pcount,1) <> '' or ASCII(SUBSTRING(@param,@pcount,1)) = 32
  BEGIN
          if ASCII(SUBSTRING(@param,@pcount,1)) < 48
               or ASCII(SUBSTRING(@param,@pcount,1)) > 57
     BEGIN
        return @pcount
     END
     select @pcount = @pcount + 1
   END
   return 0

リスト11:カテゴリ一覧ページテンプレート(CATEGORY.HTX)
<HTML> <TITLE>美な味 for Internet</TITLE> <BODY BACKGROUND="GIF/BACK.JPG" TEXT="#000000"> <CENTER> <%message%> <A HREF="slip.idc?CODE_CLIENT=<%Code_client%>" ALIGN="center" BORDER="0"><BR>本日の注文</A> <A HREF="art_list_all.idc?CODE_CLIENT=<%Code_client%>" ALIGN="center" BORDER="0"> <BR>全商品リスト</A> </CENTER> <CENTER> <TABLE BORDER=1> <TR> <TH>カテゴリー</TH> <TH>説明</TH> </TR> <%begindetail%> <TR> <TD><A HREF="Art_list.idc?CODE_CATEGORY=<%Code_category%>&CODE_CLIENT=<%Code_client%>"> <%Category_name%> </TD> <TD><%Description%></TD> </tr> <%enddetail%> </TABLE> <A HREF="login.htm" ALIGN="center" BORDER="0"><BR>ログインページにもどる</A> </CENTER> </BODY> </HTML>

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


PCDN LOGO