我有两个功能,我想结合使用泛型。如何使用DRY主体重构此代码?
static public DataTable GetDataTable(SqlParameterHash parameters, string sql,
string connectionString, CommandType commandType = CommandType.StoredProcedure)
{
var da = new SqlDataAdapter(sql, connectionString);
da.SelectCommand.CommandType = commandType;
da.SelectCommand.CommandTimeout = 0;
foreach (SqlParameter Parameter in parameters)
{ da.SelectCommand.Parameters.Add(Parameter); }
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
static public DataSet GetDataSet(SqlParameterHash parameters, string sql,
string connectionString, CommandType commandType = CommandType.StoredProcedure)
{
var da = new SqlDataAdapter(sql, connectionString);
da.SelectCommand.CommandType = commandType;
da.SelectCommand.CommandTimeout = 0;
foreach (SqlParameter Parameter in parameters)
{ da.SelectCommand.Parameters.Add(Parameter); }
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
这是我想出了:
static private T GetDataX<T>(T container
, SqlParameterHash parameters, string sql, string connectionString
, CommandType commandType = CommandType.StoredProcedure
) where T : System.ComponentModel.MarshalByValueComponent, new()
{
var da = new SqlDataAdapter(sql, connectionString);
da.SelectCommand.CommandType = commandType;
da.SelectCommand.CommandTimeout = 0;
foreach (SqlParameter Parameter in parameters)
{ da.SelectCommand.Parameters.Add(Parameter); }
da.Fill(container); // ERROR: cannot convert from 'T' to 'System.Data.DataTable'
return container;
}
,但我得到上述错误。
如果我将容器更改为动态,它将进行编译。但是,这似乎是一个黑客。 什么是合并这两个功能的正确方法?
强制性评论:关闭你的连接。或者更好:甚至不要打开它们,让'da.Fill()'管理它。 –
优秀的建议。我编辑了上面的代码,让da.Fill()管理连接。 – Garfield