В последнее время я нахожу, что я пишу методы выбора уровня доступа к данным, где весь код принимает эту общую форму:
public static DataTable GetSomeData( ... arguments)
{
string sql = " ... sql string here: often it 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;
}
Или вот так:
public static DataRow GetSomeSingleRecord( ... arguments)
{
string sql = " ... sql string here: often it 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;
}
Эти методы будут вызываться кодом бизнес-уровня, который затем преобразует базовый DataTable или DataRecord в строго типизированные бизнес-объекты, которые может использовать уровень представления.
Так как я использую аналогичный код несколько раз, я хочу убедиться, что этот код лучше всего. Итак, как его можно улучшить? И стоит ли пытаться переместить общий код из этого метода в свой собственный. Если да, то каким будет выглядеть этот метод (в частности, для передачи коллекции SqlParameter)?