Visual Basic 5.0によるWebデータベースアプリケーション
DAO,RDO,ADO,ADCとActiveX Documents/コントロールの組み合わせ 著/秋月巌 AKIZUKI, Iwao
Visual Basic 5.0はすばらしい.これは,Visual Basic 5.0を使用した開発者の誰もが認めることと思う.Windows開発ツールとして圧倒的な能力を持つDelphiの最新バージョンであるDelphi3は,Visual Basic 5.0以上に強力であるが,それがVisual Basicの最新バージョンの評価に影響を与えるものではない
しかも,明らかにDelphiとVisual Basicの差はつまってきている.今までは常に1バージョン分だけDelphiが先行していたが,5月,6月と続けて行なわれるVisual Basic(5.0)とDelphi(3.0)のバージョンアップでは,スペック上の差はわずかである.
自社のツールの優位性を訴えようとする両社のマーケティング戦略に,耳を傾ける必要はない.Delphiの方が優れているに決まっているのだから… しかし,Delphiを導入できる状況を持つ企業がどれだけあるかを考えたとき,選択の余地がないことも確かである.
もし,あなたが“志”を第一義とする開発者なら,今からでも遅くはない,Delphiへの移行を真剣に検討すべきである.Borlandは社運をかけてサポートしてくれるだろう(もっとも,コンピュータ業界の歴史が,裏切りの歴史であったことを忘れてはならない).しかし,あなたがプロフェッショナルのデベロッパーを自負するならば,理想は捨てて現実をとることをおすすめする.Visual Basic 5.0は一般的なWindowsプログラムを作成する上で開発者に何の不満も感じさせない.
もちろん,理想と現実の両方をひとつの言語で追いかけたいならば,Javaという選択肢もある.ただ,この場合,現実が理想に追いつくまでの期間,じっと耐える覚悟が必要となる.
●Visual Basic 5.0で何を作るか
Visual Basic 5.0の起動時に図1のようなダイアログボックスが表示されることは本誌でも紹介されてきた.このダイアログはどのようなアプリケーションを作成するか選択するためのものである.これをみて,こんなにたくさんの種類のプログラムが作れるのか,と感激するか,あるいは,プログラムを作るために,こんなものを選択するのはわずらわしいと考えるかは個人差があるだろう.
しかし,必要がない機能は使わなければよいのだから,多機能になったこと自体は喜ぶべきことである.とにかく,今回はここにあるものから,ActiveXドキュメントとActiveXコントロールを使って,Webサイトにあるデータベースにアクセスする方法を解説する.
図1:Visual Basic 5.0の起動に表示されるダイアログボックス
●WebアプリケーションWebアプリケーションとはWWWのサービス上で動作するアプリケーションである.稼動する形態としてはインターネット,エクストラネット,イントラネットを問わない.では,WWWサービス上で動作するアプリケーションとは何かといえば,単純に言えばWWWブラウザの中で動作するアプリケーションだということができる.
もちろん,一般的な解釈からすれば,この定義は正しくない.Webアプリケーションなのだから,何かしらの形でWWWサイトと関係がないのならば,それはWebアプリケーションとは呼べないだろう.
しかし,ブラウザの中で動けばいいのなら,Excelをブラウザの中で動かしてしまおう,というのがMicrosoftの論理である.Internet ExplorerのファイルメニューでXLSファイルをオープンしたことがあるならば,ExcelがInternet Explorerの表示画面内で動作するのをご存知だろう(図2).
図2:Internet Explorerの画面上でExcelが起動
ただ,このアイデアは単なる詭弁ではない.たとえばExcelのワークシートがWebサイト上にあったとしたらどうだろうか.「http://hostname/stock.xls」のようにURLを指定することで,ブラウザの中でExcelシートが表示できるのだから,これは立派なWebアプリケーションだと呼べないこともない.ただし,Excelが動作する環境で(かつ,インストールされている必要がある)なければ,XLSファイルは単なるファイルでしかない.また,Office97ではExcelやWordの文書上にインターネットURLのハイパーリンクを埋め込むことができる(図3).
図3:Officeの文書上にハイパーリンクを設定
つまり,ブラウザを基準に考えるとExcelドキュメントとExcel.exeモジュールをセットで,ひとつのHTMLドキュメントと等価で扱うことができる(図4).Javaアプレットを含んだHTMLページが,ブラウザからみればひとつのHTMLページとして扱われるのと同様である.ただ,JavaアプレットがHTMLドキュメントをコンテナとして動作するアブリケーションなのに対し,ExcelシートはExcelをドキュメントとしてブラウザに提供することでドキュメントとしての体裁を保っている.そして,このドキュメントはExcelの機能のすべてを使うことができるアクティブなドキュメントである.
このようにActiveX Documentsはドキュメントをダイナミック化するというより,アプリケーションをHTMLのようなドキュメントとしてブラウザに提供する方法のことだということができる.是非はともかく,Webとの関連の中でExcelのような高機能なアプリケーションが利用できるメリットは大きい.
図4:Excelのワークシートにハイパーリンクを埋め込むことで1枚のHTMLページと同様に扱う
●Visual Basic 5.0によるActiveX Documentsの作成
Visual BasicによるActiveX Documentsの開発は一般のアプリケーション開発のスタイルと大きく変わるものではない.図5において画面左上のフォームで開発されているのがActiveX Documentsである.中央のフォームは,ActiveX Documentsから呼び出される普通のフォームである.
図5:ActiveX Documentsの開発画面 Visual Basicで作成したActiveX Documentsをビルドすると,Visual Basicは“.EXE(インプロセス動作の場合はDLL)”と“.VBD”という拡張子のついたファイルを生成する.これらのファイルは2つがセットとなって動作する.ExcelシートとExcelアプリケーションがセットで動作するのと同様である.ただ,Excelは自分が扱う対応ドキュメントを作成することができるが,Visual BasicのActiveX Documentsの場合は,Visual Basicを使う必要がある.それにより,ひとつのEXE(あるいはDLL)を,複数のドキュメントへ対応づけできる.
VBAを使ってExcelのワークシートにアプリケーションを作成し,それをブラウザ内のExcelで実行することをイメージした方が理解しやすいかもしれない.VBAアプリケーションでもあるExcelドキュメントが実行のためにExcel.exeモジュールを要求するように,Visual BasicのActiveX Documentsも対応するEXEかDLLを必要とする(図6).
図6:ActiveX Documentsの動作
●ActiveX Documentsの実行
ExcelのワークシートをWeb上で公開してブラウザ内で実行するケース同様,Visual BasicによるActiveX Documentsが起動するときも,実行モジュールはローカルにインストールされているものを使用する.このスタイルはOLEテクノロジーに依存しているActiveX特有のスタイルである.つまり,実行モジュールがローカルにインストールされていなければ,プログラムを実行することはできない.
このあたりが,サーバーから動的に取得したアプリケーションをロードするJavaとの違いである.しかし,ActiveXの優れた点はローカルへのインストールをWeb経由で動的におこなう点である.つまり,HTML内に記述されている<OBJECT>タグによって,初回のみインストールを実行し,2度目以降はローカルにインストールされているものを使用する.そのため,2度目以降はダウンロードのコストを節約することができる.
<OBJECT>タグにバージョン番号を記述しておけば,ローカルにインストールされているモジュールのバージョンと比較し,ローカルにあるモジュールがサーバーにあるモジュールよりもバージョンが若い場合には自動的にバージョンアップを実施する.
よくできたシステムである.MicrosoftはActiveXを実装するにあたって,OLEという既存の資産をWeb上で有効に活かすためのさまざまなアイデアを製品に反映させている.ActiveXには懐疑的な意見も多いが,Visual Basic 5.0とDelphiというActiveX開発ツールが発表され,一方のJavaにもBorlandやSymantec,それにPowersoftの新製品が発表されてみると,結局,既存のOCXコントロールを流用できるActiveXの方が現実的な解を一足早く提供したという印象がある.
やがて,JavaはActiveXの環境に追いついてくるが,ユーザーの要求が製品に先行している現状では,この猶予期間の間にActiveXは強力な基盤を築くことができよう.ましてや,それを推進しているのが,マーケティングの天才ともいえるMicrosoftである.結局,開発者は両方をサポートすることが必要ということになる.
ActiveXに最後までつきまとう問題はセキュリティとプラットフォームの制限である.
セキュリティに関してはActiveXの強力な実行環境とのトレードオフで犠牲となっている.今やMicrosoftはWindowsNTを発売するベンダーだが,実は,ついこの間までMS-DOSをメインに発売する会社であったことを忘れてはならない.MS-DOSがスタンドアロンで実行している世界は,たとえていえば,閉ざされた楽園であった.それに対してインターネットは開かれた肥沃で危険な未開の地である.
Sun microsystemsがJavaをインターネット用に移植するにあたって,セキュリティに十分な配慮を払ったのは当然である.セキュリティの配慮なしにインターネットをさまようのは,何の武器ももたずに鮫のいる大海で泳ぐようなものだからである.
しかし,セキュリティの強化によって失う簡便性を考えれば,Microsoftの選んだ方法にもひとつの説得力があることは否定できない.なぜ,私がそう考えるかといえば,私もついこの間のまでMS-DOSのプログラムを開発していた人間だからだろう.現代的な環境でしかシステムを作ったことのない人間ならば,きっと,そんなことは考えないに違いない.
プラットフォームに関していえば,MicrosoftはActiveXを他のOSにも移植している.しかし,いくら,私が元DOSのプログラマだからといって,それを鵜呑みにするほどお人よしではない.この問題に関して私は(そして,おそらくMicrosoftも)次のように考えている.「Windowsが世界で稼動するコンピュータの80%を占めてしまえば,絶対数ではJavaが稼動する環境と同じ数じゃないか」
●ActiveX Documentsのコンテナ
Visual Basicで作成したActiveX Documentsはオブジェクトを格納するコンテナを必要とする.この場合のコンテナとはドキュメントに対応した実行モジュールということではない.アウトオブプロセスで動作するEXE形式の実行モジュールでも,単独のアプリケーションとして起動することはできない.Visual BasicのActiveX Documentsは次のようなコンテナオブジェクトを持つことができる.
1. ADC(Advanced Data Connector)
ADC(Advanced Data Connecctor)は,将来性の高いオブジェクトだが,Microsoftはこのアーキテクチャの実装を複雑にし過ぎてしまったかもしれない.このアーキテクチャにあまりにも多くのものを望み過ぎたのだろう.2. RDO・DAO
私は現在進行中のプロジェクトでプロトタイプまで作りながら,ADCの採用を見送った.ひとつの理由は2バイト文字を正確に処理するために独自のパッチをあてなければならなかったこと,それにパッチも含めて処理速度や安定性の問題があったからである.
執筆時現在,米MicrosoftのサイトでRelease1.0とBeta1.1(クライアント)Beta1.5(サーバー)が入手できる.頻繁にこのサイトをチェックしているが,6月上旬の時点でずい分と長い間更新されていないので,間もなく新しいモジュールがリリースされる可能性は高い.実は,私の環境上でBeta1.5を動作させることはできなかった.よって,検証はすべてRelease1.0で行なわれている.
ADCの構造は複雑なものだが,最終的なアーキテクチャとしてはサーバーとクライアントで専用のモジュールが起動し,HTTPベースで通信をするというものである.図7はADCの動作をシンプルにまとめたものである.クライアントとサーバーは独自にレコードセットを所有することができ,トリガによって同期をとることでデータベースへの更新を実現する.レコードセットは指定したコントロールに連結することもできるので,うまく動きさえすればブログラミングのコストを大きくおさえることができるはずである.
図7:ADCの動作図
既存のRDOとDAOも,ActiveX DocumentsやActiveXコントロールが利用できるデータアクセスの方法である.現時点でのイントラネット需要においては,ActiveX Documents + RDOというのがもっとも,現実的で有効な選択である.3. ActiveX Documents+ADO
この方法だと既存のクライアント/サーバーシステムのメリットを100%継承した上で,イントラネットのメリットであるメインテンナンスの問題や,ブラウザという統合されたユーザーインターフェイスを利用できる.
クライアントで実行しているのはRDOを利用したアプリケーションなのだから,プログラムは従来のC/Sと変わりなく動作する.この方式の随一,致命的な欠点はODBCがインターネットをパスしないということである.ゆえにインターネットやエキストラネットでの使用は考えられない.
WebアプリケーションでローカルにあるDBにアクセスするということは考えにくいので,そういう意味ではDAOとActiveX Documentsを組み合わせることに多くの意味はないかもしれない.ODBCdirectを使ってRDOと同様の使い方をするか,あるいはMDBファイルごとダウンロードしてローカルプログラムとして使用するということも考えられる.JetデータベースエンジンはFTPによるレプリケーションをサポートしているので,ダウンロードしたデータベースファイルとサーバーのデータを,ユーザーのアクションをトリガにレプリケートすればWebシステムとして有効な活用ができるかもしれない.
しかし,本稿ではこれらのオブジェクトによるデータアクセスの方法については解説しない.
ActiveX DocumentsからActive Server Pagesを呼び出してデータベースにデータを新規追加する方法について解説する.サンプルプログラムのテキストボックスに名前を入力して,ボタンをクリックすると入力した名前の商品がデータベースに登録されるサンプルである(図8・図9).
図8:ActiveX Documentsによる登録画面(設計時)
図9:商品名を入力してボタンをクリック
リスト1のコードは,「Command1」ボタンのイベントプロシージャである.このプロシージャではテキストボックスに入力された内容を引数としてActive Server Pagesを呼び出している.実際の処理をおこなっているのが,samp1.asp(リスト2)である.このActive Server Pagesでは渡された値をSQLのINSERT文の一部として利用している.SQL文を表示し,データ登録の処理が終わると,Active Server Pagesは登録成功のメッセージを表示するHTMLをブラウザに返す(リスト3・図10).
この方法だとブラウザからデータを送信してデータベースに書き込むことはできるが,取得したデータベースのデータをアプリケーション上に反映させることはできない.ここがActiveXコントロールとの違いである.HTML内のVBSからオブジェクトを参照する方法がわからないと,この問題はどうにもならない.
Private Sub Command1_Click() Hyperlink.NavigateTo _ "http://inetsvr/bocsample/samp1.asp?INPUT_TEXT=" & Text1.Text End Sub |
<HTML>
<BODY>
<%
Set dbConnection = Server.Createobject ⇒
("ADODB.Connection")
dbConnection.Open "order"
sqlText = "insert into Syohin (syohin_mei) ⇒
values ('" & Request("INPUT_TEXT") & "')"
%><%=sqlText%><%
dbConnection.Execute(sqlText)
%>
<BR><BR>
<% = Request("INPUT_TEXT")%> が登録されました.
</BODY>
</HTML>
|
<HTML>
<BODY>
insert into Syohin (syohin_mei) values ('ロイヤルさくらもち')
<BR><BR>
ロイヤルさくらもち が登録されました.
</BODY>
</HTML>
|
![]() |
4. ActiveXコントロール+ADO
ActiveXコントロールはHTMLの部品の一部となるため,同じADOを使うにしてもアプローチは大分異なる.リスト4のようにクライアントのVBSから参照できるようにプロパティを公開している(図11).
図11:設計時の「登録画面」コントロール
サンプルとしたプログラムの動作は,前出のActiveX Documents+ADOのサンプルと同様である(図12・図13).リスト2は,データを登録するためのASPファイルも兼用している.データの送信処理をおこなっているのがリスト5のHTMLである.
図12で表示されているボタンはActiveX Documentsのサンプルとは違い,HTMLのオブジェクトである.データの送信にはHTMLフォームの送信機能を使っている.ボタンのクリックイベントに記述されたコードで,ActiveXコントロールの内容をHIDDEN属性の<INPUT>オブジェクトに代入し,フォームをサブミットしている.ActiveXコントロールのデータを直接サーバーに送信することができないためにおこなう処理である.
このサンプルでは実装していないが,取得したデータベースの内容をActiveXコントロールに表示するには,コントロールに代入するためのVBSをサーバーでActive Server Pagesを使い,動的に生成する必要がある.
図12:実行時の「登録画面」コントロール 図13:「登録」ページ
リスト4:登録画面コントロールのVisual Basicコード リスト5「登録画面」のHTML Public Property Get Text() As String Text = Text1.Text End Property Public Property Let Text(ByVal New_Text As String) Text1.Text() = New_Text PropertyChanged "Text" End Property'記憶領域から餅枴瀉юlを読み込みます. Private Sub UserControl_ReadProperties(PropBag As PropertyBag) Text1.Text = PropBag.ReadProperty("Text", "Text1") End Sub '記憶領域に餅枴瀉юlを書き込みます. Private Sub UserControl_WriteProperties(PropBag As PropertyBag) Call PropBag.WriteProperty("Text", Text1.Text, "Text1") End Sub <HTML> <BODY> <SCRIPT LANGUAGE="VBSCRIPT" > Sub Command1_onClick() param = DOCUMENT.FRM1.ucTEXT1.Text DOCUMENT.FRM1.INPUT_TEXT.VALUE = param MsgBox param & "を登録します." FRM1.Submit End Sub </SCRIPT> <FORM NAME="FRM1" action="samp1.asp"> <INPUT TYPE="HIDDEN" NAME="INPUT_TEXT"> <OBJECT ID="ucTEXT1" WIDTH=279 HEIGHT=88 CLASSID="CLSID:ED4FD4A7-DB06-11D0-8E25-00805F4624C5"> <PARAM NAME="_ExtentX" VALUE="7382"> <PARAM NAME="_ExtentY" VALUE="2328"> </OBJECT> </FORM> <INPUT TYPE="BUTTON" NAME="Command1" VALUE="登録"> </BODY> </HTML>
5. ActiveX Documents+ADC
ActiveX DocumentsとADCのサンプルはプロトタイプとして作成したものを紹介する.このシステム最終的にはActiveXコントロール+ASPとして完成したが,ADCを使うよりもはるかに高速に動作する.しかし,クライアントでレコードセットベースでプログラミングができる魅力は大きい.
コントロールとのデータ連結機能は,更新の動作が不安定だったので使用していない.結局,安定して動作するSQLの実行機能だけを使用している.といっても,まだ,レコードの更新機能は実装していないから,動作するのはデータの表示部とドロップダウンリストにアイテムを代入する機能だけである(記事末リスト7).
注目してほしいのは,最初のページがActiveX Documentsで作成されてさえいれば,そこから呼び出すフォームが一般のフォームと同様のルックアンドフィールを持っていることである.このフォームはActiveX Documentsと同時にWebサイトからダウンロードされる.フォーム内に配置している表形式のコントロールは文化オリエント社のSpreadOCXである.サードパーティのOCXコントロールも,ActiveX Documentsと同時にダウンロードして,自動的にインストールできる.ただ,セットアップウィザードでCABファイルを作成するときの設定の仕方がわからず,ActiveX SDKに付属のDiamondツールを使って作成した.
リスト6のコードは,最初のログイン画面のボタンに記述されているものである.プロトタイプなので実際の認証機能は組み込まれていない.クライアントマシンにADCオブジェクトを作成し,各種のプロパティを設定している.ADCのサーバーモジュールのあるホスト名とODBCのデータソース名設定している.データソース名はサーバー側のそれであり,クライアントのものではないことを注意しなければならない.クライアントのODBC設定は必要ないのがポイントである.つまり,データソース名はADCサーバーモジュールがデータアクセスにいくために必要なのであって,クライアントモジュールのためではない.もし,クライアントがODBCを経由してDBにアクセスするのだとしたら,RDOと同様の制限が発生してしまう.
ADCはHTTPプロトコルを用いてテーブル情報をクライアントとサーバーで共有する.この特徴により,ほとんどすべての環境でインターネット経由のデータベースアクセスを実現している.
図14:Visual Basicフォームを呼び出すActiveX Documents 図15:呼び出されたフォーム
リスト6:ADCオブジェクトを生成し,フォームを呼び出す Private Sub cmdOpen_Click() Dim adc As Object Set adc = CreateObject("AdvancedDataControl") adc.Server = "http://inetsrv" adc.Connect = "DSN=pgenka;UID=sa;PWD=" frmShiharai.Show End Sub
現在のところ,Microsoftの製品に限らなくても,Webデータベースアクセスの決定打となるような方法はない.先月号の本誌特集で福岡寿和氏が紹介していたような方法を用いて,通信処理をおこなうのが最終的には懸命なのかもしれない.しかし,この場合も設定によってはProxyを通過できない場合がある(本誌7月号「Internet対応ActiveXコントロールの使い方(TCP/IP系)」参照).
HTTPのみを使う方法は接続性という意味では安全だが,システムとして効率のよい方法ではない.あるいは,インターネットプロパイダがPPTPを安定してサポートするようになれば,既存のC/Sシステムをインターネット上で展開してゆくことも考えられる.
ネットワークの通信速度の低さが,インターネット上でシステムを展開する上での最大の問題点である.しかし,より強い制約の中で,利用できるリソースを組合わせて活用してゆくのが,システム構築の醍醐味ともいえるだろう.インターネットによって得られるグローバルネットワークという果実に比べれば,その程度の棘は仕方がない.