Visual Basic データベース講座 |
VBのツール・機能を活用してプログラムなしでデータベースアプリケーションを作成する方法を説明します。
概要 ・アプリケーションとデータベースを関連付けて操作するにはデータソースウィンドウを使用する。 ・データソースウィンドウからテーブルをフォームにドロップするだけでそのテーブルを編集する機能が自動的に生成される。 ・その時に、自動的に生成されるコントロールの種類を指定したりすることも簡単にできる。 ・その時にはリレーションシップの自動的に実装され、マスタ/詳細画面のようなものも簡単に作成できる。 |
今回はVBの機能をフルに活用して前回までと同様な機能を実装する方法を説明します。前回までは主に自分でプログラムをして必要な機能を組み込んできましたが、今回は同じ機能をほとんどプログラムしないで組み込みます。
私のスタンスでは自分でプログラムをして機能を組み込んでいくことが多いのですが、VBのツールの機能だけで何ができるのか知っておくことも重要です。両方の手法を理解した上で場合に応じて適切な処置を講じていくのが最適な開発手法でしょう。
メモ - 偉そうなことを書いていますが… 今回説明する機能のほとんどは私自身はまったく活用していません。私はこのような機能があるということを知っているだけで実際にシステムの一部としてこれらの機能を使用したことがないのです。 ですから、今回の説明は経験に基づかない机上の説明となってしまいます。 私がこの機能を使用していないのはよくわからないからです。機能自体には魅力的な部分もありますし、実際にこの機能を活用されている方もいらっしゃるようです。というわけですから今回の説明を読んで興味を持った方は別途書籍やWebサイトなどで情報を収集してみることをお勧めします。 |
手始めにフォームにデータを表示するところまでを作ってみましょう。
新規Windowsアプリケーションを作成して、[データ]メニューから[データソースの表示]をクリックしてデータソースウィンドウを表示させてください。ツールの機能を使ってデータベースアプリケーションを作成するときにはこのデータソースウィンドウがデータベースへの中継として重要な役割を果たします。
■画像1:データソースウィンドウ
ここからの作業は順を追って説明します。
データソースウィンドウで新しいデータソースの追加をクリックして、ウィザードを起動します。
■画像2:データソースの種類を選択
はじめにデータソースの種類の選択で、「データベース」を選択して「次へ」をクリックします。
■画像3:データ接続の選択
対象のデータベースへの接続設定を指定します。データベースエクスプローラ(またはサーバーエクスプローラ)でAnimals.mdbが見られるように設定してある場合は、設定候補として自動的にAnimals.mdbが表示されるので「次へ」をクリックするだけです。
※自動的にAnimals.mdbが表示されない場合もあるようです。私もよくわかりません。
ここに適切なものが表示されていない場合は、「新しい接続」ボタンをクリックしてデータベースへの接続設定を指定します。その方法は画面を見ればわかると思いますが、データベース講座第2回でも紹介していますので参考にしてください。
■画像4:ローカルコピーを作成しない
Animals.mdbのようにVBのプロジェクトとは独立しているデータベースを前の画面で指定した場合は、データベースをプロジェクトに含めるかどうか聞かれますので、今回は「いいえ」をクリックしてください。
ここで「いいえ」とは現状維持のことで、何も変更されません。「はい」を選択するとmdbがプロジェクトに組み込まれて今までの説明とは少し違った構成になります。
■画像5:接続文字列をアプリケーション構成ファイルに保存する
接続文字列をアプリケーション構成ファイルに保存するか聞かれますので、何もしないで「次へ」をクリックしてください。
この場合接続文字列はアプリケーション構成ファイルに保存され、アプリケーション構成ファイルの該当部分を変更するだけでデータベースへの接続文字列を変更できて便利です。ウィザード完了後にapp.configというファイルがプロジェクトに追加されます。これがアプリケーション構成ファイルです。 あとでこのファイルを開いて接続文字列がここに書き込まれていることを確認してください。
■画像6:データベースオブジェクトの選択
プロジェクトで使用するテーブルを選択します。テーブル以外にもまだこの講座では説明していませんが「ビュー」というオブジェクトを選択することもできます。また、テーブルの列単位で細かく指定することもできます。
■画像7:T_動物マスタとT_目マスタを選択
今回は、「T_動物マスタ」と「T_目マスタ」にチェックをつけて「完了」をクリックしてください。
■画像8:データソースの追加完了
これでデータソースにT_動物マスタが追加されました。データソースウィンドウで確認することができます。
■画像9:データソースウィンドウではテーブルを展開して列を確認することもできる
テーブルを展開して列を見ることもできます。
これだけだったらデータベースエクスプローラ(またはサーバーエクスプローラ)と変わりないのですが、決定的な違いとしてデータベースエクスプローラやサーバーエクスプローラはプロジェクトは無関係に独立しているツールなのに対し、データソースウィンドウは完全にプロジェクトに従属している点です。
次の手順でその威力が明らかになります。
データソースウィンドウから[T_動物マスタ]をドラッグして、フォームにドロップしてください。たちどころにフォームは次のようになります。
■画像10:自動生成された画面
初期状態ではDataGridViewの位置がドロップした位置になっているのですこしずらして整えれば完成です。実行するとデータの一覧表示をしてくれるだけでなく、ツールバーの保存ボタンをクリックすることによってレコードの変更点をデータベースに書き込むこともできます。
前回まで一生懸命プログラムを組んでやっていたことがこんなに簡単にプログラムなしでできてしまうのです。
今紹介した手順は煩雑ではあるけれども典型的な作業を軽減したものに過ぎず、VBはウィザードの結果を基に自動的にコードを生成しています。ですから、ウィザードを使わなくても自分でプログラムして同じ結果を得ることもできますし、自動生成されたコードを改造して機能の追加・変更を行うこともできます。
ウィザード実行後にソリューションエクスプローラを確認すると、AnimalsDataSet.xsdという項目が追加されているのがわかります。
■画像11:ソリューションエクスプローラ
自動生成されたコードの大部分はこのAnimalsDataSet.xsdに記載されています。通常のフォームと同じようにコードを表示して直接見たり編集したりすることもできます。
より身近な部分ではForm1のプログラムを見ると次のコードを生成されているのを確認できます。
Private
Sub T_動物マスタBindingNavigatorSaveItem_Click(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles T_動物マスタBindingNavigatorSaveItem.Click Me.Validate() Me.T_動物マスタBindingSource.EndEdit() Me.T_動物マスタTableAdapter.Update(Me.AnimalsDataSet.T_動物マスタ) End Sub |
Private
Sub Form1_Load(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles
MyBase.Load 'TODO: このコード行はデータを'AnimalsDataSet.T_動物マスタ' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 Me.T_動物マスタTableAdapter.Fill(Me.AnimalsDataSet.T_動物マスタ) End Sub |
■リスト1:ウィザードが自動生成したコード
T_動物マスタTableAdapterというクラスを使ってデータを読み込むFillメソッドを実行したり、変更を保存するUpdateメソッドを実行したりしているわけです。となるとT_動物マスタTableAdapterクラスのプログラムがどうなっているかが気になります。
もちろん、FillやUpdateを右クリックして定義へ移動すればこれらのプログラムの中を見ることができます。名前からわかるようにT_動物マスタTableAdapterクラス自体が自動生成されたクラスなのです。
それで、たとえばFillメソッドの定義へ移動してみてください。驚くほど大量のプログラムが生成されているのが確認できます。これはいちいち解読する気にもならないくらい大量です。
これから、この解読する気にもならないようなコードについて少し説明をしますが、ここの説明はあまり身構えて読まないで斜め読みしてください。いろいろなクラスが自動生成されていますし、その中にいろいろなメソッドやプロパティが含まれています。突然これらを目の前にして理解しようと努めても疲れるだけです。
説明を読んで雰囲気だけつかんでおくのが良いと思います。
▼ここから斜め読み開始
さて、T_動物マスタTableAdapterクラスの機能のほどんとは以前にこの講座でも紹介しているOleDbDataAdapterクラス、OleDbDataConnectionクラス、OleDbCommandクラスの機能を呼び出しているだけです。ですからこれらのクラスの使い方が分かっているならばメソッドの名前を見るだけで何をするメソッドのなのかはわかります。
このクラス以外にもいくつかのクラスが自動生成されているので簡単にまとめておきます。ここではT_動物マスタに関連する重要なもののみを挙げますが、同様のクラスがT_目マスタについても生成されています。
クラス | 基底クラス | |
AnimalsDataSet | DataSet | DataSetは複数のDataTableを含む概念で、DataTableをテーブルに例えると、DataSetはデータベースに当たります。 |
T_動物マスタDataTable | DataTable | T_動物マスタの定義を含むDataTableです。 |
T_動物マスタRow | DataRow | T_動物マスタの定義を含むDataRowです。 |
T_動物マスタTableAdapter | T_動物マスタへの簡単なアクセスを提供します。 |
▲ここで斜め読み終了
この中で注目すべきはT_動物マスタRowです。
通常のDataRowと違いT_動物マスタの構造をウィザードが解析して作成しているので、このクラスを使うと次のようなプログラムが可能です。
Dim
Table As New
AnimalsDataSet.T_動物マスタDataTable Dim Row As AnimalsDataSet.T_動物マスタRow Row = Table.NewT_動物マスタRow Row.動物ID = 5555 Row.名前= "ヨナグニサン" Row.目ID = 1 '鱗翅目がT_目マスタにないので仮に1をセット Row.画像= "" Row.説明= "八重山諸島に生息する世界最大のガ" Table.Rows.Add(Row) T_動物マスタDataGridView.DataSource = Table |
■リスト2:型指定されたDataRowの使用
このコードで注目してほしいのは「動物ID」や「名前」といった列名がそのままプロパティ名となっている点です。プロパティ名となっていれば入力中にインテリセンスでヒントもでますし、また間違った列名を入力してしまってもVBのエラーチェック機能が働くのですぐにわかりません。
また、列の型もちゃんと実装されており、この例では動物IDプロパティはInteger型になっているし、名前は文字列型になっています。
この自動生成されたT_動物マスタRow型を使うだけでプログラムの効率が上がり、エラーやミスも減らすことができるというわけです。ただ、テーブル名や列名に全角文字を使っていると入力しにくいので困りますが…。
T_動物マスタDataTableもちゃんとこのような定義を前提に作成されており、たとえばDataRow型を返すNewRowメソッドの他に、T_動物マスタRow型を返すNewT_動物マスタRowメソッドが生成されています。
このようにDataSet、DataTable、DataRowのそれぞれが汎用ではなくT_動物マスタ(またはT_目マスタ)の構造に沿うように生成されているのがこの自動生成されたコードの最大の特徴であり、こういった実際の構造に従ってカスタマイズされたデータアクセス系のクラスのとをまとめて「型指定されたデータセット」と呼びます。
なお型指定されたDataSet、DataTable、DataRowの機能を手動で追加・変更する一番簡単な方法は分割クラス(Partialクラス)を使用する方法です。この方法ですと自動生成されたコードには一切手をつけないで必要な部分だけ自分でプログラムすることができます。
分割クラスについては初級講座第50回 いろいろなクラス・構造体で説明しています。
メモ - これって便利なの? 型指定されたデータセットですが、実際のところ便利なのでしょうか?使われているのでしょうか? 本当にシンプルな小さなプログラムならウィザードを使って原型を作成して、いくつかのカスタマイズをちょぼちょぼとプログラムするだけというのは便利そうですが、大きな複雑なシステムで使用するとなるとどうなのでしょう? 私は実際にこの機能を使ってプログラムを作ったことがないのでわかりません。だから、みなさんにも本当のこの機能のメリットや使いどころを説明することができません。この機能に興味のある人は他の資料も探してみてください。 以前掲示板に投稿していただいた某MVPの方は型指定されたデータセットを便利に活用しているということをおっしゃっていました。 なお、ここで紹介しているようにウィザードを使ってプログラムを作成する手法と型指定されたデータセットを活用する手法は本質的に一体不可分ではありません。 |
さて、データソースウィンドウを使ったプログラムなしの簡単アプリケーション作成に話を戻します。すでに基本的な機能をもったアプリケーション作成の方法は説明しましたが、もっといろいろと指定して違った機能を持たせることができます。
そのうち最もインパクトがあるのはDataTableのリレーションシップの実装です。言葉の説明をする前にこの機能を実際に使ってみます。
新しくWindowsアプリケーションを作成してさきほどと同じ手順でデータソースにT_動物マスタとT_目マスタを追加してください。「新しく」という部分には注意してください。一度ウィザードでプログラムを生成した後でいろいろいじっているとこのあと説明する機能がうまく動かない場合があるので「新しく」作成した方が無難です。
今度はT_動物マスタではなく、T_目マスタの方を展開してみてください。
■画像12:T_目マスタを展開するとT_動物マスタがぶらさがっている
T_目マスタの項目名の他に、T_動物マスタがぶらさがって表示されているのがわかります。
ここでT_目マスタをフォームにドロップしてDataGridViewを生成してください。そして、その下にT_目マスタにぶらさがっているT_動物マスタをドロップしてDataGridViewを生成してください。T_目マスタの上にあるT_動物マスタではなく、T_目マスタにぶらさがっているT_動物マスタです。
画面を整えて実行すると次のようになります。
■画像13:リレーションシップの実装
この画面では上段がT_目マスタで下段がT_動物マスタです。この機能のすごいところは2つのDataGridViewが自動的に連動する点です。この画像のようにT_目マスタで鯨目のところをクリックしてください。するとT_動物マスタには自動的に鯨目に属する動物がピックアップされた表示されます。もちろん鯨目以外でもおなじことがおこります。
これは内部ではT_動物マスタの目IDとT_目マスタの目IDが関連付けられていることから生成された機能です。ソリューションエクスプローラでAnimalsDataSet.xsdをダブルクリックすると下のようなデザイナが表示されてこのことを視覚的に確認できます。
■画像14:リレーションシップの設定を視覚的に確認
このような結びつきをリレーションシップと呼びます。リレーションシップの詳細については別の機会に説明します。
このリレーションシップ自体はVBが自動的に生成したものではなく、私がAnimals.mdbを作成したときに設定しておいたものです。VBはAnimals.mdbにリレーションシップが設定されていることを検出して、自動的にこのような機能を自動生成したのです。
DataGridViewのような一覧形式の他にTextBoxやLabelを使ったいわゆるカード型の画面を生成することもできます。
データソースウィンドウでT_動物マスタをクリックすると右側に下向きの矢印がでます。この矢印をクリックすると下の画像のような項目がでます。
■画像15
ここで詳細を選択してください。そうするとデータソースウィンドウでのT_動物マスタのアイコンが少し変わります。この状態でT_動物マスタをフォームにドロップすると次のようなフォームが生成されます。
■画像16:カード型の画面
生成されるコントロールの種類は既定ではTextBoxになっていますが、これを項目ごとに指定することもできます。
コントロールの種類を変更するにはデータソースウィンドウで目的の項目を選択してから下矢印をおしてお好みのコントロールを選びます。
■画像17:コントロールの種類を選択