2015-03-18 5 views
0

Привет, как я могу игнорировать нулевые значения в читателе C# в моем заявлении =>Игнорировать нулевые значения в считывателем

LegalDesc = reader["legal1"].ToString() + ' ' + 
      reader["legal2"].ToString() + ' ' + 
      reader["legal3"].ToString(); 

Сценарий: если legal2 имеет нулевое значение результирующая строка будет

legalDesc = legal1 + ' ' + legal3 

Как можно использовать iif, используемый в VB?

+1

Как насчет 'читателя [" legal2 "] ?? ""? –

+1

Как насчет 'reader.IsDbNull'? – TryingToImprove

+0

вы бы перефразировали мой скрипт ... спасибо – Jake

ответ

1

Вы можете использовать коллекцию и String.Join:

List<string> legals = new List<string>(); 
if(!reader.IsDbNull(reader.GetOrdinal("legal1"))) 
    legals.Add(reader["legal1"].ToString()); 
if(!reader.IsDbNull(reader.GetOrdinal("legal2"))) 
    legals.Add(reader["legal2"].ToString()); 
if(!reader.IsDbNull(reader.GetOrdinal("legal3"))) 
    legals.Add(reader["legal3"].ToString()); 
LegalDesc = string.Join(" ", legals); 

Конечно, вы можете также сделать код более элегантным с использованием метода пользовательского расширения:

public static string SafeGetString(this SqlDataReader reader, int colIndex) 
{ 
    if(!reader.IsDBNull(colIndex)) 
     return reader.GetString(colIndex); 
    else 
     return string.Empty; 
} 

Теперь вы можете использовать:

string[] legals = { reader.SafeGetString(0), reader.SafeGetString(1), reader.SafeGetString(2) }; 
LegalDesc = string.Join(" ", legals.Where(s => !string.IsNullOrEmpty(s))); 

Это предполагает, что это фактически столбец string d порядковые позиции столбца составляют от 0 до 2. Если это не так, используйте приведенный выше подход reader.GetOrdinal для их обнаружения.

+0

, вы можете сократить код с помощью цикла for. читатель ["legal" + i] –

+0

Я получаю сообщение об ошибке .isdbnull выделен красным цветом в VS. Данные поступают из листа excel, вызывающего класс для загрузки внутри Grid ... – Jake

+0

@RezoMegrelidze: но это не удастся, как только OP изменит имена столбцов или не захочет включать все, кроме только определенных чисел. –

0

Используя простой метод расширения:

public static string ValueOrEmpty(this object source) 
{ 
    return source == null ? string.Empty : source.ToString(); 
} 

var values = new[] { reader["legal1"],reader["legal2"],reader["legal3"] }; 
LegalDesc = string.Join(" ", 
         values.Select(x => x.ValueOrEmpty()) 
           .Where(x => x != string.Empty)); 
+0

Очень элегантный, но работает с DbNull.Value? – Steve

0

Первый

Не сделать конкатенацию, как это, каждый раз, когда вы конкатенации, он создает новый экземпляр строки, поскольку строка Immutable. Существует С # класс, который обрабатывает присоединяет и это StringBuilder

Так попробовать реализовать его как этот

StringBuilder builder = new StringBuilder(); 
builder.Append(reader["legal1"]) 
    .Append(" ") 
    .Append(reader["legal2"]) 
    .Append(" ") 
    .Append(reader["legal3"]); 
Console.WriteLine(builder.ToString()); 
Console.ReadKey(); 

Таким образом, вам не нужно даже проверить, если это нуль.

+0

True stringbuilder - это путь, но если вы только собираетесь объединить три строки, улучшение будет незначительным до такой степени, что во многих местах его можно было бы игнорировать. http://stackoverflow.com/questions/73883/string-vs-stringbuilder – Shekhar

+0

@Shekhar true также, но дополнительным преимуществом здесь является удаление нулевой проверки. – DevEstacion

+0

Я не согласен на использование StringBuilder для таких коротких вещей (string.Concat лучше), и в любом случае мы говорим о микро-оптимизации, которые здесь не имеют смысла, однако это не отвечает на вопрос. – Steve

0

Привет Я просто хочу перефразировать мою проблему ...

как можно просмотреть значение в LegalDesc = читателя [ «правовые1»]. ToString(), если правовые1 равна нулю?

Я просматриваю свой результат в сетке, и сетка показывает NULL в ячейке. Результат должен быть пустым пространством вместо NULL .... в VB net Я мог бы использовать функцию IIf, если пустое пустое пространство ...

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