Подтвердить что ты не робот

Данные Null. Этот метод или свойство не могут быть вызваны значениями Null

if (!string.IsNullOrEmpty(rd.GetString(2)))
{
    StrBcc = rd.GetString(2);
}

Ошибка: System.Data.SqlTypes.SqlNullValueException: данные являются нулевыми. Этот метод или свойство не могут быть вызваны значениями Null.

4b9b3361

Ответ 1

Моим решением было создать метод расширения:

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

Поэтому я могу использовать его как:

 StrBcc = rd.GetStringNullCheck(2);

Ответ 2

вы должны использовать

if (!rd.IsDbNull(2))
    StrBcc = rd.GetString(2);

Это потому, что, когда вы используете string.IsNullOrEmpty(x), вы сообщаете своему приложению, что x является строкой, а является нулевым значением базы данных, которое отличается от строки, значение которой равно null.

Ответ 3

Если ваши значения могут быть NULL, то использование SqlTypes вместо этого может быть более безопасным решением, поскольку все они реализуют INullable:

StrBcc = rd.GetSqlString(2);

или если вам нравятся методы расширения:

public static class DataReaderExtensions
{
    public static T GetValueOrNull<T>(this SqlDataReader reader, int ordinal) where T : class
    {
        return !reader.IsDBNull(ordinal) ? reader.GetFieldValue<T>(ordinal) : null;
    }

    public static T? GetValueOrNullable<T>(this SqlDataReader reader,  int ordinal) where T : struct 
    {
        if (reader.IsDBNull(ordinal)) return null;
        return reader.GetFieldValue<T>(ordinal);
    }
}