Handle DBNull in C#

前端 未结 13 754
梦谈多话
梦谈多话 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:17

    I have two following extension methods in my project:

        public static T GetValueSafe(this IDataReader dataReader, string columnName, Func valueExtractor)
            where T : class 
        {
            T value;
            if (dataReader.TryGetValueSafe(columnName, valueExtractor, out value))
            {
                return value;
            }
    
            return null;
        }
    
        public static bool TryGetValueSafe(this IDataReader dataReader, string columnName, Func valueExtractor, out T value)
        {
            int ordinal = dataReader.GetOrdinal(columnName);
    
            if (!dataReader.IsDBNull(ordinal))
            {
                // Get value.
                value = valueExtractor.Invoke(dataReader, ordinal);
    
                return true;
            }
    
            value = default(T);
            return false;
        }
    

    The usage can be like this:

    string companyName = dataReader.GetValueSafe("CompanyName", (reader, ordinal) => reader.GetString(ordinal));
    

提交回复
热议问题