はじめに
データベースの検索画面とナビゲーション画面は、アプリケーションの他の部分に比べると、最初はとても簡単そうに見えます。しかし、すべてのユーザーの要望や要求に応えようとすると思いのほか時間がかかります。
この記事では、ASP.NET 2.0、SQL Server 2005、C# 2.0を使って、検索用のWebページを作成します。検索と結果のページでは、オプションの検索条件を表示し、結果セットのカスタムページングを行います。このソリューションでは、ランキング番号を生成するSQL 2005の新しい言語機能を利用して、カスタムページングとの関連付けを行います。また、.NETジェネリックの新機能を利用して、ストアドプロシージャの結果をカスタムコレクションに出力します。ミヤギ師匠が練習をとおしてダニエルに技を教えたように、この記事の例では、ファクトリ作成パターンなど、.NETジェネリックを使ったいくつかの一般的なデザインパターンを示します。この記事では、データベースのWebページを作成する上での一般的な方法論にも触れます。
最終的な完成イメージ
さて、本題に入りましょう。この記事では、検索および結果/ナビゲーションの画面を作成します(図1、2、3を参照)。
これから説明する13のヒントを通じて、最終的に次の状態を実現します。
- 検索画面で求められる要件を明確化し、それぞれの要件についての解決方法を決める。
- すべてのセッション変数とストアドプロシージャのパラメータを定義する。
- オプションの検索パラメータをすべて処理するストアドプロシージャコードを記述する。
- SQL 2005の新しいランキング関数を使って、ランキングとページングを統合するストアドプロシージャコードを記述する。
- SQL 2005の共通テーブル式を実装して、クエリと連携する。
- C#でデータアクセス層(DAL)を作成する。
- 基本のASP.NET 2.0 Webページを作成する。
- クイック検索ナビゲーションおよびページングを処理するASP.NET 2.0コードを作成する。
- 列のソートを処理するページを作成する。
- グリッド結果セットおよび結果情報を設計する。
- ページの列を別のページへのリンクとして設定する。
- ユーザーがリストに対して可変個数の選択を行うことができるように、アプリケーションを変更する。
- カスタムオブジェクトに出力するようにDALを変更する。
最後に、付録として、.NETジェネリックを利用し、匿名メソッドでソートを処理するコードを示します。
説明は少なく、コードは多く
私は、この記事を執筆するに際して、新年の誓いを立てました(この記事を執筆している時点で、2006年がまだ数日残っています)。それは、「説明は短く、コードは長く」です。私が.NETについて学びだして数年経ちますが、非常に参考になった書籍や記事は、有意義なコードサンプルが記載されているものでした。そこで、どのヒントでも、余計なおしゃべりはできるだけ控えて、具体的なコードを紹介するようにします。
ヒント1: 要件の明確化
例えばブラウザベースの電子メールWebページなど、任意の列でソートでき、Next/Previousリンクまたはページ番号のリンクでページ間をナビゲートするWebサイトを利用したことはありませんか。たまに使うのであれば、このような一般的なナビゲーション設計でも十分です。
しかし、「R」という文字で始まる特定の行や項目を表示したい場合はどうでしょうか。多分、降順で列をソートし、目的の項目に達するまでNextリンクをクリックするか、目的の項目が何ページ目にあるかを推測することになるでしょう。これはまるで、値段当てを競うテレビ番組のようです。出場者が「500」と言うと司会者が「もっと高い」と言い、出場者が「550」と言うと司会者が「もっと安い」と言います。出場者が本当の値段を言い当てるまで(またはブザーが鳴るまで)、値の増減が繰り返されます。
このことは、この記事のサンプルプロジェクトのテーマであるナビゲーションにそのまま当てはまります。よくないデザインパターンを言い表すときに「空振り」という表現を使いますが、ユーザーが余計なナビゲーション操作をしなければならないWebページも、そうしたよくないデザインの一例です。もちろん、外見的に優れたデザインのWebページはユーザーを魅了しますが、リピーター率が高いのはナビゲーション部分がきちんと整備されているWebページです。
この記事では、図1、2、3のようなWebページを作成する方法について説明します。このソリューションには、次の機能が含まれます。
- 名前、住所、市、州、郵便番号の検索パラメータに基づいて、50万行から成る顧客テーブルで検索を実行できる。部分テキスト検索も可能(例えば、「City」列で「HAMILTON」を検索すると、「123 HAMILTON BLVD」がヒットする)。
- 結果はページンググリッドに表示され、一度に表示される最大行数(
MAXROWS
)を設定できる。 - Next/Previous/Top/Bottomボタンでページをナビゲートできる。
- 列見出しをクリックして列をソートできる。
- 現在の列のソート基準に基づいて、特定の結果セットにクイックジャンプできる。
- クイックジャンプ用のコントロールはプルダウン形式であり、選択項目はアルファベットの各文字または1桁の数字から成る。
MAXROWS
より少ない場合は、「M」で始まるすべての行と、それ以降の行がMAXROWS
に達するまでページに表示される。この実装について、もう少し説明しておきます。おそらく、ここで挙げた機能のほとんどは最新バージョンのASP.NETないしサードパーティのWebグリッドに含まれているのではないかと思った人もいることでしょう。部分的にはそうなのですが、すべての要件を満たすためには、多少の努力が必要です。今回のソリューションでは、SQL 2005のストアドプロシージャ、ASP.NET 2.0のGridView、そしてC# 2.0のコードを使ってこれを作成します。図4は、このWebサイトの開発ソリューション全体を示しています。全体的なプランは次のとおりです。
- 検索ページのすべての入力条件と変数を明確化し、ストアドプロシージャのパラメータを確定する。
- T-SQL 2005の新しいランキング関数を利用してページングパラメータと関連付けるストアドプロシージャを作成し、テストする。
- Webページとストアドプロシージャとのやり取りに使用するデータアクセスクラスをC#で作成する。
- すべてのWebページ動作(グリッド結果のフォーマット、ページナビゲーション、ページコントロール、変数など)を処理するWebページを設計し、C#の分離コード(コードビハインド)を作成する。
- DataSetまたはカスタムコレクションを返す基本のデータアクセス層を設定する。
