Как предотвратить исключение нулевого значения при получении записей с использованием Oledb
while(r.Read())
{
ListViewItem item = new ListViewItem(r.GetString(2));
item.SubItems.Add(r.GetString(3));
item.SubItems.Add(r.GetString(4));
item.SubItems.Add(r.GetString(5));
item.SubItems.Add(r.GetString(6));
item.SubItems.Add(r.GetString(7));
item.SubItems.Add(r.GetString(8));
item.SubItems.Add(r.GetString(11));
lsvListOfBooks.Items.Add(item);
}
этот код заполняет просмотр списка записями. но если ячейка из базы данных равна нулю, она выдает исключение
Specified cast is not valid
и выходит из потока, а остальные записи не будут отображаться.
как я могу справиться с этим?
1 ответ
Проблема в том, что нулевые значения в столбцах результата представлены другим типом - DBNull
чтобы быть точным - и это не может быть тривиально приведено к string
,
Самое простое решение - создать расширение для IDataReader
интерфейс, который будет обнаруживать DBNull
ценности и конвертировать их. Добавьте этот класс в свой код:
public static partial class Extensions
{
public static string GetNullableString(this IDataReader self, int ordinal)
{
return self.IsDBNull(ordinal) ? null : self.GetString(ordinal);
}
}
Теперь вы можете заменить GetString
с GetNullableString
в вашем коде, и он должен функционировать, как ожидалось. IsDBNull
call обнаружит нулевое условие и вернет null вместо выдачи ошибки.
К сожалению, такого рода вещи требуются для всех типов данных. Если для поля допустимо нулевое значение, IDataReader
буду использовать DBNull
значения, которые несовместимы с любым из типов Nullable.