社内向けのクライアント/サーバ型システムを、最新の.NET環境で開発するには? 特にデータベース関連の処理を解説。
powered by Insider.NET
「Visual Studio 2010(以降、VS 2010)で社内向けアプリを作るなら、どのような技術を使えばよいのか?」
これに対する答えとして、本特集では、筆者の独断と偏見で選択した技術を用いて、サンプル・アプリの開発を解説している。技術解説記事として各技術を詳しく説明するのではなく、「取りあえず手を動かしてVS 2010を使ってプログラムを作ってみて、最新のVS 2010での社内向けアプリの開発を体感してもらおう」というのが本特集記事のコンセプトである。
本特集記事は、前・後編の2回に分けて公開しており、すでに前編が公開済みである。
後編である今回は、前回作成したプログラムをさらに拡張し、特にデータベース関連の処理を説明する。そのソース・コードは下記のリンクからダウンロードできる。
それでは、社内向けアプリのDB(=データベース)開発を始めよう。
次の画面は、今回(後編)で作成するプログラムを実行した例である。
この画面の例では、[注文一覧]メニュー*1を開いて、各ユーザーによって発注されたお弁当を一覧表示している。
*1 なお、前回の記事では、[注文一覧]メニューを作成し忘れてしまった(これに関しておわびしたい)。前回のプログラムを使って開発する場合は、[お弁当登録]メニューの上に[注文一覧]メニュー(名前:MenuOrderList)と、それに対応するリボン・タブ(名前:TabOrderList)、さらにコンテンツとなるユーザー・コントロール(名前:ContetOrderList)を作成してほしい。上記のリンクからダウンロードできるサンプル・コードは、このメニューの追加に対応済みである。
その作成手順は前回説明したので、詳細は割愛する。参考までに、簡単な作成手順を説明しておくと、MainWindow.xamlファイルをXAMLエディタで開いて、[お弁当登録]メニューの<ToggleButton>要素をコピーして、その上に改行を入れてその行に貼り付け、Content属性に「注文一覧」を、Name属性に「MenuOrderList」を設定すればよい。
また、リボンの追加も、コードを修正して行う(詳細割愛)。
さらに、メニューの切り替え処理のロジックも追記する必要がある。具体的には、MainWindow.xaml.cs/.vbファイル内のCheckedイベント・ハンドラから呼び出されるSwitchContentメソッドとChangeRibbonTabVisibilityメソッドや、Uncheckedイベント・ハンドラを修正する。修正内容は、コードがワンパターンで難しくないので、割愛する。
まずはデータベースが必要だ。社内用のC/S型システム(=クライアント/サーバ型システム)の場合は、社内にある既存のSQL Server 2005以降を利用すればよい。
●SQL Serverデータベースの作成
それでは、「ObentoDB」というデータベースを作成しよう。
具体的には、VS 2010のIDEを起動して、(メニューバーから[表示]−[サーバー エクスプローラー]を実行して)[サーバー エクスプローラー]を開き、[データ接続]項目の右クリック・メニューから[新しい SQL Server データベースの作成]を実行する。これにより[新しい SQL Server データベースの作成]ダイアログが表示されるので、[サーバー名]欄や[サーバーにログオンする]欄に適切な情報を設定し、[新しいデータベース名]欄に「ObentoDB」と入力して[OK]ボタンをクリックする。これにより、[データ接続]項目の下位に、先ほど作成したデータベース項目が表示される。
次の画面は、接続後のデータベース項目の表示例。
ObentoDBデータベースでは、下記の3つのテーブルを作成する。
これには、([サーバー エクスプローラー]の[データ接続]項目配下にある)[<先ほど作成したデータベース項目>]−[テーブル]の右クリック・メニューから[新しいテーブルの追加]をクリックする。これにより、次の画面のようなテーブル・デザイナが表示される。
このテーブル・デザイナを使って、下記の表に従って3つのテーブル内容を定義する(※作成手順を簡略化するためのSQLスクリプトを後に示す)。
列名 | データ型 | Nullを許容 | 備考 |
---|---|---|---|
ID | int | × | 管理用のID番号。主キー。[プロパティ]ウィンドウの[IDENTITY の指定]で[(ID である)]=「はい」、[ID の増分]=「1」、[IDENTITY シード]=「1」 |
Name | nchar(50) | × | ユーザー名 |
DutyPerson | bit | × | お弁当当番かどうか |
Userテーブルの定義 ([プロパティ]ウィンドウでの設定で)○=チェックを入れる。×=チェックを外す。 |
列名 | データ型 | Nullを許容 | 備考 |
---|---|---|---|
ID | int | × | 管理用のID番号。主キー。[プロパティ]ウィンドウの[IDENTITY の指定]で[(ID である)]=「はい」、[ID の増分]=「1」、[IDENTITY シード]=「1」 |
Name | nchar(100) | × | お弁当の名前 |
Description | nchar(1000) | × | お弁当の説明 |
Photo | image | ○ | お弁当の写真。[プロパティ]ウィンドウで[NullValue]=「(なし)」/「(Null)」 |
Obentoテーブルの定義 ([プロパティ]ウィンドウでの設定で)○=チェックを入れる。×=チェックを外す。 |
列名 | データ型 | Nullを許容 | 備考 |
---|---|---|---|
ID | int | × | 管理用のID番号。主キー。[プロパティ]ウィンドウの[IDENTITY の指定]で[(ID である)]=「はい」、[ID の増分]=「1」、[IDENTITY シード]=「1」 |
User_ID | int | × | UserテーブルのID番号。外部キーとしてUserテーブルのID列にリレーションシップを張る |
Obento_ID | int | × | ObentoテーブルのID番号。外部キーとしてObentoテーブルのID列にリレーションシップを張る |
Date | datetime | × | お弁当を注文する日 |
Orderテーブルの定義 ([プロパティ]ウィンドウでの設定で)○=チェックを入れる。×=チェックを外す。 |
さらに、「お弁当名 + お弁当を発注したユーザー名 + お弁当を注文する日(=お弁当を食べる日)」の情報を一覧表示する「OrderList」ビューを作成しておこう。
(再び、[サーバー エクスプローラー]の[データ接続]項目配下にある)[<先ほど作成したデータベース項目>]−[ビュー]の右クリック・メニューから[新しいビューの追加]をクリックする。これにより、ビュー・デザイナが表示される。
作成するビューの内容は下記の表のとおり。
列名 | データ | 備考 |
---|---|---|
ObentoID | ObentoテーブルのID列 | お弁当のID番号 |
ObentoName | ObentoテーブルのName列 | お弁当の名前 |
UserName | UserテーブルのName列 | ユーザー名 |
OrderDate | OrderテーブルのDate列 | お弁当を注文する日 |
OrderListビューの定義 |
以上の3つのテーブルと1つのビューを作成するSQLスクリプトを下記のリンク先に用意した。
このSQLスクリプト・ファイルを、SQL Server Management Studioなどで開いて実行すればよい。
●データセットの作成
続いて、ADO.NETのデータセットを作成する。
もちろんデータセット以外のLINQ to SQLやEntity Frameworkという新しいデータ・アクセス技術を選択してもよいが、本稿では、より多くの開発者が使い慣れており、機能性や性能面でも安定している「データセット」を利用することにした。
データセットを作成するには、[ソリューション エクスプローラー]内のプロジェクト項目の右クリック・メニューから[追加]−[新しい項目]を実行して[新しい項目の追加]ダイアログを表示し、そこで左側のツリーから[データ]を選択し、右側のリストから[データセット]を選択すればよい。ダイアログの[名前]欄に「ObentoDataSet.xsd」と入力して[OK]ボタンをクリックすると、ObentoDataSet.xsdファイルに「ObentoDataSet」という名前のデータセットが作成される。
データセットが作成されると、データセット・デザイナが自動的に表示されるので、[サーバー エクスプローラー]の[データ接続]−[<先ほど作成したデータベース項目>]−[テーブル]/[ビュー]の配下にある3つのテーブルを、そのデータセット・デザイナのデザイン・サーフェイス上にドラッグ&ドロップする。次の画面はその例。
データセット・デザイナに追加されたObento/Orderデータテーブル間とUser/Orderデータテーブル間には、リレーションシップを意味する線が引かれている。それぞれの線の右クリック・メニューから[リレーションシップの編集]を実行することにより、[リレーションシップ]ダイアログが表示されるので、[作成する制約の選択]として[リレーションシップと外部キー制約の両方]ラジオボタンを選択し、[UpdateRule の設定]コンボボックスで「Cascade」を選択、[DeleteRule の設定]コンボボックスで「Cascade」を選択し、[OK]ボタンをクリックしてダイアログを閉じる(これらの一連の設定の意味については、「連載:Visual Studio 2005によるWindowsデータベース・プログラミング 第7回 マスタ/詳細テーブルにおける更新処理」を参照されたい)。次の画面は、一連の作業の流れ。
リレーションシップと外部キー制約に関する設定の編集
さらに、OrderListビューを(データテーブルとして)データセットに追加してもよいのだが、OrderListビューでは1つのお弁当注文が1行に表示されるビューになっている。この表示形式だと、実際にお店に注文する際に、お弁当当番が自分で各お弁当が何個あるのかを数えなければならない。そこで、「各お弁当の個数」と「各お弁当を頼んだ人々の名前の列挙」を1行にまとめるOrderListデータテーブル(と、それに付随するテーブルアダプタ)を作成することにしよう。具体的には、下記の表に示すデータテーブルを作成する。
列名 | 説明 |
---|---|
ObentoName | お弁当の名前 |
ObentoCount | お弁当の個数 |
AllUserNames | お弁当を頼んだ人々の名前 |
OrderListデータテーブルの定義 |
データテーブルとテーブルアダプタを作成するには、データセット・デザイナのデザイン・サーフェイス上の空白部分の右クリック・メニューから[追加]−[TableAdapter]を実行する。これにより[TableAdapter 構成ウィザード]が表示されるので、その各ページにある[次へ]ボタンをクリックして進んでいく。[コマンドの種類を選択します]ページでは[SQL ステートメントを使用する]ラジオボタンを選択し、[SQL ステートメントの入力]ページでは、下記のSQLスクリプト・コードを入力する。
SELECT
ObentoName,
COUNT(UserName) AS ObentoCount,
(SELECT v.UserName + ','
FROM OrderList AS v
WHERE v.ObentoID = OrderList.ObentoID
FOR XML PATH('')) AS AllUserNames
FROM
OrderList
WHERE
OrderDate = @OrderDate
GROUP BY
ObentoID, ObentoName
最後に[完了]ボタンを押すと、[TableAdapter 構成ウィザード]が閉じられ、OrderListデータテーブルとOrderListTableAdapter(テーブルアダプタ)がデータセット・デザイナのデザイン・サーフェイス上に追加される(次の画面を参照。)。この状態で、[Ctrl]+[S]キーを押して内容を保存しておこう。
また、[お弁当発注]コンテンツで、ユーザー名を基に各自のお弁当注文状況を取得できるように、OrderTableAdapterに1つクエリを追加しておこう。データセット・デザイナ上の[OrderTableAdapter]の右クリック・メニューから[クエリの追加]を実行する。すると、先ほどとほぼ同等の[TableAdapter クエリの構成ウィザード]が開かれるので、上記と同様の手順で、下記のSQLスクリプト・コードを入力して作成する。
SELECT
ID,
User_ID,
Obento_ID,
Date
FROM
dbo.[Order]
WHERE
User_ID = @UserID
これにより、データテーブルにデータを格納するFillByメソッドが新たに追加される。
以上でデータセットの作成は完了だ。いったんここでビルドしておこう。
続いて、データベースと連結する「詳細」コントロールを作成する。
Copyright© Digital Advantage Corp. All Rights Reserved.