長谷川 裕行
(はせがわ ひろゆき)
有限会社 手國堂 代表取締役
http://www.hirop.com/
テクニカルライターとして活躍。プログラミングに関する著書多数、DB Magazineなどにも多くの記事を提供している。 |
3回にわたって、ADODataコントロールによるアプリケーション作成の基礎を紹介してきました。ここで、ADODataコントロールの扱いをまとめておきましょう。最後にレコード移動ボタンにビットマップを設定して、住所録を完成させます。
ここで扱ったADODataコントロールは、ADO(ActiveX
Data Objects)をGUI化したコントロールです。ADOは旧来のデータベース操作オブジェクトDAOにクライアント/サーバーシステムのための機能を盛り込み、ActiveX化したオブジェクトです。
- データベース・エンジン -
既に説明してきたように、データベースとはテーブルやクエリーなどの情報を含んだファイルとして扱われます。データベースには様々な種類があり、個々のデータベースはそれぞれ独自の方法でアクセスされます。
データベースはデータベース・エンジンと呼ばれる機構によって制御されます。つまり、データベース・エンジンごとにアクセス手段が異なるのです。
このアクセス手段のばらつきを統一化するのが、ODBC(Open Database Connectivity)と呼ばれる仕様であり、そこではSQLというデータベース照会言語を用います。
- OLE DB -
SQLを用いることにより、各種データベースはひとまず統一的な手法で扱えるようになりました。が、まだ不十分です。プログラミング言語からSQLを使ってデータベース・エンジンを操作する仕組みを用意しなければなりません。
そこで登場したのがOLE技術をベースにしたOLE DBです。COM(Component
Object Model)インターフェースセットとして、各種データベース・エンジンの差異を吸収する役目を果たします。
このOLE DBをアプリケーションから制御するための手段、即ちAPIを提供するオブジェクトがADOです。ADOはOLE
DBを用いたデータベースアクセスの仲介役を務めます。
図1:ADOがデータベース・エンジンを介してデータベースを操作する
- ADODataとADO -
さらに、ここまでに紹介してきたようにADODataコントロールは、ADOの持つ機能をGUI化し、プロパティとメソッドの操作によってADOを制御し、そこからデータベース・エンジンを制御するようになっています。
つまりADODataコントロールを使いさえすれば、各種データベース・エンジンの仕様の差異を、プログラマーは意識しなくて済むようになるのです。
これまではAccessで用いられているJet3.5データベース・エンジン(mdbファイル)を対象としてきましたが、扱うデータベースはSQL
ServerでもOracleでも構いません。ADODataコントロールに対するプロパティ設定では、接続先のデータベースの種類を変更しなければなりませんが、データベースそのものの扱いに関しては、VBのソースコードレベルでは何の変更も必要ないのです。
図2:ADODataコントロールがADOを介してデータベースをアクセスする
ADODataコントロールの扱い方について整理しておきます。コントロールの外観はDataコントロールと同じですが、プロパティの設定方法が異なっています。
画面1:フォームに貼り付けたADODataコントロール
- データベースの接続 -
ADODataコントロールにデータベースを接続するには、ConnectionStringプロパティを設定します。
プロパティウィンドウでConnectionStringの欄に表示される[...]をクリックすると、画面2のようなダイアログボックスがオープンします。
「接続のソース」でデータベースの接続方法を選択し、テキストボックスに接続先ファイルの情報を入力します。
画面2:ADOにデータベースを接続する
データリンクファイルを使用する(L)
データリンクファイルを用いると、そのファイルを介して様々な形式のデータベースにアクセスできます。[参照]ボタンをクリックしてデータリンクファイルの格納フォルダ(DataLinks)を開き、そこでコンテキストメニューから「新規作成(W)」→「Microsoft
Data Link」を選択してデータリンクファイルを作成し、そのプロパティ・ダイアログボックスで接続先のデータベースを指定できます。接続先はプロパティによって決まるので、プロパティを変更すればファイルを切り替えられます。
画面3:データリンクファイルのプロパティ・ダイアログ
ODBCデータソースを使用する(D)
ODBCドライバを用いた接続を行います。先にコントロールパネルの「ODBC」アプレットで接続するデータベースをデータソースとして登録しておき、そのデータソース名を指定します。
ODBCの利用については、連載の回を追って紹介します。
画面4:ODBCデータソースの設定ダイアログ
接続文字列を使用する(C)
データベースの種類とファイル名を文字列で指定します。最も一般的で分かりやすい設定方法です。この場合も、[作成]ボタンをクリックすれば「データリンクプロパティ」ダイアログボックスがオープンし、接続先の情報を設定できるようになります。
接続設定はデータベース・エンジンによって異なるため、ここではAccessで用いられているJet3.51データベース・エンジンを利用するmdbファイルの接続方法を紹介しておきます。
・ |
プロバイダ |
|
接続先のOLE DBプロバイダ(データベース接続情報の提供先)を指定します。ここでは「Microsoft
Jet3.51 OLE DB Provider」を選択します。 |
・ |
接続 |
|
データベース名(例ではmdbファイル名)を入力します。[...]をクリックしてファイル選択ダイアログから選んでも構いません。
続いて、選択したデータベースに接続するためのユーザー情報を入力します。
[接続のテスト]をクリックすれば、正しく接続できるかどうかがテストできます「無事に完了しました」というメッセージが表示されれば大丈夫です。ユーザー名やパスワードを間違えると、接続エラーのメッセージが表示されます。 |
画面5:データベースファイルを選択し、接続情報を入力する
- 生成された接続文字列
-
ここうして接続先データベースの設定を行うと、接続文字列は以下のように設定されます。
Provider=Microsoft.Jet.OLEDB.3.51;
Persist Security Info=False;
Data Source=D:\Db\Add01.mdb |
接続文字列の書式について説明しておきましょう。
Provider=<プロバイダ名>;
Data Source=<データソース名>
|
です。
<プロバイダ名>には、以下のような文字列を設定します。
Jet3.51:Microsoft
Jet3.51 OLE DB Provider
Oracle:Microsoft OLE DB Provider
for Oracle
SQL Server:Microsoft OLE DB Provider
for SQL Server
ODBCドライバ:Microsoft OLE DB Provider
for ODBC Drivers
|
<データソース名>には、プロバイダに適合したデータベースファイル名を指定します。ODBCドライバを経由したデータソースの場合はデータソース名となります。
-
レコードソースの指定 -
接続したデータベースに含まれるテーブルまたはクエリーは、RecordSourceプロパティで指定します。Dataコントロールでは、データベースを接続するとそこに含まれるテーブルやクエリーがリスト表示されましたが、ADODataコントロールでは[...]をクリックすると画面6のようなダイアログボックスがオープンします。
画面6:レコードソースはSQLで指定する
・ |
コマンドタイプ(CommandTypeプロシージャ) |
|
1
- |
adCmdText:コマンドテキスト(SQL文)、またはストアドプロシージャ※の呼び出し命令を記述します。 |
2
- |
adCmdTable:データベース内のテーブルまたはクエリー名を指定します。 |
4
- |
adCmdStoredProc:データベース内のストアドプロシージャ名を指定します。 |
8
- |
adCmdUnknown:設定する文字列の種類が不明の場合に指定します。通常はSQL文による命令を記述します。
以上がダイアログから選択できる値です。コードで記述する場合には、以下のような記号定数も使えます。
adCmdTableDirect:データベース内のテーブル名を指定します。
adExecuteNoRecords:レコードの挿入や削除などを行う(Accessで言うアクションクエリー)の命令を記述します。 |
|
・ |
テーブル名またはストアドプロシージャ名 |
|
コマンドタイプで2 - adCmdTable、
4 - adCmdStoredProcを選択すると入力可能となります。データベースに含まれるテーブル、クエリー、ストアドプロシージャ名がリスト表示されるので、そこから選択します。 |
・ |
コマンドテキスト |
|
コマンドタイプで1 - adCmdTextまたは
8 - adCmdUnkonwnを選択すると入力可能となります。テーブルやクエリーの内容を基に新たなレコードセットを生成するSQL文を記述します。 |
※ |
ストアドプロシージャ:データベース内部に記録される、独自のデータ処理プログラム。Accessのモジュールもストアドプロシージャの一種と捉えられます |
-
プロパティダイアログからも設定できる -
アプリケーション内で場所と名前が固定的なデータベースを扱う場合には、以上の設定をプロパティウィンドウから行えます。また、ADODataコントロールのコンテキストメニューから「ADODCのプロパティ」を選択すれば、画面7のようなダイアログボックスがオープンするので、「全般」「接続」「レコードソース」のタブをクリックしてそれぞれ設定しても構いません。どちらから設定しても、結果は同じです。
画面7:コンテキストメニューからでも、ADODataコントロールのプロパティが設定できる
通常は、データベースのファイル名は決まっていても、その存在するフォルダが固定されているとは限りません。データベースファイルの場所に柔軟性を持たせたい場合には、コードレベルでデータベースの接続を行います。
- データベースファイルの場所 -
自分自身の存在するフォルダ
多くのスタンドアロン・アプリケーションでは、アプリケーションのファイルと同じフォルダに、データベースファイルも保存することになるでしょう。その場合にはAppオブジェクトのPathプロパティを参照します。
例えば、アプリケーションがC:\Program Files\MyDBAppに保存されていれば、 |
|
で変数strDbPathに
"C:\Program Files\MyDBApp" |
という文字列が保存されます。
設定ファイルを参照する
ネットワーク上の特定の共有フォルダにデータベースを保存する場合には、その場所を記述した設定ファイルをアプリケーションと同じフォルダに保存しておき、そのファイルを開いてデータベースの存在する場所を読み込ませます。
レジストリに登録する方法もありますが、業務用アプリケーションでレジストリをいじるのは、あまりおお勧めできません。インストールやアンインストールなど、ユーザーに余計な手間を強制するからです。また、プログラミングのミスでレジストリを壊してしまうと、多数のコンピュータが被害を受けることになります。
テキスト形式の設定ファイルを参照するだけなら、ファイルをコピーするだけでも利用可能です。ただし、VBの場合はランタイムライブラリが必要なので、最低限インストール作業は必須となります。
設定ファイルを使ったデータベースの参照方法は、回を追って紹介することにしましょう。
- データベースの接続 -
データベースファイルの場所が判明したら、それとファイル名とを連結してADODataコントロールの接続文字列を生成します。
Dim strConnectString
As String ←接続文字列を保存する変数
strConnectString = _
"PROVIDER=Microsoft.Jet."_
OLEDB.3.51;Data Source=" _
& App.Path & "\MyDb.mdb;"
|
こうして生成した文字列を、ADODataコントロールのConnectionStringプロパティに代入します。
datAddress.ConnectionString
= _
strConnectString |
これでデータベースがADODataコントロールに接続され、オープンされます。ConnectionStringプロパティに与える文字列は、先述した
Provider=<プロバイダ名>;
Data Source=<データソース名> |
という書式になります。
- コマンドタイプの指定 -
RecordSourceにレコードソースを示す文字列を設定する前に、その文字列の種類をCommandTypeプロシージャに設定しておきます。既に説明したように、adCmdText、adCmdTableなどの記号定数が使えます。
CommandTypeプロシージャの規定値はadCmdUnknownですから、これを設定しておかないとRecordSourceにはSQL文しか設定できなくなります。実際にはテーブル名なども設定可能ですが、実行時にエラーメッセージが表示されます(mdbファイルで試したところ、エラーメッセージは表示されたもののあとは正しく動作しました。バグなのかそういう仕様なのかは不明です)。
- レコードソースの設定 -
レコードソースは、RecordSourceプロパティに文字列として代入します。CommandTypeプロシージャにadCmdTableを指定していれば、以下のようにデータベース内のテーブル名またはクエリー名を文字列として指定できます。
datAddress.RecordSource
= "T_住所" |
CommandTypeプロシージャにadCmdTextまたはadCmdUnknownを指定していれば、以下のようにSQL文を指定します。
datAddress.RecordSource
= _
"SELECT ID,読み,氏名,性別,電話番号," _
& "郵便番号,住所1," _
& "住所2 FROM T_住所
ORDER BY 読み ASC;" |
- 接続は3段階
-
これで、ADODataにデータベースが接続され、その中のテーブルを基にしたレコードソースにアクセスできるようになります。
もう一度まとめておきましょう。
1. |
ConnectionStringプロパティで、データベース・プロバイダとデータソース名(ファイル名)を指定する |
2. |
CommandTypeプロパティでRecordSourceプロパティに用いるデータソース指定命令の種類を指定する |
3. |
RecordSourceプロパティでレコードソースを指定する |
ここまでできたら、あとはテキストボックスやリストボックスなどのコントロールに、データソースとしてADODataコントロールを接続するだけとなります。
テキストボックス、リストボックスなどのコントロールには、DataSourceプロパティとDataFieldプロパティがあります。
- データソースの指定
-
DataSourceプロパティで、接続するADODataコントロールを指定します。プロパティウィンドウからリストで選択できるほか、コードレベルで
txtMemberName.DataSource
= adoMembers |
といったように指定することも可能です。
- フィールドの指定
-
ADODataコントロールが保持しているのは、データベース内の1個のテーブルまたはクエリー、あるいはSQL文によって生成されたレコードセットです。その中の特定のフィールドをテキストボックスなどと連結するには、DataFieldプロパティにフィールド名を設定します。
プロパティウィンドウでDataSourceプロパティを指定しておき、その時点でDataSourceプロパティで示すADODataコントロールが正しくデータベースに接続されていれば、プロパティウィンドウのDataFieldプロパティの欄にはその中のテーブルやクエリーがリスト表示され、そこから選択できます。
が、先述したようにコードレベルでデータベースを接続した場合には、デザイン時にプロパティウィンドウでDataFieldプロパティを設定できません。ADODataコントロールに、有効なデータベースが接続されないためです。
コードレベルでフィールドを連結するには、DataFieldプロパティにフィールド名を示す文字列を代入します。
txtMemberName.DataField
= "氏名"
txtMemberAddr.DataField = "住所" |
といった感じです。
- 連結は2段階
-
もう一度まとめておきましょう。
1. |
DataSourceプロパティで接続するADODataコントロールを指定する |
2. |
DataFieldプロパティで、連結したいフィールド名を指定する |
これで、ADODataコントロールに接続されたデータベース内のテーブルから、任意のフィールドがテキストボックスなどのコントロールに連結され、データが連動するようになります。
ADODataコントロールでは、Dataコントロールに比べてプロパティの設定項目が増え、意味も複雑になってきています。が、その代わりに高度な設定が可能となり、ODBC経由の接続やデータリンクファイルを使った自由度の高い接続も可能となっているのです。
結果的に、ネットワーク環境でSQL ServerやOracleなどの大規模なRDBMSを用いたり、あるいはODBC経由で各種データベース・エンジンを混在使用するような場合には、ADODataコントロールを使うのが適していると言えます。
が、スタンドアロン、あるいは小規模なネットワーク環境でほぼ固定的にデータベースをアクセスするだけであれば、Dataコントロールを用いても一向に支障ありません。むしろ、設定が簡単な分、保守も容易であると言えます。用途に応じて使い分ければよいでしょう。
なお、この連載では今後、極力旧来のDAOとDataコントロールには触れないで、ADOを用いたコードレベルのデータベース・アクセス手法を紹介していく予定です。
住所録の仕上げ
レコード移動ボタンに画像を設定する |
住所録作成の最後に、前回作成したアプリケーションのレコード移動ボタンを、ビットマップに変更しましょう。画面8のようなビットマップファイルを用います。
また、ボタンが押されたときには色が変わるように、押されたときのためのビットマップファイルも用意しました。これらは、すべて今回提供するサンプルファイル群に収録されています。
画面8:コマンドボタンに表示するビットマップファイル
表1:ビットマップファイル名とその用途
動作 |
ファイル名 |
ボタンの状態 |
先頭へ移動 |
First.bmp |
通常の状態 |
|
First_d.bmp |
押された状態 |
1つ前へ移動 |
Prev.bmp |
通常の状態 |
|
Prev_d.bmp |
押された状態 |
次へ移動 |
Next.bmp |
通常の状態 |
|
Next_d.bmp |
押された状態 |
最後尾へ移動 |
Last.bmp |
通常の状態 |
|
Last_d.bmp |
押された状態 |
- Pictureプロパティ
-
コマンドボタンに動作を割り当てるには、そのClickイベントプロシージャを記述するだけです。これについては、前回紹介したとおりです。
コマンドボタンに画像を表示させるには、Pictureプロパティを設定します。プロパティウィンドウで[...]をクリックし、ファイル選択ダイアログボックスから適切な画像ファイルを選択するだけです。
これで、Pictureプロパティの設定が「ビットマップ」に変わります。
画面9:画像ファイルを選択する
- DownPictureプロパティ
-
Pictureプロパティだけを設定すると、ボタンがクリックされて押し下げられたときにも、その画像は変化しません。通常はこれで構いません。押し下げられていることを視覚的に知らせたい場合には、ボタンが押し下げられたときの画像も変更します。
押し下げられたときに表示される画像はDownPictureプロパティに設定します。これも、ファイル選択ダイアログボックスで画像ファイルを選択するだけです。
- Styleプロパティ
-
最後に、コマンドボタンのStyleプロパティを、"0 -
標準"から"1 - グラフィックス"に変更しましょう。
これを行わないと、ボタンには画像ファイルではなくCaptionプロパティに設定した文字列が表示されてしまいます。
こうして4個のレコード移動ボタンに画像を割り当てたのが、今月のサンプル(画面10)です。押し下げたときにボタンの色が変わる様子を、サンプルで確認してください。
画面10:画面サンプル
サンプルファイルのダウンロード
(LZH形式 35.9KB) |