実践 クライアント/サーバーデータベースソリューション 第12回 第14回


コンポーネント化されたHyper SQLdb Client Libraryが,
プログラミングを簡素化する

Access,VB6,Jetデータベースエンジンを利用した
C/Sシステム構築に関する考察,実験および実践


秋月巌ソリューション事務所
秋月 巌 AKIZUKI,Iwao


SybaseによるLinux版Adaptive Server Enterpriseの無償配布

 SybaseがLinux版Adaptive Server Enterpriseを無償で配布を始めたのにはおどろいた.最初,この話を聞いたときには,無償といっても,体験版かあるいはベータ版か,あるいは調査用の実行ライセンスのない製品か,よくても,サーバーは無償だがクライアントは有償なのだと思った.しかし,Sybaseのホームページ(http://www.sybase.co.jp/press/SYK98-1007linux.html)には次のようにはっきりと記述してある.
「当製品は無サポートですが,開発,利用を自由に行なうことができます」
 利用を自由に行なうことができます…,これは順当に考えて,無償で運用できるという意味のはずである.
 たとえばこれが自動車だったら「当製品は保証はしませんが,自由に利用することができます」ということには絶対ならない.自動車には製造原価がかかるからである.

低価格とプラットフォーム

 もっとも,Linux版のSybase Adaptive Server Enterpriseがいくら他のプラットフォームの移植の製品で無サポートだとしても,Linux版への移植コストが発生する.コストが0だというわけではない.
 大体,データベースサーバーというのは,ついこの間まで非常に高価なものだった.クライアントの台数が増えればサーバーソフトウェアだけで何千万円とかかるのはめずらしくなかったのである.その状況に価格破壊を起こしたのがMicrosoft SQL Server 4.2である.この製品がSybase SQL ServerのWindows NT版だったのはご存知の通りである.20万円程度のサーバー価格に1クライアント2万円程度という価格設定は驚異であった.しかし驚異ではあったが,他のデータベースベンダーの脅威になったわけではない.Windows NTというマイナーなプラットフォームでしか動作しなかったからである.普通の人だったら,MicrosoftのサーバーOSにデータベースサーバーを載せたいとは思わない,そういう時代だった.今では普通の人もMicrosoftのサーバーOSを選択するが,もちろん,良識的な人だったら(あるいは顧客からの圧力がなかったら),そのような危ないことはしない.

データベースサーバーがプラットフォームの普及を促進する

 MicrosoftにはSQL Serverを低価格でリリースする必然性があった.目的はWindows NTの普及である.サーバーOSの普及のためにデータベースサーバーを用意したMicrosoftの考えは正しい.結果的にWindows NTは普及し,Microsoft SQL Serverは他のデータベースサーバーの脅威となった.その影響を最大限に受けたのは,もちろんデータベースサーバーベンダーの雄Oracleだが,被害を受けたのは他でもないSybaseとInformixだった.
 SybaseがSQL ServerのライセンスをMicrosoftに提供したことを後悔しているかどうかは問題ではない.実際,Sybaseがどのようなメリットを得たのかはわかりようがない.ただ,日本法人の社員と接した範囲で判断するかぎり,Oracleとは違ってMicrosoftに対して敵意を抱いてはいないようにみえる.それは現在はSybaseの傘下にあるツールベンダーPowersoftにおいても同様である.
 大切なのはLinux版のSybase Adaptive Server Enterpriseが,なぜ無償で配布されたのかということである.Linux版のデータベースサーバーは,有償であるがOracleもリリースを発表している.その際にOracleの日本法人の役員が「NTをつぶす」という発言をしている.たのもしい発言である.Windows NTがつぶれて無償のUNIX系OSが主流になることは,多くの人の利益につながるからである.しかし,その発言には何か中途半端な印象を受ける.本当にWindows NTをつぶす気があるならばもっと早くサポートを決定すべきだったし,価格も圧倒的に安くするべきだった.Oracleのような資産内容がよく,反Microsoft的社風の企業でも,ユーザーの利益やMicrosoftの打倒より,当座の利益が大切なのである.

Oracleのチャンスと打算

 OracleにはWindows NTをつぶすチャンスがあると思う.たとえばもしOracleがOSとしてのLinux自身をサポートすれば,市場のLinuxへの信頼は格段に増すだろう.これはNEC,日立,富士通といった日本のコンピュータメーカーも同様である.しかしその決断をするには目先の利益を捨てる覚悟が必要になる.その覚悟を最初に決めたのが,Sybaseなのである.
 Linux版Sybase Adaptive Server Enterpriseは,現在Red Hat SoftwareやCaldera Systemsといった主要なLinuxサポートベンダーのサイトからダウンロードが可能である.これはLinux版Sybase Adaptive Server EnterpriseがLinux陣営にとって,強力な援軍であることを物語っている.
 では,Sybaseが得る利益は何なのだろうか? 少なくとも売上益があがるわけではない.またSybaseはLinuxの普及そのものによって利益があがるわけでもない.具体的な数値でメリットを表現することはむずかしい.この難しさは,最近のポータルサイトを巡る北米でのし烈な競争の根拠を説明することと同様である.

やがてソフトウェアは無償に…

 しかし,はっきりとしていることは,近い将来,ソフトウェアベンダーはソフトウェアの売上によって収益をあげることはできなくなるということである.
 次のようなイメージを想像していただきたい.

* * *

まず,ユーザーはコンピュータを立ちあげる.この場合のOSはWindowsでもLinuxでもかまわない.メーカーがバンドルしてきたものを使えばいい.その場合,コンピュータメーカーはライセンス料の安いLinuxを選択するだろう.少なくとも,そのオプションを用意することになる.バンドルされているWindows 98のサポートは,普通Microsoftではなく,メーカーが行なう契約になっているから,メーカーにしてみればOSベンダーがサポートするかどうかは問題にならない.いつまでもバクフィックスがすすまないWindowsよりは,ソースコードを扱えるLinuxの方が安心なぐらいかもしれない.
起動したパソコンは自動的にWebブラウザが起動し,どこかのポータルサイトに接続される.この場合のブラウザがInternet ExplorerかMozillaかどうかは問題ではない.どちらも無償なのだから,プレインストールされていた方を使えばいい.ポータルサイトに掲載されている今日のニュースを読むかどうかは,ユーザーの勝手である.
ワープロを使用したくなったとする.ユーザーはポータルサイトのメニューをクリックしてワープロをダウンロードする.ここでダウンロードされるアプリケーションがJavaかActiveXであるか,あるいはCGIであるかは問題ではない.とにかく,ワープロソフトは空からふってくるのである.ユーザーは使用が終わったら,それらを破棄すればいい.

* * *

すでに始まった兆候

 このスタイルはすでに定着しつつある.Yahoo,goo,Hotmailなどが提供する無料メールサービスである.これらのサービスは無料でアカウントを提供し,メールアプリケーションを提供する.今まで,インターネットメールを利用するには,メールサーバーを立ちあげるかプロパイダと契約してメールアカウントを作成し,メーラーを購入してクライアントマシンにインストールする必要があった.しかし,無料メールサービスはそれらのすべてを無料で提供する.
 サービスのメインテナンスといったものが無償化されていることも大切だが,サーバーとクライアントソフトウェアが無償で提供されていることに注目してほしい.これらの維持,開発費用は広告収入によってまかなわれている.先の例のワープロも,十分な広告収入と通信スピードさえあれば,ユーザーのアクセスを目当てに広告費によって維持できることになる.
 現在,Webサイトのバナー広告費用は1インプレッションあたり,2円〜10円程度である.1インプレッションとは,アクセスユーザーに一回表示することである.だから,自分の作ったサイトの全ページで1日10000アクセスがあったとして,かつそれをうまく売ることができれば,代理店マージンは別だが2万円〜10万円の売上が可能だということになる.Yahooのように一日に数千万アクセスを確保できる企業ならば,ヒット数を確保するためにワープロの開発費用を確保することが難しくないことは想像できるだろう.もっとも,多くのポータルサイトは,まだ赤字運営だという.

Sybaseの見る夜明けの夢

 SybaseはOSベンダーでもないし,ポータルサイト企業でもない.それにAdaptive Server Enterpriseをダウンロード可能にしても大したアクセス数が期待できるわけでもないし,大体,ダウンロードサイト自体がSybaseのサイトにはない.それでも無償の公開に踏み切ったのは,Linuxという新しく台頭してきたアプリケーション市場におけるシェアの取得と,ソフトウェアを無償で配布しても収益があがるビジネスモデルの確立への挑戦だと考えることができる.
 おそらく,このビジネスモデルをもっとも華麗に実現したのは,Netscapeである.Webブラウザを配布し,そしてWebサーバーを販売して収益をあげた.この方法はそのままRealaudioなどに受け継がれている.しかし,このビジネスモデルもSybaseのケースには当てはまらない.データベースサーバーも専用のクライアントアプリケーションに依存する部分があるにしても,SybaseはLinux用のクライアントライブラリも提供しているのである.

新しいマーケティング力学

 私はソフトウェアビジネスに従事していて,この世界には既存の物流にはない力学が作用することを強く感じる.その根拠の多くは製造コストがほとんど無料だということに起因している.ひとつしか売れなくても100万個売れても,支出にはそれに比例するだけの差はない.そして,開発費が回収したプロジェクトは,すぐにマーケティングアイテムに変換することが可能である.
 また,最近の大きな特長だが,ソフトウェアの進歩の速度が鈍化した.これは,旧バージョンの製品が陳腐化しないことを意味する.Visual Basicがいい例だろう.Ver 4.0から5.0へのバージョンアップ時には逡巡したという例をあまりきかなかったが,Ver 5.0から6.0へのバージョンアップをためらう例は多い.バージョンアップによるメリットが少なくなったからである.
 つまり,今後,すでに原価を回収したアプリケーションが,限りなく無料に近い価格で市場に出回ることになる.これはLinuxプラットフォーム以上に,ソフトウェア資産の蓄積があるWindowsにおいて顕著になるだろう.
 無償のアプリケーションを自在に組み合わせて使用するユーザーに対して,ソフトウェア業界はどのような対応をすべきだろうか? やはり何かしらのサービスを提供して収益をあげることになる.そしてWindowsのような不安定な環境や,PC-UNIXのようなサポートのない環境には,そのためのビジネスチャンスが豊富にある.

Windows NTの無償配布への道

 さて,MicrosoftがWindows NTの無償配布を始めるのはいつだろう? ソ連の崩壊やNECのPC98シリーズが意外と急だったように,それは遠いことではないかもしれない.そのためには,私はJavaの安定が最大の課題のように思われる.もう少し速いマシンとLinuxのシェア,それにMicrosoftのJava VMと同じふるまいをするLinux用のJava VMがあれば,開発者はJavaでアプリケーションを記述することをいとわなくなる.マルチプラットフォームである必要はない.2種類のプラットフォームで動作すればいいのである.
 アプリケーションが確保できれば,あとはパソコンベンダーがどのOSをバンドルするかに市場は左右される.そのときに無償のLinuxが選択される可能性よりも,Windowsが限りなく無償に近づく可能性の方が高い.Microsoftは負けるわけにいかないからである.

DB Serverの製品バージョン「Hyper SQLdb Server」

 さて,ここまでアプリケーション,あるいは0Sの無償化の話をしておきながら逆の話になるが,本連載で扱っている「DB Server」の製品バージョン「Hyper SQLdb Server」を現在開発中である.今回ADO互換のクライアントコンポーネント「Hyper SQLdb Client Library」を紹介し,次号ではその実装方法を解説する.次々号あたりにはRecordsetオブジェクトベースのデータの更新と追加をサポートする.ここで無償バージョンのDB Serverの開発は完了し,それ以降はこの無償バージョンのDB Serverで稼動する,実用的なクライアントアプリケーションの実装方法の解説に移る予定である.
 製品バージョンの開発には理由がある.このプロジェクトにおいて,本稿の原稿料が唯一の収入だが,実用的なデータベースサーバーとして完成させるのに,雑誌のサンプルプログラムとして開発しているだけでは不十分だからである.そのためにはそれ相応のリソースを投入し,プロダクトとしての質をあげる必要がある.

データアクセスコンポーネントHyper SQLdb Client Library

 今回は,前回まで紹介したデータベースアクセスのクライアント処理をコンポーネント化した.Hyper SQLdb Client Libraryと名づけられたこのコンポーネントは,2つのActiveXコントロールによって成立している.ひとつはConnectionコントロールであり,もうひとつはRecordsetコントロールである.これらのコントロールを使用するには,サンプルの\ClientLibフォルダのDBCliLib.vbpを開いてOCXを作成し,コントロールを使用するプロジェクトからコンポーネントの参照設定を行なう必要がある(図1).この操作はデフォルトでロードされないコントロールを使用する場合と変わらない.
 2つのコントロールはひとつのOCXファィルとして提供され,コンポーネントの参照もひとつだけ行なえばいい.
 ソースコードがあるので,コントロールがマシンにインストールされるのを望まないならば,プロジェクトグループを作成するという方法もある.まず最初にクライアントアプリケーションを作成するプロジェクトを開き,それから[ファイル]メニューの[プロジェクトの追加]を選択し「既存のファィル」として\ClientLibフォルダのDBCliLib.vbpを追加する.こうしてコンポーネントの参照設定を行なえば,クライアントにインストールすることなくコントロールを使用することができる.
 2つのコントロールは,それぞれADOのConnectionオブジェクトとRecordsetオブジェクトのプログラミングインターフェイスとしての高い互換性をもっている(記事末リファレンス参照).

図1:クライアントコントロールを参照
図1:クライアントコントロールを参照

シンプルクライアントプログラム

 リスト1は,図2のシンプルクライアントプログラムのソースコードである.2つのコントロールと,ここに記載されているわずか数行のコードで,データベースアクセスを実現している.サンプルのフォーム左上に表示されているのが,コントロールのアイコンである.これまでのDB Serverへのアクセス用の冗長なコードと比較して,いかにシンプルになっているかがわかるはずである.
 このコントロールの実装方法についての解説は次号にして,今回はクライアントプログラムの実装方法を説明する.
 まず,[サーバーに接続]ボタンをクリックすると次のコードが実行される.

cn.ServerName = "localhost"
cn.ServerPort = 1010
cn.cnOpen "BIBLIO"

 cnは,Connectionコントロールのオブジェクト名である.このコントロールのプロパティとServerPortプロパティに値を設定することで,アクセスするサーバーマシンとTCP/IPポートを特定する.次に実行するcnOpenメソッド(記事末リファレンス参照)はConnectionコントロールのメソッドで,データベースサーバーとの接続を行なう.引数に指定されている"BIBLIO"はサーバー側で設定されているODBCのデータソース名である.これでアクセスするデータベースが特定される.クライアント側ではODBCの設定は必要ない.

リスト1:シンプルクライアントプログラムのソースコード
Private Sub cmdConn_Click()
    cmdConn.Enabled = False
    cmdSend.Enabled = True
    
    cn.ServerName = "localhost"
    cn.ServerPort = 1010
    cn.cnOpen "BIBLIO"
End Sub
Private Sub cmdSend_Click()
    rs.rsOpen "SELECT * FROM Authors WHERE Author like 'a%'", cn
End Sub
Private Sub rs_RecordsetComplete()
    Set DataGrid1.DataSource = rs
End Sub

図2:シンプルクライアントプログラム
図2:シンプルクライアントプログラム


レコードセットの取得

 サーバーへの接続が完了すると,図3のDBアクセスモジュールが表示される.このDBアクセスモジュールは先月号で,マルチスレッドアクセス専用に改良されている.

図3:接続が完了すると表示されるDBアクセスモジュール
図3:接続が完了すると表示されるDBアクセスモジュール

 シンプルクライアントプログラムの[データを取得]ボタンをクリックすると,以下のコードが実行され,検索が行なわれる.

rs.rsOpen _
 "SELECT * FROM Authors" & _
 "WHERE Author like 'a%'", cn

 Recordsetコントロール(rs)のrsOpenメソッド(記事末リファレンス参照)は,引数で指定されたSelect文とConnectionコントロールに基づいてデータ検索を要求する.指定されているSelect文は,頭文字がaの著者のリストを意味する.2番目の引数に指定されているcnは,すでに接続が完了しているConnectionコントロールである.
 検索完了の通知はRecordsetCompleteイベントによって受信する.次のイベントプロシージャでは,完成したレコードセットをDataGridのデータソースとして指定している.

Private Sub rs_RecordsetComplete()
    Set DataGrid1.DataSource = rs
 End Sub

 これでデータベースアクセスは完了する.もちろんデータ連結しなくても,RecordsetコントロールはADO同様,Fieldオブジェクトにアクセスすることができるので,コードを記述してデータを扱うこともできる.

もう少し機能の多いサンプル

 図4はシンプルクライアントプログラムでは使用しなかったConnectionコントロールとRecordsetコントロールの機能を使用したクライアントプログラムである.リスト2にそのソースコードを示す.

図4:クライアントプログラム
図4:クライアントプログラム

リスト2:クライアントプログラムのソースコード
Option Explicit
Public hostname As String
Public dsn As String

Private Sub cmdBack_Click()
    rs.MovePrevious
    If rs.BOF Then
        rs.MoveNext
        Exit Sub
    End If
    Text1 = rs.Fields(1).Value
End Sub

Private Sub cmdConn_Click()
    cmdConn.Enabled = False
    cmdSet.Enabled = False
    cmdSend.Enabled = True
    cmdBack.Enabled = False
    cmdFirst.Enabled = False
    cmdLast.Enabled = False
    cmdNext.Enabled = False
    cmdRecCnt.Enabled = False
    Command2.Enabled = False
    
    cn.ServerName = hostname
    cn.ServerPort = 1010
    cn.cnOpen dsn
End Sub

Private Sub cmdFirst_Click()
    rs.MoveFirst
    Text1 = rs.Fields(1).Value
End Sub

Private Sub cmdLast_Click()
    rs.MoveLast
    Text1 = rs.Fields(1).Value
End Sub

Private Sub cmdNext_Click()
    rs.MoveNext
    If rs.EOF Then
        rs.MovePrevious
        Exit Sub
    End If
    Text1 = rs.Fields(1).Value
End Sub

Private Sub cmdRecCnt_Click()
    Text1 = rs.RecordCount
End Sub

Private Sub cmdSend_Click()
    cmdSend.Enabled = False
    If Len(Trim(txt_param)) = 0 Then
        MsgBox "検索文字列を指定してください"
        Exit Sub
    End If
    rs.rsOpen "SELECT * FROM Authors WHERE Author like '" & _
     Trim(txt_param.Text) & "%'", cn

    Command2.Enabled = True
    cmdBack.Enabled = True
    cmdFirst.Enabled = True
    cmdLast.Enabled = True
    cmdNext.Enabled = True
    cmdRecCnt.Enabled = True
End Sub

Private Sub cmdSet_Click()
    frm_option.Show
End Sub

Private Sub Command2_Click()
    Text1 = rs.State
End Sub

Private Sub Form_Load()
    hostname = "localhost"
    dsn = "BIBLIO"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If cmdRecCnt.Enabled = True Then
        rs.rsClose
    End If
    If cmdConn.Enabled = False Then
        cn.cnClose
    End If
    Unload frm_option
    End
End Sub

Private Sub rs_RecordsetComplete()
    Set DataGrid1.DataSource = rs
End Sub

Type9 DB Server

 Type9 DB Serverも細かい改良が加えられている.ひとつは今までデータアクセスにRDOを使用していたものをADOに変更している(RDOからADO変更,データアクセスに関しては,この号の特集記事で扱っている).
 ADOに変更することによって,結果としてクライアントでフィールドのデータ型を判断するときにADOの定数からRDOの定数に変換する必要がなくなった.
 それと,ネットワークが断線したときに,DBアクセスモジュールのインスタンスが解放されない障害を修正した.

次号は…

 次号では,どのようにHyper SQLdb Client Libraryが実装されているかを解説する.今まで実現されていた機能をコンポーネント化するために,Visual Basicでは多くのコードを追加する必要はないが,それでも移植は単純な作業ではなかった.それでも結果として得られたメリットを考えれば,その労力は無駄ではない.
 MicrosoftはCOMやActiveXの完成と普及に力を入れているし,私はそれに関する記事を何度も書いてきたが,今回のコンポーネント実装ほど,そのメリットを強力に感じたことはない.



Hyper SQLdb Client Libraryリファレンス


Connectionコントロール

小見出しcnOpenメソッド
データベースサーバーに接続します.このメソッドが完了すると接続状態が確立し,コマンドを発行して結果を処理することができます

構文
    connection.cnOpen ConnectionString, UserID, Password, OpenOptions
パラメータ
  • ConnectionString …ODBCのデータソース名を含む文字列型(String)の値を指定します
  • 第2,第3,第4引数は無効で省略可能です.ADOとの互換のために用意されています
    Private Sub cmdConn_Click()
        cn.ServerName = hostname
        cn.cnOpen dsn
    End Sub
小見出しcnCloseメソッド
データベース接続を切断します

構文
    connection.cnClose
小見出しExecuteメソッド
結果のないSQLステートメント,ストアドプロシージャ,またはデータベースエンジンに固有のテキストを実行します

構文
    connection.Execute CommandText, RecordsAffected, Options
パラメータ
  • CommandText …実行するSQLステートメント,ストアドプロシージャ,またはデータベースエンジン固有のテキストを含む文字列型(String)の値を指定します
  • 第2,第3引数は無効で省略可能です.ADOとの互換のために用意されています

Recordsetコントロール

小見出しrsOpenメソッド
パラメータに指定されたSelect文に基づいてレコードセットを作成します

構文
    recordset.rsOpen Source, ActiveConnection, CursorType, LockType, Options
パラメータ
  • Source …SQLステートメントを指定します
  • ActiveConnection …有効なConnectionコントロールを指定します
  • 第3,第4,第5引数は無効で省略可能です.ADOとの互換のために用意されています
    rs.rsOpen "SELECT * FROM Authors WHERE Author like '" & _
     Trim(txt_param.Text) & "%'", cn
小見出しrsCloseメソッド
開いているRecordsetコントロールを閉じます

構文
    recordset.rsClose

小見出しBOF,EOFプロパティ
BOFは,カレントレコードの位置がRecordsetコントロールの最初のレコードより前にあることを示します
EOFは,カレントレコードの位置がRecordsetコントロールの最後のレコードより後にあることを示します

戻り値
  • BOFおよびEOFプロパティは,ブール型(Boolean)の値を返します
  • BOFまたはEOFプロパティがTrueの場合,カレントレコードはありません
    rs.MoveNext
        If rs.EOF Then
            rs.MovePrevious
            Exit Sub
        End If

小見出しRecordCountプロパティ
Recordsetコントロールに存在する現在のレコード数を示します

戻り値
    長整数型(Long)の値を返します
    Private Sub cmdRecCnt_Click()
        Text1 = rs.RecordCount
    End Sub

小見出しMoveFirst,MoveLast,MoveNext,MovePreviousメソッド
指定のRecordsetコントロールの最初,最後,次,または前のレコードに移動して,そのレコードをカレントレコードにします

構文
    recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}
    Private Sub cmdBack_Click()
        rs.MovePrevious
        If rs.BOF Then
            rs.MoveNext
            Exit Sub
        End If
        Text1 = rs.Fields(1).Value
    End Sub
    Private Sub cmdNext_Click()
        rs.MoveNext
        If rs.EOF Then
            rs.MovePrevious
            Exit Sub
        End If
        Text1 = rs.Fields(1).Value
    End Sub

小見出しFieldsコレクション
Fieldsコレクションはインデックス番号を指定することで,ADOのFieldオブジェクトへの参照を取得します
ADOのFieldオブジェクトを参照することで,メソッドおよびプロパティを使って,次の操作が実行できます
  • Nameプロパティを使ってフィールド名を返します
  • Valueプロパティを使ってフィールド内のデータ表示を行ないます
  • Type,PrecisionおよびNumericScaleプロパティを使って,フィールドの基本特性を返します
  • DefinedSizeプロパティを使って,宣言したフィールドサイズを返します
  • ActualSizeプロパティを使って,与えられたフィールド内の実際のデータサイズを返します
  • AttributesプロパティおよびPropertiesコレクションを使って,与えられたフィールドでサポートされている機能の種類を識別します
    Text1 = rs.Fields(1).Value

※注意
このコレクションはADOのFieldオブジェクトを使用するために,暫定的に用意されているものです.今後,仕様が変更される可能性があります



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


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