2015-10-22 11 views
-1

Я получаю сообщение об ошибке при попытке создать список объектов. Я вызываю веб-службу, которая возвращает определенное количество столбцов для определенных продуктов.Столбец не принадлежит таблице C#

У меня есть класс, чтобы хранить эти значения, которые держат все столбцы доступны, но при получении данных для продуктов, которые отсутствуют 1 столбец он терпит неудачу с ошибкой:

Column «х» не принадлежит к таблице у.

Поскольку я знаю, что колонка не существует, мне нужно значение замены, если оно не существует. У меня около 50 разных столбцов, поэтому каждый из них в одном (если есть столбец) - это то, чего я бы хотел избежать!

Пример кода, dprow это шаблон объекта, который содержит все доступные столбцы

dprow.currency = row.Field<string>("currency"); 
dprow.categoryCode = row.Field<string>("categoryCode"); 
+1

Что вопрос? –

+0

простой способ: try-catch. не рекомендуется, но на всякий случай вы ничего не нашли. –

ответ

0

Возьмите таблицу, чтобы вернуться из веб-службы (в моем случае я просто говорю, создать совершенно новый) и затем создайте словарь со всеми столбцами, которые вы хотите представить, и каково должно быть значение по умолчанию. Если этот столбец еще не указан в таблице, добавьте его в таблицу со значением по умолчанию.

DataTable dt = new DataTable(); 
Dictionary<string, object> columnDefaultValues = new Dictionary<string, object>(){ 
    {"currency", "some default"}, 
    {"categoryCode", "some other default"}, 
    {"another", 43} 
}; 

foreach (var keyPair in columnDefaultValues) { 
    if (!dt.Columns.Contains(keyPair.Key)) { 
     dt.Columns.Add(new DataColumn(keyPair.Key) { DefaultValue = keyPair.Value }); 
    } 
} 
+0

Спасибо, я использовал что-то очень похожее на это, чтобы решить мою проблему. Создал таблицу и сделал слияние двух таблиц. – Artiros

1

Это предположение, что ваша строка является DataRow, но концепция применяется независимо. Вы можете написать метод расширения, который будет проверять, если столбец существует первый: пример

public static class DataRowExtensions 
{ 
    public static T TryGetField<T>(this DataRow row, string fieldName) 
    { 
     return row.Table.Columns.Contains(fieldName) ? row.Field<T>(fieldName) : default(T); 
    } 
} 

Использования: dprow.currency = row.TryGetField<string>("currency");

+0

Ударь мне. Я назвал мой «GetValueOrDefault» – Khan

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