Visual Basic 業務アプリ構築法 第11回

ADODataコントロールの扱い(1)~データベースの接続と初期設定
長谷川裕行
1999/03/08

長谷川 裕行 (はせがわ ひろゆき)
有限会社 手國堂 代表取締役
http://www.hirop.com/
テクニカルライターとして活躍。プログラミングに関する著書多数、DB Magazineなどにも多くの記事を提供している。

これまでに、Dataコントロールによる単純なデータベースの扱いと、データフォームウィザードによるフォームの作り方を紹介してきました。これらの方法を用いれば、時間をかけることなくデータベースを扱うアプリケーションが作れます。
が、当然のことながら、小回りの効く凝った処理を作ることはできません。細かな処理を行わせようと思えば、やはりコードレベルでデータベースを扱う必要が生じてきます。
今回はADODataコントロールを使って、コードレベルでデータベースを操作する方法を紹介します。



ADODataコントロール

今回は、ADODataコントロールを使って「データベースの接続」「レコードの移動」「追加・削除・更新」といった基本的な機能を実現します。これまではプロパティを設定したり、質問に答えるだけで、同じことを簡単に実現できました。が、ここではそれらの機能をコードの記述で実現してみます。
ADODataコントロールのADOとは“Active X Data Objects”の略で、旧来のDAOやRDOに代わるデータベース制御方法として推奨されているものです。使い方はDAOと大きく変わりませんが、ネットワークを介したクライアント・サーバー型データベースでの利用や、インターネット/イントラネットでのデータベース制御機能など、優れた特長があります。
ADODataも、VBに標準で備わっているDataコントロールとほとんど同じように扱えます。ここで紹介するような簡単な処理なら、Dataコントロールを使っても構わないでしょう。が、将来ネットワーク・アプリケーションやWebアプリケーションを作成するつもりなら、ADOの扱いに慣れておいた方がよいと思います。



フォームのデザイン

ここで作成するアプリケーションは、これまでと同じ住所録です。フォームは画面1のようになり、前回データフォームウィザードで作成したものと、ほとんど同じです。まず、フォームをデザインしましょう。


- 作成するアプリケーションの外観 -


フォームのデザインは、画面2のとおりです。データフォームウィザードを使った場合とは異なり、ADODataコントロールとは別にレコード移動ボタンが貼り付けられています。また、[追加][更新]などのボタンの位置も違います。
データフォームウィザードを使うと、レコードの移動にはADODataコントロールの移動ボタンを使うように設定され、[追加][更新]などのボタンは自動的に生成されました。しかしすべてをコードで実現する場合には、これらもすべてコントロールをフォームに貼り付け、1つひとつその動作を定義していかなければなりません。
レコードの移動にはADODataコントロールを使っても構わないのですが、レコードの移動時に何か他の処理を実行させたり、ボタンのデザインを変更したい場合には、コマンドボタンを使う必要が生じます。

画面1:作成するアプリケーションのフォーム
基本的な機能はこれまでと同じ
画面2:フォームのデザイン


- コントロールの配置 -

まず、フォーム上のコントロールの設定を行います。テキストボックスを8個とコマンドボタンを8個、ADODataコントロールを1個貼り付けます。
フィールド名を示すラベルやレコード移動ボタンの周りのフレームなどは、画面1、画面2を参考にして適宜貼り付けて設定してください。これらは、アプリケーションの機能としては必須のものではありません。



- ADODataの登録 -

VBのプロジェクトでADODataコントロールを使用するには、まずツールとしてADODataを組み込まなければなりません。メニューから「プロジェクト(P)」→「コンポーネント(O)」を選択し「コンポーネント」ダイアログボックスをオープンさせ、

Microsoft ADO Data Control 6.0 (OLEDB)

をチェックして[OK]をクリックします(画面3)。
これで、ツールボックスに画面4のようなADODataのアイコンが登録されます。あとは、他のコントロールと同じようにしてフォームに貼り付け、プロパティを設定します。

画面3:ADO Data Controlをチェックする
画面4:ADODataのアイコンが追加された



- ADODataの設定 -

ADODataコントロールは、オブジェクト名を“datAddress”とします。その他のプロパティは表1のように設定しましょう。Visibleプロパティ以外は標準のままで構わないはずですが、念のために確認しておきましょう。
VisibleプロパティをFalseとするので、アプリケーション実行時にはADODataコントロールは表示されなくなります。その代わりに、コマンドボタンでレコードの移動を行うのです。

表1:ADODataのプロパティ

プロパティ 設定
オブジェクト名 datAddress
BOFAction 0 - adDoMoveFirst
CommandType 8 - adCmdUnknown
ConnectionString (空白)
Enabled True
EOFAction 0 - adDoMoveLast
Visible False


- テキストボックスの設定 -

テキストボックスはコントロール配列とします。まずテキストボックスを1個貼り付け、オブジェクト名を“txtFields”と設定します。Textプロパティは空白としておきましょう。DataSourceには、先に貼り付けたADODataコントロール“datAddress”を指定します。
これを選択して「編集(E)」→「コピー(C)」でクリップボードにコピーし、そのまま「編集(E)」→「貼り付け(P)」を選ぶと、「コントロールをコントロール配列とするか?」確認してきます。[はい]をクリックすると、コピー元のコントロールと同じプロパティ設定のテキストボックスが貼り付けられます。



- コントロール配列 -

このとき、元のテキストボックスは“txtFields(0)”、貼り付けられたテキストボックスは“txtFieldes(1)”となり、さらに貼り付けを繰り返すと“txtFields(2)”、“txtFields(3)”とオブジェクト名の後ろの( )内の番号が増えていきます。
( )内の番号を添字といい、同じ名前で添字の部分が異なるコントロールが次々と貼り付けられるようになります。データベースのフィールドのように、基本的な用途が共通していて細かな設定だけが異なるコントロールの場合、コントロール配列としておくと後の操作が楽になります。
ここでは8個のテキストボックスを用いるので、txtFields(0)からtxtFields(7)まで貼り付けます。添字が0から始まっていることに注意しましょう。



- コマンドボタンの設定 -

コマンドボタンのプロパティは表2のように設定します。
レコード移動ボタンも、このようにコマンドボタンで実現します。ここでは記号を使って|<のようにしましたが、ビットマップ画像を用意してPictureプロパティに設定すれば、もっとそれらしいボタンデザインとなるでしょう。

表2:コマンドボタンのプロパティ

プロパティ 設定
オブジェクト名 cmdQuit
Caption 閉じる
オブジェクト名 cmdAddNew
Caption 追加
オブジェクト名 cmdUpdate
Caption 更新
オブジェクト名 cmdDelete
Caption 削除
オブジェクト名 cmdMoveFirst
Caption |<
オブジェクト名 MovePrevious
Caption <
オブジェクト名 cmdMoveNext
Caption >
オブジェクト名 cmdMoveLast
Caption >|
プロシージャの作成

フォームができたら、ADODataにデータベースを接続する処理を作成しましょう。
ADODataはDataコントロールと似ていますが、若干扱いが異なります。



- データベース・ファイルの保存場所 -

これまでは、データベースファイルがC:\Dbフォルダに存在するという前提でアプリケーションを作ってきました。そのため、DataコントロールのDatabaseNameプロパティやデータフォームウィザードのデータベースの場所では、直接C:\Db\Addr01.mdbを指定しました。
しかしこの方法では、完成したアプリケーションを他のマシンで実行する場合に、問題の生じる可能性があります。実行する環境によっては、必ずしも期待しているフォルダ(C:\Db)にデータベースファイルが存在するとは限らないからです。
多くの場合、特定のアプリケーションでしか使用しないデータファイルは、そのアプリケーションの実行ファイルと同じフォルダに保存するのが最適です。そうしておけば、実行ファイルがどこに保存されていようが、「自分自身と同じフォルダ」を探せばよいことになります。



- 自分自身の保存場所を取得する -

自分自身の保存されているフォルダは、AppオブジェクトのPathプロパティで取得できます。例えばアプリケーションが"D:\Apps\Database"フォルダに保存されていれば、

Dim strPathName
strPathName = App.Path

でstrPathNameには"D:\Apps\Database"という文字列が代入されます。
このことを利用して、まずADODataにデータベースを接続する処理を作ります。


- 記号定数とグローバル変数 -

宣言セクションGeneral-Declarationsで、リスト1のように記号定数とグローバル変数の定義を行います。
DB_NAMEはデータベース・ファイルの名前です。ここを変更すれば、異なるデータベースも利用できます。 CON_STRINGはADODataにデータベースを接続する際に使用する接続文字列です。PROVIDERとしてデータベースエンジンの種類、Data Sourceとしてデータベース・ファイルを指定します ※1
SQL_STRINGは、レコードセットを生成するためのSQL文です。SQLとは各種データベースを統一的に扱うための命令体系で、これによってテーブルから特定のフィールド構成で特定のレコードだけを抽出するクエリーが作れます。SQLについて詳しくは、回を追って紹介します。ここでは、この方法でテーブルのレコード構成を定義できることだけを理解しておいてください。
String型のstrDbPathNameは、データベースのフルパス名(ドライブ・フォルダ名を含んだ完全な名前)を保存する変数です。このアプリケーションでは使用しませんが、規模の大きなアプリケーションで処理のあちこちからデータベースを参照するような場合、そのフルパス名をグローバル変数として保存しておくと便利です。

※1:ADOではこの方法でODBCを介さずにmdbファイルをアクセスできます。ADOはWebアプリケーションを作成するASP(Active Server Pages)でも利用できるため、Webアプリケーションでmdbファイルを直接扱えるのです。


リスト1:記号定数とグローバル変数の定義


- データベースのパス名を生成する -

リスト2のSetDbPathが、アプリケーションの存在している場所に保存されたデータベースを、ADODataに接続している部分です。

strDbPathName = App.Path & "\" & _
DB_NAME


で、AppオブジェクトのPathプロパティから取得した自分自身の存在するパス名に、記号定数DB_NAMEを連結し、データベースのフルパス名を生成しています。 さらに記号定数CON_STRINGにstrDbPathNameを連結し、ADOへの接続文字列を完全なものにします。

strConnectString = CON_STRING & _
strDbPathName & ";"


リスト2:自分自身の保存されている場所に存在するデータベースを、ADODataに接続する


- データベースの接続 -

ADODataコントロールでは、ConnectStringプロパティに接続文字列を設定することで、データベースを接続できます。

datAddress.ConnectionString = _
strConnectString

データベースを接続したら、RecordSourceプロパティにSQL文を代入してレコードセットを生成します。

datAddress.RecordSource = _
SQL_STRING

ここで

datAddress.RecordSource = _
"T_住所録"

とすれば、テーブル“T_住所録”を直接指定できます。この場合はSQL文を利用し、テーブル“T_住所録”のレコードを「ID」フィールドの順に並べ替えるようにしています。



- フィールドの設定 -

リスト3は、フォーム上のテキストボックスに、ADODataに接続されたデータベースのレコードセットのフィールドを設定する処理です。先にテキストボックスのDataSourceプロパティにdatAddressを指定しているので、ここではDataFieldだけを設定すればよいのです。
もしテキストボックスのDataSourceを設定していなければ、ここで

Dim i As Integer
For i = 0 To 7
  txtFields(i).DataSource = "datAddress"
Next i

として、Forループで一括指定できます。コントロール配列の便利な機能です。

リスト3:テキストボックスにフィールドを連結する

Private Sub SetFields()
  txtFields(0).DataField = "ID"
  txtFields(1).DataField = "読み"
  txtFields(2).DataField = "氏名"
  txtFields(3).DataField = "性別"
  txtFields(4).DataField = "電話番号"
  txtFields(5).DataField = "郵便番号"
  txtFields(6).DataField = "住所1"
  txtFields(7).DataField = "住所2"
End Sub


- Form_Loadプロシージャ -

ここまでで、
(1) データベースをADODataに接続する
(2) テキストボックスにフィールドを対応させる
という2つの処理ができ上がりました。これらをForm_Loadプロシージャで実行させれば、アプリケーション起動時に必要な初期設定が完了します。
Form_Loadプロシージャは、リスト4のようになります。


リスト4:初期設定でデータベースの接続とフィールドの設定を行う

Private Sub Form_Load()
  SetDbPath
  SetFields
End Sub


今回は、ADODataコントロールを貼り付けてデータベースを接続し、テキストボックスにフィールドを設定するところまでを作成しました。これで初期設定が完了したことになります。
今回提供するサンプルは、既にすべてのボタンにイベントプロシージャを割り当ててあります。これらについてはまだ解説していませんが、動作を確認してみてください。次回は、レコード移動ボタンの実現やエラー処理などについて紹介します。
今の段階では、ADODataの機能と扱いの詳細やSQLによるデータベースの操作などについては、詳しく触れないことにします。まずサンプルのとおりに作成し、動作を確かめてください。まず、完成させて動かすことが第一です。「固いお話」は回を追って取り上げます。

DownloadVBプロジェクトファイルのダウンロード
(LZH形式 32.8KB)
Copyright © MESCIUS inc. All rights reserved.