2011-06-16 3 views
1

Я работаю над помощником по импорту (C# .NET 4) между двумя базами данных MS Access и мне нужно реализовать механизм для обеспечения согласованности данных.обобщающие проверки соответствия при импорте данных

Пример:

Импорт лица.

Проблема:

столбцы из таблиц лица имеют разные размеры столбцов.

Таблица источников: размер столбца = 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

Предполагается, что члены вашего класса (адрес, компания и т. Д.) Являются объектами одного типа, поскольку они, похоже, имеют согласованные свойства, которые вы используете для метаданных. Добавьте метод в ваш класс 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. Второй бит кода будет точно таким же, как и текущая настройка. –

+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... 
    } 
} 

Это должно сработать. Однако это может привести к зависти функции, и в этом случае вы захотите взять словарь метаданных и создать для него свой собственный класс. Но это выходит за рамки вашего вопроса.

Смежные вопросы