2011-06-16 12 views
1

私は2つのMS Accessデータベースの間でインポートアシスタント(C#.NET 4)で作業しており、データの一貫性を確保するためのメカニズムを実装する必要があります。データのインポート時に適合性チェックを

例:

インポート人。

問題:人のテーブルから

列が異なる列のサイズを持っています。

ソーステーブル:アドレス列サイズ= 50;

宛先テーブル:アドレス列サイズ= 30;

アドレスが30文字を超える人物をインポートしようとすると、問題が表示されます。

所望の解:以前の問題は、ダイアログを表示さ

は、ユーザが再定義するか、必要長さに対応する値を切り捨てることができる場合に表示する必要があります。

インポート機能は、私は私のオブジェクトの魔女に格納されているメタデータ情報は、私の先の列の列サイズにアクセスすることを可能にする必要があり、この

private static void ImportPerson() 
{ 
    var sourcePerson = sourcePerson.GetObject(); 
    if (sourcePerson == null) 
     return; 

    var person = new MyPerson(); 
    person.Address.Value = sourcePerson.Address;  
    person.Company.Value = sourcePerson.Company; 
    person.Save(); 
} 

ようになります。

person.Address.ColumnSize 

このように、ビジネスオブジェクトに新しい値を埋め込んだ後、このようにすることができます。

if (person.Address.ColumnSize.CompareTo(person.Address.Value.Length)) < 0 
    // show dialog ... 

残念ながら、これはすべてのプロパティ(住所、会社...など)を個別にチェックすることを意味します。

私はすべてのプロパティを個別にチェックする必要がない、より一般的なアプローチを探しています。

すべてのアイデア、提案、考えが高く評価されます。

答えて

1

おそらく、あなたのクラスのメンバ(Adress、Companyなど)はすべて、メタデータに使用している一貫したプロパティを持つように見えるので、同じタイプのオブジェクトです。メソッドを追加してクラスのプロパティにアクセスできるようにするには、クラスをMyPersonに追加します。

class MyPerson { 

    public IEnumerable<MemberClass> Properties 
    { 
     get { 
      yield return Adress; 
      yield return Company; 
      ... 
     } 
    } 
    ... 
} 

その後

foreach (MemberClass prop in person.Properties) { 
    if (prop.ColumnSize.CompareTo(prop.Value.Length) < 0) 
     // show dialog ... 
    } 
} 

それはおそらく、リスト内のすべての障害を収集し、ちょうどレコードの単一ダイアログを表示し、ユーザのための生活を楽にするために理にかなって。

+0

これは興味深いです。私はそれを試してみましょう。しかし、私はビジネスオブジェクトからダイアログを表示することについて確信していません – thedev

+0

私が提案していることは、ダイアログを表示する場所に関係なく、MyPersonクラスのプロパティにアクセスする別の方法です。コードの2番目のビットは、現在のセットアップとまったく同じ場所にあります。 –

+0

あなたは正しいです...私はそれを試してみましょう;)ありがとう – thedev

0

プロパティを取得し、IMetaDataの辞書を参照することを検討しましたか?

private Dictionary<string, IMetaData> metaData; 

public PersonAddress Address { 
    get { return (PersonAddress)metaData["Address"]; } 
    set { metaData["Address"] = value; } 
} 

次に、各キーを処理し、小切手を実行しても同じインターフェースを維持できます。

public void Process() { 
    foreach(var key in metaData.Keys) { 
     var property = metaData[key]; 
     // Check the property... 
    } 
} 

これでうまくいくはずです。しかし、メタデータ・ディクショナリを使用して独自のクラスを作成したい場合には、フィーチャー・エンビーが表示されることがあります。しかし、それはあなたの質問の範囲外です。

関連する問題