Handle DBNull in C#

前端 未结 13 792
梦谈多话
梦谈多话 2020-11-30 01:36

Is there a better/cleaner way to do this?

int stockvalue = 0;
if (!Convert.IsDBNull(reader[\"StockValue\"]))
    stockvalue = (int)reader[\"StockValue\"];
         


        
13条回答
  •  南笙
    南笙 (楼主)
    2020-11-30 02:11

    I wrote an extension method several days ago. By using it you could just do:

    int? stockvalue = reader.GetValue("StockValue");
    

    Here's the extension method (modify to fit your needs):

    public static class ReaderHelper
    {
        public static bool IsNullableType(Type valueType)
        {
            return (valueType.IsGenericType &&
                valueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)));
        }
    
        public static T GetValue(this IDataReader reader, string columnName)
        {
            object value = reader[columnName];
            Type valueType = typeof(T);
            if (value != DBNull.Value)
            {
                if (!IsNullableType(valueType))
                {
                    return (T)Convert.ChangeType(value, valueType);
                }
                else
                {
                    NullableConverter nc = new NullableConverter(valueType);
                    return (T)Convert.ChangeType(value, nc.UnderlyingType);
                }
            }
            return default(T);
        }
    }
    

提交回复
热议问题