C# 如何重构这两种方法
嗨,我有两种方法,比如,还有三种方法没有提到 我如何重构这些 方法1: 方法2: 有人知道我如何重构这两个方法吗 我有三种类似的方法,但唯一的区别是sql查询C# 如何重构这两种方法,c#,.net,winforms,refactoring,C#,.net,Winforms,Refactoring,嗨,我有两种方法,比如,还有三种方法没有提到 我如何重构这些 方法1: 方法2: 有人知道我如何重构这两个方法吗 我有三种类似的方法,但唯一的区别是sql查询 如果所有方法风格之间的唯一区别是SQL代码,那么为每个方法创建一个公共方法,并让所有方法调用一个具有公共代码的私有方法,传递正确的SQL字符串 private DataTable PerformQuery(string sql, System.DateTime startdate, System.DateTime enddate)
如果所有方法风格之间的唯一区别是SQL代码,那么为每个方法创建一个公共方法,并让所有方法调用一个具有公共代码的私有方法,传递正确的SQL字符串
private DataTable PerformQuery(string sql, System.DateTime startdate, System.DateTime enddate)
{
var tblvisits = new DataTable();
using (var conn = new MySql.Data.MySqlClient.MySqlConnection(connectionstring))
{
conn.Open();
var cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn);
var ds = new DataSet();
var parameter = new MySql.Data.MySqlClient.MySqlParameter("@startdate", MySql.Data.MySqlClient.MySqlDbType.DateTime);
parameter.Direction = ParameterDirection.Input;
parameter.Value = startdate.ToString(dateformat);
cmd.Parameters.Add(parameter);
var parameter2 = new MySql.Data.MySqlClient.MySqlParameter("@enddate", MySql.Data.MySqlClient.MySqlDbType.DateTime);
parameter2.Direction = ParameterDirection.Input;
parameter2.Value = enddate.ToString(dateformat);
cmd.Parameters.Add(parameter2);
var da = new MySql.Data.MySqlClient.MySqlDataAdapter(cmd);
da.Fill(ds);
try
{
tblvisits = ds.Tables[0];
}
catch
{
tblvisits = null;
}
}
return tblvisits;
}
然后对于公众:
public DataTable Sales(System.DateTime startdate, System.DateTime enddate)
{
const string sql = @"SELECT memberAccTran_Source as Category, sum(memberAccTran_Value) as Value
FROM memberacctrans
WHERE memberAccTran_DateTime BETWEEN @startdate AND @enddate
GROUP BY memberAccTran_Source";
return PerformQuery(sql, startdate, enddate);
}
public DataTable GetVisits(System.DateTime startdate , System.DateTime enddate)
{
const string sql = @"SELECT CONCAT(UPPER(SUBSTRING(visit_Status, 1, 1)), SUBSTRING(visit_Status FROM 2)) as Status, COUNT('x') AS Visits
FROM visits
WHERE visit_Date BETWEEN @startdate AND @enddate
GROUP BY visit_Status";
return PerformQuery(sql, startdate, enddate);
}
然后对其他人重复。正如您所指出的,这是假设所有参数都是相同的,唯一的区别是正在运行的SQL。只需将SQL查询放在方法之外,并将其作为参数传递。您觉得需要重构它们的原因是什么。以及你想要达到的目标。
private DataTable PerformQuery(string sql, System.DateTime startdate, System.DateTime enddate)
{
var tblvisits = new DataTable();
using (var conn = new MySql.Data.MySqlClient.MySqlConnection(connectionstring))
{
conn.Open();
var cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn);
var ds = new DataSet();
var parameter = new MySql.Data.MySqlClient.MySqlParameter("@startdate", MySql.Data.MySqlClient.MySqlDbType.DateTime);
parameter.Direction = ParameterDirection.Input;
parameter.Value = startdate.ToString(dateformat);
cmd.Parameters.Add(parameter);
var parameter2 = new MySql.Data.MySqlClient.MySqlParameter("@enddate", MySql.Data.MySqlClient.MySqlDbType.DateTime);
parameter2.Direction = ParameterDirection.Input;
parameter2.Value = enddate.ToString(dateformat);
cmd.Parameters.Add(parameter2);
var da = new MySql.Data.MySqlClient.MySqlDataAdapter(cmd);
da.Fill(ds);
try
{
tblvisits = ds.Tables[0];
}
catch
{
tblvisits = null;
}
}
return tblvisits;
}
public DataTable Sales(System.DateTime startdate, System.DateTime enddate)
{
const string sql = @"SELECT memberAccTran_Source as Category, sum(memberAccTran_Value) as Value
FROM memberacctrans
WHERE memberAccTran_DateTime BETWEEN @startdate AND @enddate
GROUP BY memberAccTran_Source";
return PerformQuery(sql, startdate, enddate);
}
public DataTable GetVisits(System.DateTime startdate , System.DateTime enddate)
{
const string sql = @"SELECT CONCAT(UPPER(SUBSTRING(visit_Status, 1, 1)), SUBSTRING(visit_Status FROM 2)) as Status, COUNT('x') AS Visits
FROM visits
WHERE visit_Date BETWEEN @startdate AND @enddate
GROUP BY visit_Status";
return PerformQuery(sql, startdate, enddate);
}