次に『2.ユーザーの入力した「商品ID」をキーに「商品_mr」テーブルからレコードを抽出し、品名、仕入先名、在庫数を表示する』という仕様のアプリケーションを作ります。基本的な枠組みは“ex01”と変わりません。
- 3つのテーブルを関連付ける - 今度は商品名と販売単価ではなく、その商品の仕入先と在庫数を表示させなければなりません。“ex01”では単純に「商品_mr」テーブルだけを用いましたが、仕入先と在庫数はそれぞれ「仕入先_mr」と「在庫_mr」の2つのテーブルに記録されているため、リレーションを設定する必要があります。
そのためのSQLは次のようになります。
SELECT 商品_mr.商品ID, 商品_mr.品名, 商品_mr.仕入先ID, 仕入先_mr.仕入先名, 在庫_mr.在庫 FROM 仕入先_mr INNER JOIN 商品_mr ON 仕入先_mr.仕入先ID = 商品_mr.仕入先ID INNER JOIN 在庫_mr ON 在庫_mr.商品ID = 商品_mr.商品ID WHERE 商品_mr.商品ID = xxxxxx
アンダーラインの箇所に、テキストボックス“txtItemId”に入力された「商品ID」が入ります。
このリレーションの構造をダイヤグラムにすると、図3のようになります。サンプル・データベースの“Diagram1”に保存されているものとまったく同じです。
- btnSearch_Click~SQLの変更 - プロシージャの基本構造は、先のex01とほとんど変わりません。異なる箇所だけを説明しておきます。
まず、コマンドボタン“btnSearch”がクリックされたときに実行されるイベントプロシージャ“btnSearch_Click”では、文字列変数“strSql”に先に掲げた長いSQLを代入しておきます。
strSql = _ "SELECT 商品_mr.商品ID, 商品_mr.品名, 商品_mr.仕入先ID, " & _ "仕入先_mr.仕入先名, 在庫_mr.在庫 " & _ "FROM 仕入先_mr INNER JOIN 商品_mr ON 仕入先_mr.仕入先ID = 商品_mr.仕入先ID " & _ "INNER JOIN 在庫_mr ON 在庫_mr.商品ID = 商品_mr.商品ID " & _ "WHERE 商品_mr.商品ID = "
- Search~結果表示の変更 - 実際にデータベースを制御するプロシージャ“Search”では、DataReaderのReadメソッドで得られた結果をラベルに表示する箇所が以下のようになります。
If objDataReader.Read() Then lblItemName.Text = objDataReader("品名") lblSupplierId.Text = objDataReader("仕入先ID") lblSupplierName.Text = objDataReader("仕入先名") lblNumStock.Text = objDataReader("在庫") Else MessageBox.Show( _ "該当する商品が見つかりません。", "検索エラー", MessageBoxButtons.OK) End If
これで、「商品_mr」に関連付けられた「仕入先_mr」から「仕入先名」、「在庫_mr」から「在庫」の値が導出され、ラベルに表示されます。
ソースコードはリスト2の通りです。
SQLはデータベースに対する制御命令ですが、アプリケーションをプログラミングする段階では、単なる文字列として扱われます。その文字列がADO.NETに規定されている各種オブジェクトを介してデータベース・エンジンに送られ、処理結果がまたオブジェクトを通じて戻ってくる――という構造です。
Visual Studio .NETではデータベースの扱いに限らず、 .NET Frameworkによって各言語で同じ仕様のライブラリを使えるため、VBでもC++でもC#でも、各言語の文法さえ押さえておけばオブジェクトの扱いに戸惑うことはありません。
ここではVB .NETを用いましたが、他の言語でも試してみてください。
サンプルファイル (LZH形式 994KB)
|
|
|