長谷川 裕行
(はせがわ ひろゆき)
有限会社 手國堂 代表取締役
http://www.hirop.com/
テクニカルライターとして活躍。プログラミングに関する著書多数、DB Magazineなどにも多くの記事を提供している。 |
これまでに、Dataコントロールによる単純なデータベースの扱いと、データフォームウィザードによるフォームの作り方を紹介してきました。これらの方法を用いれば、時間をかけることなくデータベースを扱うアプリケーションが作れます。
が、当然のことながら、小回りの効く凝った処理を作ることはできません。細かな処理を行わせようと思えば、やはりコードレベルでデータベースを扱う必要が生じてきます。
今回は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によるデータベースの操作などについては、詳しく触れないことにします。まずサンプルのとおりに作成し、動作を確かめてください。まず、完成させて動かすことが第一です。「固いお話」は回を追って取り上げます。
VBプロジェクトファイルのダウンロード
(LZH形式 32.8KB) |