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)?