Как предотвратить исключение нулевого значения при получении записей с использованием 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.

Другие вопросы по тегам