Como melhorar o método de seleção da camada de acesso a dados

Ultimamente, me pego escrevendo métodos de seleção da camada de acesso a dados em que todo o código assume esta forma geral:

public static DataTable GetSomeData( ... arguments)
{
    string sql = " ... sql string here:  often it's just a stored procedure name ... ";

    DataTable result = new DataTable();

    // GetOpenConnection() is a private method in the class: 
    // it manages the connection string and returns an open and ready connection
    using (SqlConnection cn = GetOpenConnection())
    using (SqlCommand cmd = new SqlCommand(sql, cn))
    {
        // could be any number of parameters, each with a different type
        cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 50).Value = param1; //argument passed to function

        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            result.Load(rdr);
        }
    }

    return result;
}

Ou assim:

public static DataRow GetSomeSingleRecord( ... arguments)
{
    string sql = " ... sql string here:  often it's just a stored procedure name ... ";

    DataTable dt = new DataTable();

    // GetOpenConnection() is a private method in the class: 
    // it manages the connection string and returns an open and ready connection
    using (SqlConnection cn = GetOpenConnection())
    using (SqlCommand cmd = new SqlCommand(sql, cn))
    {
        // could be any number of parameters, each with a different type
        cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 50).Value = param1; //argument passed to function

        using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SingleRow))
        {
            dt.Load(rdr);
        }
    }

    if (dt.Rows.Count > 0)
         return dt.Rows[0];
    return null;
}

Esses métodos seriam chamados pelo código da camada de negócios que, em seguida, converte o DataTable ou DataRecord base em objetos de negócios fortemente tipados que a camada de apresentação pode usar.

Como estou usando código semelhante repetidamente, quero garantir que esse código seja o melhor possível. Então, como isso pode ser melhorado? E vale a pena tentar mover o código comum disso para seu próprio método. Em caso afirmativo, como seria esse método (especificamente no que diz respeito à passagem de uma coleção SqlParameter)?

questionAnswers(7)

yourAnswerToTheQuestion