.NET Developer Empire

帝国の逆襲

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  15  : 記事  5  : コメント  48  : トラックバック  8

記事カテゴリ

書庫

2007年8月5日 #

先ほど書いたValidation Application Blockの記事で、えムナウさんから型付データセットのRewardPoints(System.Int32)に文字列を入れたら入力値検証前に落ちるのではないか?とのご指摘を受けました。

Validation Application Block を使おう!! ~構成ファイル編~

確かに、おっしゃる通りです。

そこで対応策。

RewardPoints の System.Int32 を System.String 型にしてしまい、カスタムValidatorを作って対応します。カスタムValidatorでは、Stringをintに変換し、変換したintに対して検証をかけるという感じです。実装例は以下の通りです。


using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

using Microsoft.Practices.EnterpriseLibrary.Validation;

using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;

using Microsoft.Practices.EnterpriseLibrary.Validation.Configuration;

using System.Collections.Specialized;

 

namespace ValidationABSample.CustomValidator

{

    [ConfigurationElementType(typeof(CustomValidatorData))]

    public class IntRangeValidator : Validator

    {

 

        private int _lowerBound = 0;

        private RangeBoundaryType _lowerBoundType = RangeBoundaryType.Ignore;

        private int _upperBound = 0;

        private RangeBoundaryType _upperBoundType = RangeBoundaryType.Ignore;

 

        // コンストラクタ

        public IntRangeValidator(NameValueCollection attributes)

            : base(null, null)

        {

            _lowerBound = Int32.Parse(attributes.Get("lowerBound"));

            _upperBound = Int32.Parse(attributes.Get("upperBound"));

            if (attributes.Get("lowerBoundType").Equals("Exclusive"))

            {

                _lowerBoundType = RangeBoundaryType.Exclusive;

            }

            if (attributes.Get("lowerBoundType").Equals("Inclusive"))

            {

                _lowerBoundType = RangeBoundaryType.Inclusive;

            }

            if (attributes.Get("upperBoundType").Equals("Exclusive"))

            {

                _upperBoundType = RangeBoundaryType.Exclusive;

            }

            if (attributes.Get("upperBoundType").Equals("Inclusive"))

            {

                _upperBoundType = RangeBoundaryType.Inclusive;

            }

        }

 

        // デフォルトメッセージ

        protected override string DefaultMessageTemplate

        {

            get { return "数値範囲チェック。The value must fall within the range {0} ({1}) - {2} ({3})."; }

        }

 

        // 検証メソッド

        protected override void DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults)

        {

            if (objectToValidate != null)

            {

                try

                {

                    int valueToValidate = int.Parse(objectToValidate.ToString());

                    RangeValidator<int> validator = new RangeValidator<int>(_lowerBound, _lowerBoundType, _upperBound, _upperBoundType);

                    ValidationResults results = validator.Validate(valueToValidate);

 

                    if (!results.IsValid)

                    {

                        string message = string.Format(DefaultMessageTemplate, _lowerBound, _lowerBoundType, _upperBound, _upperBoundType);

                        this.LogValidationResult(validationResults, message, currentTarget, key);

                    }

                }

                catch (FormatException)

                {

                    string message = "数値を入力してください。";

                    this.LogValidationResult(validationResults, message, currentTarget, key);

                }

            }

        }

    }

}

 


このカスタムValidatorを使って検証することで、文字列でなかったら「数値を入力してください。」というメッセージを、数値で範囲チェック違反があったら、設定したデフォルトメッセージを表示するようにできます。

EnterpriseLibraryのValidatorを継承することで、こんなようにカスタムValidatorを自由に作る事もできます。

こんな感じでどうでしょうか?

実行結果

posted @ 20:08 | Feedback (2)

SELECT @@IDENTITY

これです!!

SQL Serverってあまりいじってなかったんだけど、最近どうしても必要になったので、手探りながら触ってます。

主キーの自動採番を使おうとIDENTITYを指定したんだけど、どうやってレコード挿入後にIDENTITY列を取得しようかと調べていたら見つけたもの。

SQL文の最後に「SELECT  @@IDENTITY」をつけるだけで良いって、楽すぎるじゃないか!!

ちょっと幸せになれた瞬間でしたー

なにかもっと幸せになれることないかなぁ???


正解は「SCOPE_IDENTITY」でした!! (2007/8/6)

以下、MSDNでの解説URL。

http://msdn2.microsoft.com/ja-JP/library/ms190315.aspx

http://msdn2.microsoft.com/ja-JP/library/ms187342.aspx


むらぷろさんがこの件についてまとめてくれました。以下のブログです。

SQL Server によるIDの生成

posted @ 15:27 | Feedback (6)

Enterprise Library 3.1 の Validation Application Block で、構成ファイルを利用した検証ルールの設定方法を記事にまとめました。

Validation Application Block を使おう!! ~構成ファイル編~

構成ファイルに検証ルールを設定する事で、Visual Studioで自動生成されたクラスのメソッドやプロパティについても、Designer.csを触ることなく検証できます。

今回はデータセットに対して検証をかけるというサンプルを作ってみました。実行結果はこんな感じです。

DataGridViewにバインドしたDataSetに対して検証をかけます。データベースからデータを取得してそれを編集し、データベースへ再登録する、なんていう処理を行うときに、データベース再登録前に値チェックを行うと思います。そんなときにもValidation Application Blockを利用することがきます。

結構簡単にできるのでお試しあれ!!

posted @ 13:26 | Feedback (0)