SqlDataReader Best way to check for null values -sqlDataReader.IsDBNull vs DBNull.Value

前端 未结 3 489
盖世英雄少女心
盖世英雄少女心 2021-02-04 10:01

I want to retrieve decimal values from the database and I would like to know which is the recommended way to check for null values.

I have seen on MSDN - DBNull.Value F

3条回答
  •  情话喂你
    2021-02-04 10:52

    I would not get too caught up in the which method is better, because both work and I have used both in code before.

    For instance, here is a utility function I dug up from one of my old projects:

    /// 
    /// Helper class for SqlDataReader, which allows for the calling code to retrieve a value in a generic fashion.
    /// 
    public static class SqlReaderHelper
    {
        private static bool IsNullableType(Type theValueType)
        {
            return (theValueType.IsGenericType && theValueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)));
        }
    
        /// 
        /// Returns the value, of type T, from the SqlDataReader, accounting for both generic and non-generic types.
        /// 
        /// T, type applied
        /// The SqlDataReader object that queried the database
        /// The column of data to retrieve a value from
        /// T, type applied; default value of type if database value is null
        public static T GetValue(this SqlDataReader theReader, string theColumnName)
        {
            // Read the value out of the reader by string (column name); returns object
            object theValue = theReader[theColumnName];
    
            // Cast to the generic type applied to this method (i.e. int?)
            Type theValueType = typeof(T);
    
            // Check for null value from the database
            if (DBNull.Value != theValue)
            {
                // We have a null, do we have a nullable type for T?
                if (!IsNullableType(theValueType))
                {
                    // No, this is not a nullable type so just change the value's type from object to T
                    return (T)Convert.ChangeType(theValue, theValueType);
                }
                else
                {
                    // Yes, this is a nullable type so change the value's type from object to the underlying type of T
                    NullableConverter theNullableConverter = new NullableConverter(theValueType);
    
                    return (T)Convert.ChangeType(theValue, theNullableConverter.UnderlyingType);
                }
            }
    
            // The value was null in the database, so return the default value for T; this will vary based on what T is (i.e. int has a default of 0)
            return default(T);
        }
    }
    

    Usage:

    yourSqlReaderObject.GetValue("SOME_ID_COLUMN");
    yourSqlReaderObject.GetValue("SOME_VALUE_COLUMN");
    

提交回复
热议问题