Handling a DateTime DBNull

前端 未结 6 1926
广开言路
广开言路 2021-01-18 00:32

I have seen many, many versions of this on SO, but none of them seem to quite work for my needs.

My data comes from a vendor database that allows null for DateTime

6条回答
  •  旧巷少年郎
    2021-01-18 00:59

    I wrote a generic extension method that I use in all of my projects:

    public static object GetValueSafely(this System.Data.DataTable dt, string ColumnName, int index)
    {
        if (typeof(T) == typeof(int))
        {
            if (dt.Rows[index][ColumnName] != DBNull.Value)
                return dt.Rows[index][ColumnName];
            else
                return 0;
        }
        else if (typeof(T) == typeof(double))
        {
            if (dt.Rows[index][ColumnName] != DBNull.Value)
                return dt.Rows[index][ColumnName];
            else
                return 0;
        }
        else if (typeof(T) == typeof(decimal))
        {
            if (dt.Rows[index][ColumnName] != DBNull.Value)
                return dt.Rows[index][ColumnName];
            else
                return 0;
        }
        else if (typeof(T) == typeof(float))
        {
            if (dt.Rows[index][ColumnName] != DBNull.Value)
                return dt.Rows[index][ColumnName];
            else
                return 0;
        }
        else if (typeof(T) == typeof(string))
        {
            if (dt.Rows[index][ColumnName] != DBNull.Value)
                return dt.Rows[index][ColumnName];
            else
                return string.Empty;
        }
        else if (typeof(T) == typeof(byte))
        {
            if (dt.Rows[index][ColumnName] != DBNull.Value)
                return dt.Rows[index][ColumnName];
            else
                return 0;
        }
        else if (typeof(T) == typeof(DateTime))
        {
            if (dt.Rows[index][ColumnName] != DBNull.Value)
                return dt.Rows[index][ColumnName];
            else
                return DateTime.MinValue;
        }
        else if (typeof(T) == typeof(bool))
        {
            if (dt.Rows[index][ColumnName] != DBNull.Value)
                return dt.Rows[index][ColumnName];
            else
                return false;
        }
        if (dt.Rows[index][ColumnName] != DBNull.Value)
            return dt.Rows[index][ColumnName];
        else
            return null;
    }
    

    Usage example:

    private void Example()
    {
        DataTable dt = GetDataFromDb() // get data from database...
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            Console.WriteLine((DateTime)dt.GetValueSafely("SomeDateColumn", i));
            Console.WriteLine((int)dt.GetValueSafely("SomeIntColumn", i));
            Console.WriteLine((string)dt.GetValueSafely("SomeStringColumn", i));
        }
    }
    

提交回复
热议问题