C# 如何重构这两种方法

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)

嗨,我有两种方法,比如,还有三种方法没有提到

我如何重构这些

方法1:

方法2:

有人知道我如何重构这两个方法吗

我有三种类似的方法,但唯一的区别是sql查询


如果所有方法风格之间的唯一区别是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);
       }