Как я могу рефакторинг этих двух методов - PullRequest
0 голосов
/ 08 сентября 2011

Привет у меня есть два метода, как и еще три метода (не упоминать в этом вопросе) ..

как я могу рефакторинг этих ..

Метод 1 :

   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";

         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;
     }

метод 2: :

       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";

         var memacctvalues = 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
             {
                 memacctvalues = ds.Tables[0];

             }
             catch
             {
                 memacctvalues = null;
             }
         }
         return memacctvalues;         
     }

Кто-нибудь может представить, как я могу провести рефакторинг этих двух методов

(

У меня есть три метода, больше похожих на это, но единственное отличие - это SQL-запрос. ) * * Тысяча двадцать-один

Ответы [ 2 ]

6 голосов
/ 08 сентября 2011

Если единственное различие между всеми разновидностями метода - это код 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.

1 голос
/ 08 сентября 2011

Просто поместите SQL-запросы вне метода и передайте его в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...