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

Можно использовать? (оператор коалесценции) с DBNull?

Если у меня есть код, похожий на следующий:

while(myDataReader.Read())
{
  myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0);
}

Он выдает ошибку:

Объект нельзя отнести из DBNull к другим типам.

определяющий intVal как значение nullable int, не является опцией. Есть ли способ для меня сделать выше?

4b9b3361

Ответ 1

Можно ли использовать метод расширения? (списано с головы)

public static class DataReaderExtensions 
{
    public static T Read<T>(this SqlDataReader reader, string column, T defaultValue = default(T))
    {
        var value = reader[column];

        return (T)((DBNull.Value.Equals(value))
                   ? defaultValue
                   : Convert.ChangeType(value, typeof(T)));
    }
}

Вы бы использовали его как:

while(myDataReader.Read())
{
  int i = myDataReader.Read<int>("mycolumn", 0);
}

Ответ 2

Вот еще один вариант:

while (myDataReader.Read())
{
    myObject.intVal = (myDataReader["mycolumn"] as int? ?? 0);
}

Ответ 3

Можете ли вы просто использовать Int32.Tryparse?

int number;
bool result = Int32.TryParse(myDataReader["mycolumn"].ToString(), out number);

В соответствии с MSDN, number будет содержать 0, если сбой преобразования

Ответ 4

Как насчет чего-то типа:

object x = DBNull.Value;
int y = (x as Int32?).GetValueOrDefault(); //This will be 0

Или в вашем случае:

int i = (myDataReader["mycolumn"] as Int32?).GetValueOrDefault();

Ответ 5

Почему бы не использовать что-то другое, кроме оператора нулевого коалесцирования (DBNull.Value!= null):

int i = myDataReader["mycolumn"] == DBNull.Value ?
            Convert.ToInt32(myDataReader["mycolumn"]) :
            0;

Вы всегда можете его обернуть аккуратным методом расширения:

public static T Read<T>(this DataReader reader, string column, T defaultVal)
{
    if(reader[column] == DBNull.Value) return defaultVal;
    return Convert.ChangeType(reader[column], typeof(T));
}

Ответ 6

Нет, работает только для нулей.

Как насчет метода расширения объекта, который проверяет DBNull, и вместо этого возвращает значение по умолчанию?

//may not compile or be syntactically correct! Just the general idea.
public static object DefaultIfDBNull( this object TheObject, object DefaultValue )
{
    if( TheObject is DBNull )
        return DefaultValue;
    return TheObject;
}