特集
» 2011年01月05日 00時00分 公開

特集:Visual Studio 2010で社内C/Sシステム開発(後編):Visual Studio 2010でデータベース開発 (1/4)

社内向けのクライアント/サーバ型システムを、最新の.NET環境で開発するには? 特にデータベース関連の処理を解説。

[一色政彦,デジタルアドバンテージ]
特集:Visual Studio 2010で社内C/Sシステム開発
業務アプリInsider/Insider.NET

powered by Insider.NET

「特集:Visual Studio 2010で社内C/Sシステム開発」のインデックス

連載目次

「Visual Studio 2010(以降、VS 2010)で社内向けアプリを作るなら、どのような技術を使えばよいのか?」

 これに対する答えとして、本特集では、筆者の独断と偏見で選択した技術を用いて、サンプル・アプリの開発を解説している。技術解説記事として各技術を詳しく説明するのではなく、「取りあえず手を動かしてVS 2010を使ってプログラムを作ってみて、最新のVS 2010での社内向けアプリの開発を体感してもらおう」というのが本特集記事のコンセプトである。

 本特集記事は、前・後編の2回に分けて公開しており、すでに前編が公開済みである。

 

 後編である今回は、前回作成したプログラムをさらに拡張し、特にデータベース関連の処理を説明する。そのソース・コードは下記のリンクからダウンロードできる。

 それでは、社内向けアプリのDB(=データベース)開発を始めよう。

■今回の開発内容

 次の画面は、今回(後編)で作成するプログラムを実行した例である。

今回(後編)で作成するプログラムの実行例
各ユーザーによって発注されたお弁当を一覧表示しているところ。リボンの[印刷]ボタンをクリックすると、データグリッドをそのまま印刷する。印刷した内容をFAXで飲食店に送るというシナリオ。

 この画面の例では、[注文一覧]メニュー*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つのテーブルを作成する。

  1. User:ユーザー情報を格納するテーブル
  2. Obento:お弁当情報を格納するテーブル
  3. Order:注文情報を格納するテーブル

 これには、([サーバー エクスプローラー]の[データ接続]項目配下にある)[<先ほど作成したデータベース項目>]−[テーブル]の右クリック・メニューから[新しいテーブルの追加]をクリックする。これにより、次の画面のようなテーブル・デザイナが表示される。

VS 2010に標準搭載されているSQL Serverデータベース用のテーブル・デザイナ
[Ctrl]+[S]キーを押すと、[名前の選択]ダイアログが表示される。そこで、テーブル名を入力して[OK]ボタンをクリックすることで、その名前のテーブルが作成される。

 このテーブル・デザイナを使って、下記の表に従って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つのテーブルを、そのデータセット・デザイナのデザイン・サーフェイス上にドラッグ&ドロップする。次の画面はその例。

3つのデータテーブルが追加されたデータセット・デザイナ

 データセット・デザイナに追加されたObento/Orderデータテーブル間とUser/Orderデータテーブル間には、リレーションシップを意味する線が引かれている。それぞれの線の右クリック・メニューから[リレーションシップの編集]を実行することにより、[リレーションシップ]ダイアログが表示されるので、[作成する制約の選択]として[リレーションシップと外部キー制約の両方]ラジオボタンを選択し、[UpdateRule の設定]コンボボックスで「Cascade」を選択、[DeleteRule の設定]コンボボックスで「Cascade」を選択し、[OK]ボタンをクリックしてダイアログを閉じる(これらの一連の設定の意味については、「連載:Visual Studio 2005によるWindowsデータベース・プログラミング 第7回 マスタ/詳細テーブルにおける更新処理」を参照されたい)。次の画面は、一連の作業の流れ。

[リレーションシップの編集]を実行
[リレーションシップと外部キー制約の両方]ラジオボタンを選択。[UpdateRule の設定]コンボボックスで「Cascade」を選択。[DeleteRule の設定]コンボボックスで「Cascade」を選択

リレーションシップと外部キー制約に関する設定の編集


 さらに、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

OrderListデータテーブル用のデータを取得するSQL文の例
このSQLスクリプト・コードを[SQL ステートメントの入力]ページで入力する。なお、[SQL ステートメントの入力]ページの[詳細オプション]ボタンから指定できる[オプティミスティック同時実行制御]チェックボックスはチェックを入れたままにしておく(デフォルトの設定)。

 最後に[完了]ボタンを押すと、[TableAdapter 構成ウィザード]が閉じられ、OrderListデータテーブルとOrderListTableAdapter(テーブルアダプタ)がデータセット・デザイナのデザイン・サーフェイス上に追加される(次の画面を参照。)。この状態で、[Ctrl]+[S]キーを押して内容を保存しておこう。

データセット・デザイナに追加されたOrderListデータテーブルとOrderListTableAdapter

 また、[お弁当発注]コンテンツで、ユーザー名を基に各自のお弁当注文状況を取得できるように、OrderTableAdapterに1つクエリを追加しておこう。データセット・デザイナ上の[OrderTableAdapter]の右クリック・メニューから[クエリの追加]を実行する。すると、先ほどとほぼ同等の[TableAdapter クエリの構成ウィザード]が開かれるので、上記と同様の手順で、下記のSQLスクリプト・コードを入力して作成する。

SELECT
  ID,
  User_ID,
  Obento_ID,
  Date
FROM
  dbo.[Order]
WHERE
  User_ID = @UserID

注文情報をユーザー名で絞って取得するSQL文の例(OrderTableAdapterに追加するクエリ)

 これにより、データテーブルにデータを格納するFillByメソッドが新たに追加される。

 以上でデータセットの作成は完了だ。いったんここでビルドしておこう。

 続いて、データベースと連結する「詳細」コントロールを作成する。

       1|2|3|4 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。