Можно использовать? (оператор коалесценции) с DBNull?
Если у меня есть код, похожий на следующий:
while(myDataReader.Read())
{
myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0);
}
Он выдает ошибку:
Объект нельзя отнести из DBNull к другим типам.
определяющий intVal
как значение nullable int, не является опцией. Есть ли способ для меня сделать выше?
Ответы
Ответ 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;
}