Нулевой безопасный способ получить значения от Idatareader

StackOverflow https://stackoverflow.com/questions/2609875

Вопрос

(LocalVariable) ABC.String (имя) = (IdatAreader) DataReader.GetString (0);

Это значение имени исходит из базы данных. Что происходит здесь, если это значение имени равно нулю при чтении, это выбрасывает исключение?

Я делаю вручную, если здесь состояние. Я не хочу писать ручное условие, чтобы проверить все мои переменные ..

Я делаю что-то вроде этого сейчас ..

string abc =  (Idatareader)datareader.GetValue(0);
if(abc = null)
    //assiging null
else
    assiging abc value

Есть ли что-то подобное Можем ли мы написать метод расширения для этого? Спасибо

Это было полезно?

Решение

Вот пару методов расширения, которые приятно упаковывают все ваши опасения вокруг, чтобы извлекать сильно напечатанные значения из чтения данных. Если значение dbnull, по умолчанию будет возвращен тип типа. На случай, если string который является классом, null будет возвращено. Если поле было int, тогда 0 будет возвращен. Кроме того, если вы ожидаете int?, скажем, от Nullable INT поле, null будет возвращен.

Специфическое использование для случая Кумара:

string abc = datareader.GetValueOrDefault<string>(0);

Общее использование

var name = GetValueOrDefault<string>(reader, "Name");

или

var name = reader.GetValueOrDefault<string>("Name");

или

var name = reader.GetValueOrDefault<string>(0);

Расширение

public static class NullSafeGetter
{
   public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName)
   {
       int ordinal = row.GetOrdinal(fieldName);
       return row.GetValueOrDefault<T>(ordinal);
   }

   public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal)
   {
       return (T)(row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal));
   }
}

от http://skysanders.net/subtext/archive/2010/03/02/generic-nullsafe-idataRecord-field-getter.aspx.

Другие советы

Подобно @ Sky-Sanders отвечают, но менее строгим с преобразованиями:

public static T Get<T>(this IDataRecord row, string fieldName)
{
    int ordinal = row.GetOrdinal(fieldName);
    return row.Get<T>(ordinal);
}

public static T Get<T>(this IDataRecord row, int ordinal)
{
    var value = row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal);
    return (T)Convert.ChangeType(value, typeof(T));
}

Мое решение это то, что:

private static T GetValue<T>(object o) {
    if (typeof(DBNull) != o.GetType()) {
        return (T) o;
    }
    return default(T);
}

Когда, Status = GetValue<string>(currentDataRow["status"])

Сочетание лучших решений и предложений, вот C # 6 Выражение стрелки версия с поддержкой для GetValue<T> а также GetValueOrDefault<T> С необязательным значением значения по умолчанию.

public static class DataRecordExtensions {
    /// <summary>
    /// Generically extracts a field value by name from any IDataRecord as specified type. Will throw if DNE.
    /// </summary>
    public static T GetValue<T>(this IDataRecord row, string fieldName)
        => row.GetValue<T>(row.GetOrdinal(fieldName));

    /// <summary>
    /// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will throw if DNE.
    /// </summary>
    public static T GetValue<T>(this IDataRecord row, int ordinal)
        => (T)row.GetValue(ordinal);

    /// <summary>
    /// Generically extracts a field value by name from any IDataRecord as specified type. Will return default generic types value if DNE.
    /// </summary>
    public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName, T defaultValue = default(T))
        => row.GetValueOrDefault<T>(row.GetOrdinal(fieldName), defaultValue);

    /// <summary>
    /// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will return default generic types value if DNE.
    /// </summary>
    public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal, T defaultValue = default(T))
        => (T)(row.IsDBNull(ordinal) ? defaultValue : row.GetValue(ordinal));
}

Я бы использовал что-то вроде этого:

string abc = (IDataReader)datareader.GetValue(0) ?? "Default";
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top