チュートリアル : n 層データ アプリケーションへの検証の追加
データの検証とは、データ オブジェクト (DataTable や LINQ to SQL クラスなど) に入力された値が、オブジェクトのスキーマ内の制約に従っていることを確認するプロセスです。 検証では、アプリケーションに設定されている規則に準拠しているかどうかも確認します。 基になるデータベースに更新を送信する前にデータを検証すると、エラーを減らすことができます。 アプリケーションとデータベースの間で生じる可能性のあるラウンド トリップの回数も減ります。
このチュートリアルでは、n 層アプリケーション (「チュートリアル : n 層データ アプリケーションの作成」トピックで作成したソリューション) に検証を追加するための詳細な手順について説明します。
このチュートリアルでは、次のタスクを実行する方法を学習します。
データセット デザイナーを使用して部分クラスを自動的に生成します。
個々の列の値が変化したときに検証を実行するコードを追加します。
必須コンポーネント
このチュートリアルを実行するための要件は次のとおりです。
「チュートリアル : n 層データ アプリケーションの作成」で作成したソリューションおよび関連するプロジェクト。
Northwind サンプル データベースにアクセスします。 詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
注意
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「Visual Studio の設定」を参照してください。
NTierWalkthrough ソリューションを開く
NTierWalkthrough ソリューションを開くには
[ファイル] メニューの [開く] をポイントし、[プロジェクト/ソリューション] をクリックして、NTierWalkthrough.sln ファイルの場所に移動します。
注意
NTierWalkthrough.sln ファイルは「チュートリアル : n 層データ アプリケーションの作成」トピックで作成され、このチュートリアルを実行するための前提条件となっています。 まだ行っていない場合は、「チュートリアル : n 層データ アプリケーションの作成」トピックを完了し、終了時にすべてのプロジェクトを保存してください。
個々の列が変化した時にデータをチェックする検証の追加
この手順では、新しい注文の OrderDate 列に現在の日付以前の値が設定されていることを確認する検証を追加します。 このアプリケーションの要件として、OrderDate 列には今日より後の日付は設定できません。つまり、未来の注文は許容されません。
OrderDate 列に入力された値を確認する検証を追加するには
ソリューション エクスプローラーで DataAccessTier プロジェクトの NorthwindDataSet.xsd ファイルをダブルクリックして、データセットをデータセット デザイナーで開きます。
デザイナーで、Orders テーブルの OrderDate 列をダブルクリックします。 この操作によって ColumnChanging イベント ハンドラーが作成されます。
注意
データセット デザイナーでは、C# イベントのイベント ハンドラーは自動的には作成されません。 C# でのイベントの処理に必要なコードは、後の手順で説明します。 SampleColumnChangingEvent を作成し、EndInit メソッドの中で ColumnChanging イベントをサブスクライブします。
OrderDate 列の e.ProposedValue に今日以前の日付が含まれていることを検証するコードを追加します。 指定された値が有効でない場合は、エラーがあることを表すように該当する列を設定します。
次のコード例は、OrderDate 列に今日以前の日付が含まれていることを検証します。 OrderDate の値が今日より後の日付の場合は、OrderDate 列にエラーが設定されます。 OrderDate が今日以前の場合は、Else 句でエラーをクリアします。
Visual Basic のコードは、ColumnChanging イベント ハンドラーに貼り付けてください。 C# のコードは、OrdersDataTable 部分クラスの宣言に貼り付けてください。
If (e.Column.ColumnName = Me.OrderDateColumn.ColumnName) Then If CType(e.ProposedValue, DateTime) > Today Then e.Row.SetColumnError(e.Column, "OrderDate cannot be in the future") Else e.Row.SetColumnError(e.Column, "") End If End If
// Replace the NorthwindDataSet partial class with the following: public partial class NorthwindDataSet { partial class OrdersDataTable { public override void EndInit() { base.EndInit(); // Configure the ColumnChanging event // to call the SampleColumnChangingEvent method. ColumnChanging += SampleColumnChangingEvent; } public void SampleColumnChangingEvent(object sender, System.Data.DataColumnChangeEventArgs e) { if (e.Column.ColumnName == OrderDateColumn.ColumnName) { if ((System.DateTime)e.ProposedValue > System.DateTime.Today) { e.Row.SetColumnError("OrderDate", " OrderDate cannot be in the future"); } else { e.Row.SetColumnError("OrderDate", ""); } } } } }
アプリケーションのテスト
アプリケーションをテストするには、OrderDate 列の値を有効ではない日付に変更します。
アプリケーションをテストするには
F5 キーを押します。
Customers テーブルと Orders テーブルのデータがフォームに表示されます。
注文を含む DataGridView で、任意のレコードの OrderDate 列の値を明日の日付に変更します。
別の行に移動して、変更を確定します。
検証は失敗し、無効な値が含まれている OrderDate セルにエラー アイコンが表示されます。
エラー アイコンの上にマウス ポインターを置き、検証エラーを確認します。
フォームを閉じます
次の手順
アプリケーションの要件に応じて、n 層アプリケーションへの検証の追加後に実行する手順がいくつかあります。 たとえば、このアプリケーションに対して次のような拡張を行うことができます。
- レコード全体が変更されたときに変更を確認する検証を追加します。 詳細については、「方法 : n 層データセットに検証を追加する」を参照してください。