IDataReader - GetValueAsOrDefault

An IDataReader extension method that gets value as or default.

Try it

public static void Main()
{
	const string sql = @"SELECT 1 As IntColumn";

    using (var conn = new SqlConnection(FiddleHelper.GetConnectionStringSqlServer()))
    {
        using (SqlCommand @this = conn.CreateCommand())
        {
            conn.Open();
            @this.CommandText = sql;
            using (SqlDataReader reader = @this.ExecuteReader())
            {
                while (reader.Read())
                {
					//C# Extension Method: IDataReader - GetValueAsOrDefault
                    var result1 = reader.GetValueAs<int>("IntColumn");
                    var result2 = reader.GetValueAsOrDefault<int>("UnknownColumn");
                    int result3 = reader.GetValueAsOrDefault("UnknownColumn", -1);
                    int result4 = reader.GetValueAsOrDefault("UnknownColumn", (dataReader, s) => -2);

                    Console.WriteLine(result1);
                    Console.WriteLine(result2);
                    Console.WriteLine(result3);
                    Console.WriteLine(result4);
                }
            }
        }
    }
}

View Source
using System;
using System.Data;

public static partial class Extensions
{
    /// <summary>
    ///     An IDataReader extension method that gets value as or default.
    /// </summary>
    /// <typeparam name="T">Generic type parameter.</typeparam>
    /// <param name="this">The @this to act on.</param>
    /// <param name="index">Zero-based index of the.</param>
    /// <returns>The value as or default.</returns>
    public static T GetValueAsOrDefault<T>(this IDataReader @this, int index)
    {
        try
        {
            return (T) @this.GetValue(index);
        }
        catch
        {
            return default(T);
        }
    }

    /// <summary>
    ///     An IDataReader extension method that gets value as or default.
    /// </summary>
    /// <typeparam name="T">Generic type parameter.</typeparam>
    /// <param name="this">The @this to act on.</param>
    /// <param name="index">Zero-based index of the.</param>
    /// <param name="defaultValue">The default value.</param>
    /// <returns>The value as or default.</returns>
    public static T GetValueAsOrDefault<T>(this IDataReader @this, int index, T defaultValue)
    {
        try
        {
            return (T) @this.GetValue(index);
        }
        catch
        {
            return defaultValue;
        }
    }

    /// <summary>
    ///     An IDataReader extension method that gets value as or default.
    /// </summary>
    /// <typeparam name="T">Generic type parameter.</typeparam>
    /// <param name="this">The @this to act on.</param>
    /// <param name="index">Zero-based index of the.</param>
    /// <param name="defaultValueFactory">The default value factory.</param>
    /// <returns>The value as or default.</returns>
    public static T GetValueAsOrDefault<T>(this IDataReader @this, int index, Func<IDataReader, int, T> defaultValueFactory)
    {
        try
        {
            return (T) @this.GetValue(index);
        }
        catch
        {
            return defaultValueFactory(@this, index);
        }
    }

    /// <summary>
    ///     An IDataReader extension method that gets value as or default.
    /// </summary>
    /// <typeparam name="T">Generic type parameter.</typeparam>
    /// <param name="this">The @this to act on.</param>
    /// <param name="columnName">Name of the column.</param>
    /// <returns>The value as or default.</returns>
    public static T GetValueAsOrDefault<T>(this IDataReader @this, string columnName)
    {
        try
        {
            return (T) @this.GetValue(@this.GetOrdinal(columnName));
        }
        catch
        {
            return default(T);
        }
    }

    /// <summary>
    ///     An IDataReader extension method that gets value as or default.
    /// </summary>
    /// <typeparam name="T">Generic type parameter.</typeparam>
    /// <param name="this">The @this to act on.</param>
    /// <param name="columnName">Name of the column.</param>
    /// <param name="defaultValue">The default value.</param>
    /// <returns>The value as or default.</returns>
    public static T GetValueAsOrDefault<T>(this IDataReader @this, string columnName, T defaultValue)
    {
        try
        {
            return (T) @this.GetValue(@this.GetOrdinal(columnName));
        }
        catch
        {
            return defaultValue;
        }
    }

    /// <summary>
    ///     An IDataReader extension method that gets value as or default.
    /// </summary>
    /// <typeparam name="T">Generic type parameter.</typeparam>
    /// <param name="this">The @this to act on.</param>
    /// <param name="columnName">Name of the column.</param>
    /// <param name="defaultValueFactory">The default value factory.</param>
    /// <returns>The value as or default.</returns>
    public static T GetValueAsOrDefault<T>(this IDataReader @this, string columnName, Func<IDataReader, string, T> defaultValueFactory)
    {
        try
        {
            return (T) @this.GetValue(@this.GetOrdinal(columnName));
        }
        catch
        {
            return defaultValueFactory(@this, columnName);
        }
    }
}