Visual Basic 6.0がやってくる!

Visual Basic 6.0データーアクセス新機能



福岡 寿和 FUKUOKA,Toshikazu
富士通SSL



 Visual Basic 6.0が発売されました.Visual Basicの新版というと数々の新機能が期待されます.先行して提供されていたADO(ActiveX Data Objects)が付属されていることに注目している方も多いと思います.また,ADOより使うことになるOLE-DBへの対応具合も興味のあるところです.私もVisual Basic 6.0のデータアクセス関連なら,目玉はADO関連だと思っていました.しかし,実際にVisual Basic 6.0を手に取ってみると,それ以上に便利なデータアクセス機能が搭載されていました.そこで今回は,新鮮な驚きを与えてくれたこのデータアクセス関連の新機能を中心にご紹介したいと思います.なお,今回の記事は,Visual Studio 6.0日本語版 Tech・Edプレリリースの内容を基に執筆しています.

データアクセス新機能の概要

 Visual Basic 6.0(以下VB6)のデータアクセス関連の新機能は,表1のようになります.この新機能の適用範囲は図1に示すようにC/S3階層モデルの全般に及びます.表1の要素は,Visual Basic 6.0のヘルプシステムである[MSDNライブラリ]-[Visual Basic 6.0ドキュメント]の「データアクセスの新機能」より抜粋したものです.この内容をみる限りは,いよいよVisual Basicの仕様も「成熟」してきたように思えます.つまり「こんなことができたら開発効率が上がるのに」とか,「これができればシステムの可能性が広がるのに」と考えられていたものが実装されてきたというのが,評価前の素直な感想でした.
 果たして,この印象は実態が伴なうものなのか,早速,検証してゆきたいと思います.なお,評価中に「あれ? これはこんな機能だったのか」と思ったポイントは,適宜,太字で表記してゆくことにします.

図1:新機能の適用範囲
図1

表1:データアクセス新機能
データアクセスの新機能 搭載Edition 概要
L P E
高度なデータ連結 × コントロールのDataSourceプロパティに各種データコントロール以外にも,データ連結用の定義をしたユーザー作成のコントロールやクラスを割り当てることができる
Data Environment デザイナ × OLE DB対応のUser Connectionデザイナ
Visual Data Toolsの統合 × × IDEに統合されて([表示]-[データビューウィンドウ]メニューから利用),Visual Basicの基本機能として接続しているすべてのデータベースの情報を参照できる
データレポート × Accessのレポートに似たマイクロソフト社製の帳票デザイン&印刷ツール
SQLエディタ × × ストアド プロシージャをSQL Serverおよび Oracleデータベースに追加できる
ADOデータコントロール ADO対応のデータコントロール
階層フレキシブルコントロール OLE DB対応のMSFlexGridコントロールの新版
データリピータコントロール × データリピータコントロール上に他のコントロールを配置すると,Accessの「表形式」のように同一フォーマットの複数列表示が可能
フォーマットオブジェクト データベースと連結コントロールの間で双方向のデータ型変換を実行.データベースでは日付型,連結コントロールでは編集した文字列型などの指定が可能.
DataGridコントロール OLE DB対応のDbGridの新版
DataListコントロール OLE DB対応のDbListの新版
DataComboコントロール OLE DB対応のDbComboの新版
データオブジェクトウィザード × Data Environment またはユーザー コントロールに連結される中間階層オブジェクトの作成を自動化
フレキシブルグリッドウィザード × 階層フレキシブルコントロールの属性定義を簡略化
データフォームウィザードの機能拡張 × データコントロールを使わない「まともな」データフォームを作成可能
セットアップウィザードの機能拡張 ADO,OLE DB,RDO,ODBC,および DAO をサポート
ADO OLE-DBを使うオブジェクト.OLE DBとADOの関係は,ODBCドライバマネージャとRDOの関係と同じようなもの.
ADO Recordsetの受け渡し Public Functionの変数型としてADO Recordsetを指定可能.このPublic Functionを中間層として,ActiveX DLL,ActiveX EXE化して複数プロセス(ローカル及ぶリモート)間で,レコードセットを受け渡せる
OLE DBプロバイダの作成 独自のOLE DBプロバイダをActiveX DLLとして作成可能

データアクセス支援機能の新機能
高度なデータ連結
Pro Ent

 今までデータ連結といえば,テキストボックスコントロールなどのデータコンシューマに,DAC(データコントロール:内部的にDAOを利用)やRDC(リモートデータコントロール:内部的にRDOを利用)などのようにマイクロソフトやサードパーティから提供されている既存のデータソースを指定して,自動的にRDBMSのレコードを表示することを指しました.既存のデータソースを利用することで効率よくデータベースアプリケーションを開発できましたが,大抵のデータソースには柔軟性がないためにでき上がったアプリケーションの使い勝手はあまりよいものではありませんでした.VB6では,DataSourceプロパティにDAC,RDC,ADODC(ActiveX Data Objectsデータコントロール:内部的にADOを利用)などの既存のデータソースが指定できるだけではなく,ユーザーデータコントロール,Data Environmentオブジェクトも指定できます.また,BindingCollectionオブジェクトを介して,クラスモジュールをデータソースにすることもできます(図2).データソースとして,プログラム可能なものが指定できるということは,かなり自由度の高いデータ連結が可能になるということです.

図2:BindingCollection
図2

実行時連結

 データソースとデータコンシューマの連結がデザイン時だけではなく実行時にも,

Set txtField(0).DataSource = adodcMDB
のような形で指定可能になりました.
 この新機能の重要な点は,単純にデータソースをいろいろ切り替えて表示できるというものではなく,コントロール配列を動的に増加させたときに,その増加したコントロールにデータソースを設定できることです(リスト1).もちろん,データソースを複数用意して,それぞれの接続を保持しながら表示を切り替えることもできます.
 この新機能で注意したいのは,DACとRDCについては,従来通り実行時の指定は不可能で,デザイン時のみ指定可能な点です.もし,DAOやRDOを使った接続を実行時に指定したいときは,DAOやRDOを暮すモジュールでラッピングして,そのクラスをデータソースとして指定することになります.

リスト1:実行時接続サンプル(frmLBindCtl.frmより抜粋)
Private Sub cmdAdd_Click()
' コントロールの追加
    mlngCnt = mlngCnt + 1
    Load lblTitle(mlngCnt)
    Load lblData(mlngCnt)

' コントロールのプロパティ設定
    lblTitle(mlngCnt).Left = lblTitle(0).Left
    lblTitle(mlngCnt).Top = lblTitle(mlngCnt - 1).Top + _
                            lblTitle(mlngCnt - 1).Height
    lblTitle(mlngCnt).BorderStyle = lblTitle(0).BorderStyle
    lblTitle(mlngCnt).Height = lblTitle(0).Height
    lblTitle(mlngCnt).Visible = lblTitle(0).Visible

    lblData(mlngCnt).Left = lblData(0).Left
    lblData(mlngCnt).Top = lblData(mlngCnt - 1).Top + _
                           lblData(mlngCnt - 1).Height
    lblData(mlngCnt).BorderStyle = lblData(0).BorderStyle
    lblData(mlngCnt).Height = lblData(0).Height
    lblData(mlngCnt).Visible = lblData(0).Visible


' 選択したbiblio.mdbとコントロールを連結する。
    lblTitle(mlngCnt).Caption = _
                   adcMDB.Recordset.Fields(mlngCnt).Name
    Set lblData(mlngCnt).DataSource = adcMDB
    lblData(mlngCnt).DataField = _
                   adcMDB.Recordset.Fields(mlngCnt).Name

' 上限設定
    If adcMDB.Recordset.Fields.Count <= mlngCnt + 1 Then
        cmdAdd.Enabled = False
    End If
End Sub

データアクセス支援機能の新機能
Data Environmentデザイナ
Pro Ent

 Data Environmentデザイナは,Visual Basic 5.0で提供されていたユーザーコネクションデザイナのOLE DB版です.ヘルプの記述では,ユーザーコネクションデザイナのすべての機能をサポートしているとありますが,RDOの接続をデザインすることはできません.Data EnvironmentデザイナでODBCデータソースと接続するときは,OLE DB Provider for ODBC Drivers経由の接続になります.RDOに対しては,従来通りのユーザーコネクションデザイナを使います.ユーザーコネクションデザイナとの相違点を表2にまとめてみました.

表2:Data Environmentデザイナとユーザーコネクションデザイナの相違点
機能 Data Environmentデザイナ ユーザーコネクションデザイナ
データアクセスオブジェクト ADO RDO
公開されるオブジェクト 複数の ADO Connection オブジェクトと ADO Command オブジェクト 単一の UserConnectionオブジェクトと複数のQueryオブジェクト
公開されるイベント Connection オブジェクトと Command オブジェクトに対するすべての ADO イベント UserConnectionオブジェクトからのイベントのみ
直接データ連結(データソース) データソースとして,フォームのコントロールと直接連結可能 不可能
アクセス可能なメンバ DataEnvironment オブジェクトからアクセスできるCommand オブジェクトごとの RecordSet プロパティ UserConnection オブジェクトの ResultSet へのクエリーのみ
デザイン環境 Connection オブジェクトと Command オブジェクトの一覧および各 Command オブジェクトから返される Field オブジェクトを表示する Queryオブジェクト一覧を表示するだけ

データリンクを設定する

 Data EnvironmentデザイナをVisual Basicプロジェクトで使うには,
  1. [プロジェクト]-[コンポーネント]メニューの[デザイナ]タブで[Data Environment]をチェックし,デザイナを有効にします(図3)

    図3:デザイナの追加
    図3

  2. [プロジェクト]-[その他のActiveXデザイナ]メニューから[Data Environment]を選択し,Data Environmentデザイナ(図4)をプロジェクトに追加します

    図4:Data Environmentデザイナ
    図4

  3. Connectionオブジェクトのプロパテイウィンドウを使って,デザイン時に設定できる接続プロパティの設定値を指定します
  4. [プロバイダ]タブでは,接続に使うOLE DBプロバイダを選択します(図5).他のタブへの移動は,タブを左クリックする以外に,[次へ]ボタンを左クリックしても行なえます

    図5:[データリンク]-[プロバイダ]タブ
    図5

  5. [接続]タブの情報は,選択したOLE DBプロバイダごとに異なります.図6は「Microsoft Jet 3.51 OLE DB Provider」を選択したときの画面です.ここで[接続のテスト]ボタンを左クリックして,接続に成功しない状態だと[詳細設定]タブの各項目に値を設定することはできません

    図6:[データリンク]-[接続]タブ
    図6

  6. [詳細設定]タブでは,OLE DBプロバイダの初期化パラメーターを指定します(図7).偽装レベルと保護レベルは,RPC以外のネットワーク接続でRPCが用意している機能を擬似的に実装する機能です.OLE DBプロバイダによっては機能しません.アクセス権は,大抵のOLE DBプロバイダがサポートしているようです

    図7:[データリンク]-[詳細設定]タブ
    図7

  7. [すべて]タブは,初期化プロパティの内容を表示します.ADOでの接続をコーディングするときの設定値に迷った時の参考値にもなります(図8)

    図8:[データリンク]-[すべて]タブ
    図8

という手順で設定します.

コマンドを設定する

 Data Environmentデザイナで設計した結果は,Data Environmentオブジェクトとしてプログラムから扱うことができます.
 オブジェクト構造図(図9)をみると,Data Environmentデザイナで接続(Connectionオブジェクト)を設定してからコマンド(Commandオブジェクト)を設定する必要がありそうだ,ということが推測できると思います.このコマンドが,ストアドプロシージャやSQL文に対応します.コマンドの追加は,接続を選択して行ないます.そして,プロパティを設定することで,コマンドにSQL文などを割り当てます.コマンドには子コマンドを追加することができます(図10).これは,コマンド間にリレーションを貼ることで実現している機能で,コマンド階層と呼びます.

図9:Data Environmentオブジェクト構造
図9

図10:コマンド階層
図10

◆[全般]タブ(図11)
 全般タブの機能は,コマンドに対応したデータベースオブジェクト(テーブル,ビュー,ストアドプロシージャ,シノニムなど)またはSQLステートメントを設定することです.SQLステートメントを指定するときには,SQLビルダを使ってビジュアルにSQL文を組み立てることができます.しかし,なぜかSQLビルダでビジュアルにテーブル名を追加することができませんでした.事前にFROM句にテーブル名を指定したSQL文を指定してから,SQLビルダを起動した方が使いやすいようです.図9のDEFieldオブジェクトに対応します.

図11:[コマンド]-[全般]タブ
図11

◆[パラメータ]タブ(図12)
 パラメータタブの機能は,パラメータを持つストアドプロシージャやパラメタクエリーを全般タブで指定したときに有効になります.図9のDEParameterオブジェクトに対応します.

図12:[コマンド]-[パラメータ]タグ
図12

◆[リレーション]タブ(図13)
 リレーションタブの機能は,子コマンドを選択したときに有効になります.このタブの情報を使って,親コマンドと子コマンドの関係を定義します.親子関係をオブジェクトの中で取り扱うことができるのが,OLE DBが他と異なる点です.図9のDERelationConditionオブジェクトに対応します.

図13:[コマンド]-[リレーション]タブ
図13

◆[グループ化]タブ(図14)
 グループ化タブの機能は,SQL文のGROUP BY句のように,あるフィールドの値ごとにレコードをまとめます.まとめ方の定義は,[グループコマンド名]をつけて,この名前で取り扱うことになります.図9のDEGroupingFieldオブジェクトに対応します.

図14:[コマンド]-[グループ化]タブ
図14

◆[集計]タブ(図15)
 集計タブの機能は,合計関数などの集合関数やユーザー定義の式を管理することです.図9のDEAggregateオブジェクトに対応します.

図15:[コマンド]-[集計]タブ
図15

◆[詳細設定]タブ(図16)
 詳細設定タブの機能は,Commandオブジェクトに対応する結果セットの管理情報を主に設定します.

図16:[コマンド]-[詳細設定]タブ
図16

Data Environmentオブジェクトの使い方

 デザイン結果であるData Environmentオブジェクトは,あたかもADOを操作しているようにプログラムから操作することができます.
 Data Environmentデザイナをプロジェクトに追加すると,Microsoft Data Environment Instance 1.0が自動的に参照設定に加わります.このDLLを経由して,デザイン結果をオブジェクトとしてプログラムに公開することになります.たとえばdenvDAOという名前のData Environmentオブジェクトをデザインしたときは,

Dim deDao  As denvDAO
として,プログラムで使えるオブジェクト変数に割り当てることができます.

フォームへのドラッグ&ドロップ

 Data Environmentオブジェクトのすごさは,データソースとして指定できたり,プログラムから操作できることではありません.Data Environmentデザイナからフォームへ,コマンドやフィールドをドラッグ&ドロップすることにより,まるでAccessのように自動的にコントロールを貼り付けることができることです(図17).しかも,貼り付けた後の編集やデバッグ環境は,Visual BasicのIDEそのものです.Accessの手軽さでコントロールの配置ができて,その後の作業が楽になる方法ができたといえるでしょう.しかもテキストボックスの名前は,「txtAu_ID」のようにLNC(Leszynski Naming Conventions)に沿った名前が生成されます.ただし,テキストボックスと意味するtxtタグの後ろに続く基本名「Au_ID」はフィールド名そのものです.Data Environmentデザイナーのフィールドのプロパティで設定できるのは,ラベルのキャプションだけです.つまり日本語のフィールド名を採用しているときには,日本語のコントロール名になってしまうということです.日本語のコントロール名や変数名などは,今までのVisual Basicでも危険ポイントでしたから,フィールド名が日本語のときは,コントロール名の付け直しが必要でしょう.

図17:デザイナからのドラッグ&ドロップ
図17

データアクセス支援機能の新機能
Visual Data Toolsの統合
Ent

 Visual Data Tools(VDT)は,SQL ServerをはじめとするRDBMS管理用のツールです.Visual Basic 5.0では,Microsoft Developer Studioの一部やアドインとして使うことができましたが,Visual Basic 6.0では,IDE(統合開発環境)に含まれ,データビューの機能拡張部分となりました.そのため,Enterprise版のデータビューでは,ストアドプロシージャの管理も可能になります.しかし,VB6のVDTは,ADOベースのツールとなってしまい,接続先はすべてOLE DBプロバイダを指定することになります(図18).

図18:VDT
図17

SQL Serverとの接続

 VDTとSQL Serverの接続には,
  1. データリンクを右クリックして表示されるショートカットメニューの[データリンクの追加]を左クリック
  2. OLE DBプロバイダを選択(図3〜7と同様)
という手順を踏みます.正常にログインが完了するとデータリンクが追加されます(図19).

図19:データビュー
図19

 これは前版のVDTでもいえることですが,RDBMSと実際に接続できる環境にないと使うことができない点に注意してください.RDBMSと同期を取る必要があるためと思います.しかし,RDBMSの定義情報だけでもローカルに保存して,VDTで表示だけでも実現して貰えたら,RDBMS環境がお客様のところにあるようなときに便利だったでしょう.

データビューの使い方

◆[データベースダイアグラム]フォルダ
 [データベースダイアグラム]フォルダに含まれるアイテムは,データベースに含まれるリレーションシップを選択表示しています(図20).すべてのリレーションシップが自動的に表示される訳ではなく, データベース自体にリレーションシップが定義されているテーブルを[テーブル]フォルダからドラッグ&ドロップすることで表示します.もちろん,ここでリレーションシップを定義することもできます.

図20:[データベースダイアグラム]
図20

◆[テーブル]フォルダ
 [テーブル]フォルダに含まれるアイテムは,データベースに含まれるテーブルを表示します(図21).[テーブル]アイテムの機能は,
などです.

図21:[テーブル]
図21

◆[ビュー]フォルダ
 [ビュー]フォルダに含まれるアイテムは,データベースに含まれるビューを表示します(図22).ビューに含むテーブルは[テーブル]アイテムからドラッグ&ドロップすることで取り込むことができます.この機能は,随時GUIとSQL文で確認可能なので,さまざまなスキルの人が快適に使うことができると思います.

図22:[ビュー]
図22

◆[ストアドプロシージャ]フォルダ
 [ストアドプロシージャ]フォルダに含まれるアイテムは,データベースのストアドプロシージャを表示します(図23).この機能は,SQLエディタと呼ばれる機能に相当します.VDTと同様にデータビューに統合されたツールです.使い方は,トリガと同じようにストアドプロシージャ記述言語を直接コーディングしてゆきます.GUIによる設定はできません.またVisual InterDevやVisual C++をインストールしないとメニュー(図24)に表示される[デバッグ]を選択した際にエラーとなります.Visual Basicだけのときも,アドインのT-SQLデバッガを使ってストアドプロシージャのデバッグが可能ですが,VDTを統合データベース管理ツールとして位置づけるためには,Visual InterDevやVisual C++のインストールが必要不可欠だと言えるでしょう.

図23:[ストアドプロシージャ]
図23

図24:[ストアドプロシージャ]メニュー
図24

 なお,データビューを開いたままIDEを終了すると,次回IDEを起動したときにデータビューの状態も復元されます.

Data Enviromentオブジェクトとの併用

 VDTのData Environment接続とVisual BasicプロジェクトのData Environmentオブジェクトの情報が共有されるようになりました.たとえばVDTを起動したときに開いているVisual BasicプロジェクトにData Environmentオブジェクトがあれば,その定義から自動的にData Environment接続を表示し,Visual BasicプロジェクトでData Environmentオブジェクトを解放するとVDT上からも削除されます.つまりData Environmentに関しては,Visual Basicプロジェクト側が主であり,VDTは従という関係になります.

Oracle対応

 Oracle対応も謳われていますが,現在のバージョンであるOracle8ではなく,Oracle7の機能にのみ対応しています.ですからNET8ではなく,SQL*Net 2.3.x Clientが必要です.なおSQL*Net 2.3.x Clientを経由してOracle8に接続することは可能です.またストアドプロシージャのデバッグはできません.

データアクセス支援機能の新機能
データリポート
Pro Ent

 Visual Basicの印刷といえば,Crystal Reportsが定番でした.Crystal Reportsはレポート作成ツールとしては優秀ですが,帳票作成ツールとしては,力不足な点が多少ありました.そのため日本のサードベンダー製の帳票作成ツールを別途購入したり,Excel,Word,Accessなどを印刷ツールとして利用してきました.
 VB6では,そのAccessのレポート機能を抜き出してきたようなデータリポートが新機能として追加されました.

データレポートデザイナの使い方

 VBプロジェクトにData Reportを追加するには,[プロジェクト]-[Data Reportの追加]を選択します(図25).データレポートデザイナは,見た目がAccessのレポートに似ているので見た目と操作性のギャップに苦しむかもしれませんが,使い方はフォームに対してテキストボックスコントロールなどを貼り付けてゆくのと同じです.

図25:Data Reports Designer
図25

 データの印刷位置を設定したら,連結したいデータソースを指定します.標準的な使い方は,Data Environmentオブジェクトを作成して,これをデータソースとして指定する方法です.そして,Data Report自体のDataMemberプロパティにCommandオブジェクトを指定すれば,貼り付けたコントロールのDataMemberオブジェクトを指定する必要はありません.DataFieldプロパティのみを指定するだけで十分です.また,Data EnvironmantデザイナからCommandオブジェクトをドラッグ&ドロップしてもデザイン可能です.しかし,このときは縦方向にフィールドが展開されてしまうので,一覧表などにしたいときは,自分でコントロールを配置するのがよいでしょう.

Data Report オブジェクトを使う

 デザイナーの使い方がフォームに対するデザインと同じというだけではなく,デザイン結果であるData Report オブジェクトもフォームオブジェクトの一種として位置づけられると思います.ですからフォームを表示するときにShowメソッドを実行するように,Data Reportオブジェクトのプレビュー表示にはShowメソッドを実行します(図26).

図26:プレビュー画面
図26

 さすがに印刷用のメソッドは,フォームオブジェクトと同一ではなく,PrintReportメソッドになります.パラメータとして[印刷]ダイアログボックス表示の有無やページ指定の有無などが指定できます.またExportReportメソッドにより,HTML形式のファイルに出力することもできます.このときのHTMLのスタイルは,Microsoft OfficeからHTML形式で保存したときと同じようなスタイルです.

データアクセス系コントロールの新機能
ADODC
Lrn Pro Ent

 データアクセス系コントロールの新機能の目玉が,このADODC(ActiveX Data Object Data Control)でしょう.このコントロールのプロパティページ(図27)では,

図27:ADODCのプロパティページ
図27
  1. データリンクファイル
  2. ODBCデータソース
  3. 接続文字列
の3種類の接続方法が提供されています.ここでの設定結果はConnectionStringプロパティなどに自動反映されます.

データアクセス系コントロールの新機能
階層フレキシブル コントロール
Lrn Pro Ent

 ADOは,取得したレコードにコマンド階層という親子関係を割り当てておくことができます.このことにより,マスタ−ディテール表などの関係をADOの中に定義できる訳です.その関係を素直に表現したのが階層フレキシブルコントロールです.Data Environmentオブジェクトなどをデータソースとして指定して実行すると図28のように親子関係が反映されたグリッドが表示されます.グリッド中の[+]や[-]をクリックすると詳細を展開したり閉じたりできます.
 階層フレキシブルコントロールを使うときの問題は,コントロールが表示されるときにすべての情報を取得することです.階層を下にたどるときに情報を取得できるようなオプションが存在しないので,RDBMSなどから遅い回線を通して情報を取得するときは注意が必要です.

図28:階層フレキシブルグリッドコントロール
図28

データアクセス系コントロールの新機能
データリピータコントロール
Pro Ent

 データリピータコントロールは,RDBMSの1レコードを1行で表示しなければならなかったグリッドコントロールの限界を打破したコントロールです.仕組みは簡単です.データリピータコントロールは,任意に割り当てたひとつのコントロールを,データソースのレコード数分だけ繰り返し(リピート)て表示します.しかし,これでは1列が複数行表示されるだけです.そこで,既存のコントロール以外にユーザーが作成したActiveXコントロールも指定できるようにしています.
 ユーザー作成のActiveXコントロールを使って繰り返し表示するには,
  1. ActiveXコントロールのプロジェクトを作成して,コントロールを配置する(図29)

    図29:ActiveXコントロール
    図29

  2. コントロールに応じたカスタムインターフェイスメンバを作成(図30)

    図30:カスタムインターフェイスメンバ
    図30

  3. カスタムインターフェイスメンバのプロシージャ属性を設定(図31).このとき,すべてのメンバの[プロパティをデータに連結]チェックボックスをチェックし,任意の1メンバのみ[このプロパティをDataFieldに連結]チェックボックスをチェック

    図31:プロシージャ属性
    図31

  4. ActiveXインターフェイスウィザードでマッピングの設定を行なう(図32).メンバはDataMembersプロパティを指定.

    図32:マッピングの設定
    図32

  5. ActiveXコントロールをコンパイルして,OCXファイルを作成(プロジェクトファイルも保存).同一プロジェクトグループ内にあってもOCX化は必須

  6. データリピータコントロールを使うVBプロジェクトを作成

  7. RepeatedControlNameプロパティにActiveXコントロールの名前を指定.例えばコントロール名「Repaet」,オブジェクト名「uctRepeat」のときは「Repeat.uctRepeat」を指定する.コントロールをドラッグ&ドロップしてもデータリピータコントロールに他のコントロールを割り当てることはできない

  8. データリピータコントロールのプロパティページの[連結]タブ中で,ActiveXコントロールのインターフェイスとデータソースのフィールドを連結(図33)

    図33:[連結]タブ
    図33

とします.よってデータリピータコントロールを使うときには,どのようなコントロールが必要かを,事前にきちんと設計しておく必要があります.

データアクセス系コントロールの新機能
フォーマットオブジェクト
Lrn Pro Ent

 フォーマットオブジェクトを使うと,BindingCollectionオブジェクトとデータコンシューマの間で受け渡すデータの形式を変換することができます(図34).

図34:データフォーマットオブジェクト
図34

 フォーマットオブジェクトを割り当てるためには,
  1. イベント付きのフォーマットオブジェクトを宣言します

    Dim WithEvents sdfField As StdDataFormat
    

  2. フォーマットオブジェクトを生成して,フォーマットを指定します

    sdfField.Type = fmtCustom
    sdfField.Format = "long date"
    

  3. BindingCollectionオブジェクトのAddメソッドの第四パラメタとして,フォーマットオブジェクトを指定します

    bcFld.Add txtHire, "text", "dtmHire", sdfField
    
とします.このように設定することにより,テキストボックスコントロールは,あたかも「Long Date」型のコントロールのように振る舞うことができます.
 フォーマットオブジェクトは,Format関数 (通貨,日付と時刻,文字列など) によってサポートされている標準の形式以外にも,プール型,バイナリ型,オブジェクト型,ピクチャー型,チェックボックス型がサポートされ,従来「Accessなら簡単にできるのに,どうしてVisual Basicではできないの?」と思っていたことが実現できるようになりました.
 また,フォーマットオブジェクトが用意していない形式も,FormatイベントとUnFormatイベントの中でDataValueオブジェクトのプロパティを操作することで独自形式に変換,復元することができます.

データアクセス系コントロールの新機能
DataXXXコントロール
Lrn Pro Ent

 DataGridコントロール,DataListコントロールおよびDataComboコントロールは,それぞれDbGrid,DbList,DbComboコントロールのADO対応版です.

データアクセス新機能を眺めてみて

 ひと通りデータアクセスの新機能を見てきました.詳細を調べる前の新鮮な驚きは持続していますか? 私はしていません.もう少しなんです.もう少しだけ仕様を練ってくれていたら,きっと素晴らしいものになっていたと思うのです.
 たとえば,

データリピータコントロールで,直接複数のコントロールを貼り付けられないのか.

などはとても不思議です.
 何か「ActiveX」というコンポーネント化の手法に溺れてしまった感じがします.Visual Basicの優位性である「結果を思い浮かべながら少しずつ作業すればよい」というスタンスが薄れてしまったと思います.Visual Basic 5.0でActiveXコントロールを作成するときに,事前にプロパティやメソッドをきちんと設計することが完成への近道でした.後からプロパティやメソッドを変更することはクラスIDの変更を招き,コントロールの配布の問題などが発生してしまいます.それと同じことがVB6のデータアクセス新機能にも適用されます.
 大規模な開発を行なうならば,事前にきちんとした設計をすることが必要不可欠です.しかし――きちんとしたコーディング規約とレビューの徹底が前提ですが――開発作業を効率化するには,実状にあった開発が行なえるため,言語仕様的に柔軟である方が良いと思います.また,試行錯誤で言語を習得しようとしたときにも,気が付くとレジストリが存在しないコントロールのクラスIDだらけになってしまい,Windowsの起動が遅くなる原因となります.言語習得すらも体系立てて行なってゆく必要があるでしょう.
 このような問題をクリアするには,ずばり「最初のうちは,Visual Basic 6.0のデータアクセス新機能のなかで,ユーザーコントロールの作成が必要な機能は使わない」のが一番でしょう.もちろん,これは言語の安定度が悪くてSPが出るまで待ちましょうということではなく,使う側がActiveXコントロールの設計を習得するまで,その機能を前提にしたシステム開発は控えた方がよいということです.
 来月は,ADOの実用性に迫ってみます.

[動作確認環境]
PentiumMMX200Mhz, メモリ128MB
Windows 95 4.00.950B
IE4.0 4.72.3110.8
Visual Basic 6.0 Version8176


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

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