2013-12-17 3 views
0

У меня есть читатель, как это:Работа с Null в SqlDataReader

using (SqlDataReader reader = command.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     var item = new Product 
     { 
      _x1 = reader.GetString(0), 
      _x2 = reader.GetString(1), 
      _x3 = reader.GetString(2), 
      _x4 = reader.GetDateTime(3) 
     }; 
     list.Add(item); 
    } 
} 

Но иногда база данных имеет некоторые NULL значения, и я получаю данные являются недействительными исключением, как я могу иметь дело с этим?

+0

Где появляется нулевое исключение? В любом случае, положите 'if (reader! = Null или внутри' try/catch' – Tico

+0

Можете ли вы сделать переменные x равными нулю? –

+0

@Tico Исключение возникает, когда im создает новый объект Product. – gog

ответ

2

Скорее всего, одним из значений столбца является DBNull. Вы этого не проверяете.

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

public static string GetStringOrNull(this IDataReader reader, int ordinal) 
{ 
    return reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal); 
} 


public static DateTime? GetDateTimeOrNull(this IDataReader reader, int ordinal) 
{ 
    return reader.IsDBNull(ordinal) ? null : (DateTime?)reader.GetDateTime(ordinal); 
} 
0

Основная проблема у вас есть в том, что .NET не может бросить «NULL» в строку при вызове reader.GetString(). Чтобы решить вашу проблему, вы должны определить, что вы хотите сделать, если значение в считывателе данных равно NULL и предоставить это в вашем программном коде. Вы хотите использовать пустую строку? Вы хотите использовать null? вы хотите исключение?

Я бы предложил написать метод расширения для класса DataReader для создания новой функции, которая инкапсулирует желаемую логику. Это пример:

public static string GetStringOrEmptyString(this IDataReader reader, int ordinal) 
{ 
    if (reader.IsDBNull(ordinal)) { 
     // if its DBNULL, return empty string 
     return ""; 
    } else { 
     // otherwise return thew value as string 
     return reader.GetString(ordinal); 
    } 
} 

Вы можете использовать это как так:

var item = new Product 
{ 
    _x1 = reader.GetStringOrEmptyString(0), 
    _x2 = reader.GetStringOrEmptyString(1), 
    _x3 = reader.GetStringOrEmptyString(2), 
    _x4 = reader.GetDateTime(3) 
}; 
Смежные вопросы